2010-03-18 1 views
3

나는 __set을 사용하는 클래스를 가지고 있습니다. 아무 것도 설정하지 않기 때문에 클래스 속성을 실제로 설정하기 전에 확인하는 승인 된 변수 배열이 있습니다.php : 특정 상황에서 __get을 피 하시겠습니까?

그러나 construct에서는 __construct 메서드가 여러 클래스 속성을 설정하기를 원합니다. 그 중 일부는 승인 된 목록에 없습니다. 그래서 구조가 생길 때 나는 $this->var = $value을 수행합니다. 물론 그 변수를 설정할 권한이 없다는 예외가 생깁니다.

어떻게 든이 문제를 해결할 수 있습니까?

답변

4

선언 클래스 멤버 :

class Blah 
{ 
    private $imAllowedToExist; // no exception thrown because __set() wont be called 
} 
1

클래스 멤버를 선언하는 것은 당신의 최선의 방법이다. 그래도 문제가 해결되지 않으면 오류를 발생 시킬지 여부를 결정하는 스위치 ($this->isInConstructor?)를 사용할 수 있습니다.

class Foo 
{ 
    private $library;   
    private $trustedValues; 

    public function __construct(array $values) 
    { 
     $this->trustedValues = array('foo', 'bar', 'baz'); 
     $this->library = new stdClass(); 
     foreach($values as $key=>$value) 
     { 
      $this->library->$key = $value; 
     } 
    } 

    public function __get($key) 
    { 
     return $this->library->$key; 
    } 

    public function __set($key, $value) 
    { 
     if(in_array($key, $this->trustedValues)) 
     { 
      $this->library->$key = $value; 
     } 
     else 
     { 
      throw new Exception("I don't understand $key => $value."); 
     } 
    } 
} 
:

한편

, 당신은 또한 포장 라이브러리에 매핑 __get 방법뿐만 아니라 __set 방법을 사용하고 둘 다 가질 수