2010-03-18 2 views
3

У меня есть класс, где я использую __set. Поскольку я не хочу, чтобы он устанавливал только что-либо, у меня есть массив утвержденных переменных, которые он проверяет, прежде чем он действительно установит свойство класса.php: избегать __get в определенных обстоятельствах?

Однако в конструкторе я хочу, чтобы метод __construct устанавливал несколько свойств класса, некоторые из которых не входят в утвержденный список. Поэтому, когда конструкция происходит, и я делаю $this->var = $value, я, конечно, получаю мое исключение, что мне не разрешено устанавливать эту переменную.

Могу ли я обойти это как-нибудь?

ответ

4

Объявляет члены класса:

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

Объявление членов класса является лучшим выбором. Если это не сработает, у вас может быть переключатель ($this->isInConstructor?), Который определяет, следует ли бросать ошибку.

С другой стороны, можно также использовать метод __get, а также метод __set и оба из них сопоставляется с обернутой библиотеки:

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."); 
     } 
    } 
} 
Смежные вопросы