php:在某些情况下避免__get?

时间:2010-03-18 17:11:56

标签: php get magic-methods

我有一个班级,我正在使用__set。因为我不希望它只设置任何东西,所以我在它实际设置类属性之前检查了一系列已批准的变量。

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

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

2 个答案:

答案 0 :(得分:4)

声明班级成员:

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

答案 1 :(得分: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." );
        }
    }
}