我有一门课我在使用__set
。因为我不希望它设置任何东西,所以我有一个批准的变量数组,它会在它实际设置一个类属性之前进行检查。php:在某些情况下避免__get?
但是,在构造上,我想要__construct
方法来设置几个类属性,其中一些属性不在允许列表中。因此,当构建发生时,我做了$this->var = $value
,我当然得到我的例外,我不允许设置该变量。
我能以某种方式解决这个问题吗?
我有一门课我在使用__set
。因为我不希望它设置任何东西,所以我有一个批准的变量数组,它会在它实际设置一个类属性之前进行检查。php:在某些情况下避免__get?
但是,在构造上,我想要__construct
方法来设置几个类属性,其中一些属性不在允许列表中。因此,当构建发生时,我做了$this->var = $value
,我当然得到我的例外,我不允许设置该变量。
我能以某种方式解决这个问题吗?
声明类成员:
class Blah
{
private $imAllowedToExist; // no exception thrown because __set() wont be called
}
声明的类成员是你最好的选择。如果这不起作用,你可以有一个开关($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.");
}
}
}