现在的位置: 主页 > 公司荣誉 > 文章列表

yii2.0 行为

作者:北京东方雨泽科技有限公司 来源:www.dfyz6789.com 发布时间:2017-09-04 18:16:21
 

yii2.0 行为

使用行为(behavior)可以在不修改现有类的情况下,对类的功能进行扩充。 通过将行为绑定到一个类,可以使类具有行为本身所定义的属性和方法,就好像类本来就有这些属性和方法一样。 而且不需要写一个新的类去继承或包含现有类。

Yii中的行为,其实是yii\base\Behavior类的实例, 只要将一个Behavior实例绑定到任意的yii\base\Component实例上, 这个Component就可以拥有该Behavior所定义的属性和方法了。而如果将行为与事件关联起来,可以玩的花样就更多了。

但有一点需要注意,Behavior只能与Component类绑定。 他们是天生的一对,爱情不是你想买,想买就能买的,必要的物质是少不了的,奋斗吧少年。 所以,如果你写了一个类,需要使用到行为,那么就果断地继承自yii\base\Component。

同时,行为单独靠Behavior一方是实现不了的,就好像爱情不是一厢情愿。 为了支持Behavior,Yii对于yii\base\Component也进行了精心设计,这两者共同配合,才有了神奇的行为。

使用行为

一个绑定了行为的类,表现起来是这样的:

// Step 1: 定义一个将绑定行为的类 class MyClass extends yii\base\Component { // 空的 } // Step 2: 定义一个行为类,他将绑定到MyClass上 class MyBehavior extends yii\base\Behavior { // 行为的一个属性 public $property1 = 'This is property in MyBehavior.'; // 行为的一个方法 public function method1() { return 'Method in MyBehavior is called.'; } } $myClass = new MyClass(); $myBehavior = new MyBehavior(); // Step 3: 将行为绑定到类上 $myClass->attachBehavior('myBehavior', $myBehavior); // Step 4: 访问行为中的属性和方法,就和访问类自身的属性和方法一样 echo $myClass->property1; echo $myClass->method1();

上面的代码你不用全都看懂,虽然你可能已经用脚趾头猜到了这些代码的意思, 但这里你只需要记住行为中的属性和方法可以被所绑定的类像访问自身的属性和方法一样直接访问就OK了。 代码中,$myClass是没有property1method()成员的。这俩是$myBehavior的成员。 但是,通过attachBehavior()将行为绑定到对象之后,$myCalss就好像练成了吸星大法、化功大法,表现的财大气粗,将别人的属性和方法都变成了自己的。

另外,从上面的代码中,你还要掌握使用行为的大致流程:

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

namespace app\Components; use yii\db\ActiveRecord; use yii\base\Behavior; class MyBehavior extends Behavior { // 重载events() 使得在事件触发时,调用行为中的一些方法 public function events() { // 在EVENT_BEFORE_VALIDATE事件触发时,调用成员函数 beforeValidate return [ ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate', ]; } // 注意beforeValidate 是行为的成员函数,而不是绑定的类的成员函数。 // 还要注意,这个函数的签名,要满足事件handler的要求。 public function beforeValidate($event) { // ... } }

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网络推广 http://www.feimao666.com

  • 上一篇:站长如何判断网站被黑以及如何应对防御
  • 下一篇:最后一页
  •