2010-03-18 111 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."); 
     } 
    } 
} 
相关问题