我有一个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有很多变量,并且最好不要为每个变量手动创建动态变量。有没有简单的方法/行为可以做到这一点?
答案 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。