我有一个班级,我正在使用__set
。因为我不希望它只设置任何东西,所以我在它实际设置类属性之前检查了一系列已批准的变量。
但是,在构造方面,我希望__construct
方法设置多个类属性,其中一些属性不在批准的列表中。所以当构造发生时,我做$this->var = $value
,我当然得到了我的异常,我不允许设置该变量。
我可以以某种方式解决这个问题吗?
答案 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." );
}
}
}