你可能知道 Yii 使用面向对象重载 http://php.net/manual/en/language.oop5.overloading.php解析您的 AR 类属性。
您在这里需要做的事情与 Yii 内部所做的类似。
定义一个硬编码属性来存储所有自定义属性,如数组:$_data
该数据将是一个数组,并将保存您在运行时添加的所有属性。您可能需要像 Yii 那样通过覆盖魔术方法(setters、getters、isset)来挑战验证,首先从您的$_data
财产持有人。
您会在其中找到某种代码活动记录 http://code.google.com/p/yii/source/browse/tags/1.1.10/framework/db/ar/CActiveRecord.php寻找所有这些__XXX
类似的方法。
如果您将 AR 属性处理复制到您的自定义类,您将在您的级别上运行所有这些,并且当您的魔术方法无法解决它时,将回退到 Yii。
此外,我还会研究行为,因为您可以将许多常见功能委托给行为类。
组件行为的使用
一个组件支持mixin http://en.wikipedia.org/wiki/Mixin模式并可以附加一个或多个行为。行为是一个对象,其方法可以通过收集功能而不是专门化的方式由其附加组件“继承”(即正常的类继承)。一个组件可以附加多个行为,从而实现“多重继承”。
行为类必须实现IBehavior
界面。大多数行为都可以从CBehavior
基类。如果一个行为需要附加到一个模型,它也可以从C模型行为 http://www.yiiframework.com/doc/api/1.1/CModelBehavior or CActiveRecord行为 http://www.yiiframework.com/doc/api/1.1/CActiveRecordBehavior它实现了特定于模型的附加功能。
要使用行为,必须首先通过调用行为的attach()
方法。然后我们可以通过组件调用行为方法:
// $name uniquely identifies the behavior in the component
$component->attachBehavior($name,$behavior);
// test() is a method of $behavior
$component->test();
可以像访问组件的普通属性一样访问附加行为。例如,如果一个名为树的行为附加到一个组件,我们可以使用以下方法获取对此行为对象的引用:
$behavior=$component->tree;
// equivalent to the following:
// $behavior=$component->asa('tree');
可以暂时禁用行为,以便其方法无法通过组件使用。例如,
$component->disableBehavior($name);
// the following statement will throw an exception
$component->test();
$component->enableBehavior($name);
// it works now
$component->test();
附加到同一组件的两个行为可能具有相同名称的方法。在这种情况下,第一个附加行为的方法将优先。
与一起使用时events http://www.yiiframework.com/doc/guide/1.1/en/basics.component#component-event,行为更加强大。行为在附加到组件时,可以将其某些方法附加到组件的某些事件。通过这样做,行为有机会观察或更改组件的正常执行流程。
行为的属性也可以通过其附加的组件来访问。这些属性包括公共成员变量以及通过行为的 getter 和/或 setter 定义的属性。例如,如果某个行为具有名为 xyz 的属性,并且该行为附加到组件 $a。然后我们可以使用表达式$a->xyz
访问行为的属性。
更多阅读:
http://www.yiiframework.com/wiki/44/behaviors-events http://www.yiiframework.com/wiki/44/behaviors-events
http://www.ramirezcobos.com/2010/11/19/how-to-create-a-yii-behavior/ http://www.ramirezcobos.com/2010/11/19/how-to-create-a-yii-behavior/