- 从 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() 方法,表示这个行为将对类的何种事件进行何种反馈即可:
