我有一个从Yii2的Model
扩展的类,我需要在构造函数中声明一个类的公共属性,但是我遇到了问题。
当我打电话
class Test extends \yii\base\Model {
public function __constructor() {
$test = "test_prop";
$this->{$test} = null; // create $this->test_prop;
}
}
根据我的理解,Yii尝试调用此属性的getter方法,当然不存在,所以我点击了this异常。
此外,当我实际执行$this->{$test} = null;
时,会调用this方法。
我的问题是:有没有办法以另一种方式声明一个类公共属性?也许一些Reflexion技巧?
答案 0 :(得分:2)
您可以覆盖getter / setter,例如:
class Test extends \yii\base\Model
{
private $_attributes = ['test_prop' => null];
public function __get($name)
{
if (array_key_exists($name, $this->_attributes))
return $this->_attributes[$name];
return parent::__get($name);
}
public function __set($name, $value)
{
if (array_key_exists($name, $this->_attributes))
$this->_attributes[$name] = $value;
else parent::__set($name, $value);
}
}
您还可以创建行为......
答案 1 :(得分:1)
好的,我来自Yii的一位开发者received help。这是答案:
class Test extends Model {
private $dynamicFields;
public function __construct() {
$this->dynamicFields = generate_array_of_dynamic_values();
}
public function __set($name, $value) {
if (in_array($name, $this->dynamicFields)) {
$this->dynamicFields[$name] = $value;
} else {
parent::__set($name, $value);
}
}
public function __get($name) {
if (in_array($name, $this->dynamicFields)) {
return $this->dynamicFields[$name];
} else {
return parent::__get($name);
}
}
}
请注意,我使用in_array
代替array_key_exists
,因为dynamicFields
数组是普通数组,而不是关联数组。
答案 2 :(得分:0)
尝试在init方法中设置变量。
像这样:
public function init() {
$test = "test_prop";
$this->{$test} = null; // create $this->test_prop;
parent::init();
}