在Yii2中在运行时声明类属性

时间:2015-04-16 08:46:24

标签: php reflection yii2

我有一个从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技巧?

3 个答案:

答案 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();
}