php: избегать __get в определенных обстоятельствах? - PullRequest
3 голосов
/ 18 марта 2010

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

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

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

Ответы [ 2 ]

4 голосов
/ 18 марта 2010

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

class Blah
{
   private $imAllowedToExist;   // no exception thrown because __set() wont be called
}
1 голос
/ 18 марта 2010

Объявление членов класса - ваш лучший выбор. Если это не сработает, у вас может быть переключатель ($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." );
        }
    }
}
...