- 从 yii\base\Component 派生自己的类,以便使用行为;
- 从 yii\base\Behavior 派生自己的行为类,里面定义行为涉及到的属性、方法;
- 将Component和Behavior绑定起来;
- 像使用Component自身的属性和方法一样,尽情使用行为中定义的属性和方法。
行为的要素
我们提到了行为只是 yii\base\Behavior 类的实例。 那么这个类究竟有什么秘密呢?其实说破了也没有什么的他只是一个简单的封装而已,非常的简单:
class Behavior extends Object { // 指向行为本身所绑定的Component对象 public $owner; // Behavior 基类本身没用,主要是子类使用,重载这个函数返回一个数组表 // 示行为所关联的事件 public function events() { return []; } // 绑定行为到 $owner public function attach($owner) { ... ... } // 解除绑定 public function detach() { ... ... } }
这就是Behavior的全部代码了,是不是很简单?Behavior类的要素的确很简单:
- $owner 成员变量,用于指向行为的依附对象;
events()
用于表示行为所有要响应的事件;attach()
用于将行为与Component绑定起来;deatch()
用于将行为从Component上解除。
下面分别进行讲解。
行为的依附对象
yii\base\Behavior::$owner
指向的是Behavior实例本身所依附的对象。这是行为中引用所依附对象的唯一手段了。 通过这个 $owner ,行为才能访问所依附的Component,才能将本身的方法作为事件handler绑定到Component上。
$owner 由 yii\base\Behavior::attach()
进行赋值。 也就是在将行为绑定到某个Component时, $owner 就已经名花有主了。 一般情况下,不需要你自己手动去指定 $owner 的值, 在调用 yii\base\Componet::attachBehavior()
将行为与对象绑定时, Component会自动地将 $this 作为参数,调用 yii\base\Behavior::attach()
。
有一点需要格外注意,由于行为从本质来讲是一个PHP类,其方法就是类方法,就是成员函数。 所以,在行为的方法中, $this 引用的是行为本身, 试图通过 $this 来访问行为所依附的Component是行不通的。 正确的方法是通过 yii\base\Behavior::$owner
来访问Component。
行为所要响应的事件
行为与事件结合后,可以在不对类作修改的情况下,补充类在事件触发后的各种不同反应。 为此,只需要重载yii\base\Behavior::events()
方法,表示这个行为将对类的何种事件进行何种反馈即可: