3

我有一堂课,我正在使用__set. 因为我不希望它设置任何东西,所以我有一个经过批准的变量数组,它会在实际设置类属性之前对其进行检查。

但是,在构造时,我希望该__construct方法设置几个类属性,其中一些不在批准的列表中。因此,当构造发生时,$this->var = $value我当然会得到我不允许设置该变量的异常。

我能以某种方式解决这个问题吗?

4

2 回答 2

4

声明类成员:

class Blah
{
   private $imAllowedToExist;   // no exception thrown because __set() wont be called
}
于 2010-03-18T17:13:54.560 回答
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." );
        }
    }
}
于 2010-03-18T17:28:38.200 回答