在yii2中创建动态类变量

时间:2016-01-14 10:30:31

标签: php oop yii2

我有一个ActiveRecord类,我需要在其中包含某种动态变量。

应为每个现有变量创建动态变量。例如,如果我的班级中有一个变量$ test,那么它也应该有$ testDyn。

示例:

class User extends ActiveRecord
{
    public $name;
    public $age;
    public $address;

    /**
     * dynamic vars
     */
    public $nameDyn;
    public $ageDyn;
    public $addressDyn;

    public function tableName()
    {
        return 'user';
    }
    ...
}

有ActiveRecords有很多变量,并且最好不要为每个变量手动创建动态变量。有没有简单的方法/行为可以做到这一点?

1 个答案:

答案 0 :(得分:3)

您可以为这些目的创建自定义行为,并为每个需要的模型附加。

对于属性,您可以通过行为配置通过参数显式指定它,或使用以下内容:

$reflect = new ReflectionClass(new YourClass());
$props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC);

有更多信息和示例here

您还可以使用一些命名约定。

对于动态属性,您可以在行为中覆盖__get()魔术方法。请参阅here

Yii2示例(摘自框架贡献者之一Paul Klimov的yii2tech/ar-linkmany行为):

/**
 * PHP getter magic method.
 * This method is overridden so that relation attribute can be accessed like property.
 *
 * @param string $name property name
 * @throws UnknownPropertyException if the property is not defined
 * @return mixed property value
 */
public function __get($name)
{
    try {
        return parent::__get($name);
    } catch (UnknownPropertyException $exception) {
        if ($name === $this->relationReferenceAttribute) {
            return $this->getRelationReferenceAttributeValue();
        }
        throw $exception;
    }
}

要了解有关行为概念的更多信息,请参阅官方文档部分Behaviors