개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.06.06 02:32

ReflectionProperty::setValue() 메서드 사용법에 대한 질문

목록
  • 크래시헌터 오래 전 2025.06.06 02:32 인기
  • 151
    1
제가 ReflectionProperty::setValue() 메서드를 사용하여 객체의 속성을 변경하려고 합니다. 하지만, setValue() 메서드를 사용할 때는 반드시 어떤 조건을 충족해야 하는지 궁금합니다.

설명해주실 수 있나요?

예를 들어, 다음 코드를 보시면 어떤 문제가 있는지 알 수 있을까요?

php

class Person {

    public $name;

    public $age;



    public function __construct($name, $age) {

        $this->name = $name;

        $this->age = $age;

    }

}



$person = new Person('John', 30);



$reflection = new ReflectionClass($person);

$property = $reflection->getProperty('age');



$property->setAccessible(true);

$property->setValue($person, 40);



위 코드에서 $property->setValue() 메서드를 사용할 때는 어떤 조건을 충족해야 하는지 알려주세요.

    댓글목록

    profile_image
    나우호스팅  오래 전



    ReflectionProperty::setValue() 메서드를 사용할 때는 다음과 같은 조건을 충족해야 합니다.

    1. 속성이 읽기/쓰기 가능해야 합니다.: 속성이 private, protected, 또는 readonly라면 setValue() 메서드를 사용할 수 없습니다. 따라서 setAccessible(true) 메서드를 사용하여 속성을 읽기/쓰기 가능하게 설정해야 합니다.
    2. 속성이 존재해야 합니다.: 속성이 존재하지 않으면 setValue() 메서드를 사용할 수 없습니다.
    3. 속성이 객체의 속성이여야 합니다.: setValue() 메서드는 객체의 속성을 변경할 때 사용됩니다. 따라서 속성이 객체의 속성이여야 합니다.
    4. 속성의 타입이 일치해야 합니다.: setValue() 메서드는 속성의 타입을 확인하지 않습니다. 그러나 속성의 타입이 일치하지 않으면 프로그램이 예상치 못한 동작을 할 수 있습니다.

    위 코드에서 문제는 속성이 private이기 때문입니다. Person 클래스의 age 속성은 private이므로 ReflectionProperty::setValue() 메서드를 사용할 수 없습니다. 따라서 setAccessible(true) 메서드를 사용하여 속성을 읽기/쓰기 가능하게 설정해야 합니다.

    #hostingforum.kr
    php
    
    $property->setAccessible(true);
    
    


    이 코드를 추가하면 setValue() 메서드를 사용할 수 있습니다.

    #hostingforum.kr
    php
    
    $property->setValue($person, 40);
    
    


    이러한 조건을 충족하면 ReflectionProperty::setValue() 메서드를 사용하여 객체의 속성을 변경할 수 있습니다.

    2025-06-06 02:33

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 37,368건 / 7 페이지

검색

게시물 검색