详解在PHP的Yii框架中使用行为Behaviors的方法


Posted in PHP onMarch 18, 2016

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

// 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 是没有 property1 method() 成员的。这俩是 $myBehavior 的成员。 但是,通过 attachBehavior() 将行为绑定到对象之后, $myCalss 就好像练成了吸星大法、化功大法,表现的财大气粗,将别人的属性和方法都变成了自己的。

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

  • 从 yii\base\Component 派生自己的类,以便使用行为;
  • 从 yii\base\Behavior 派生自己的行为类,里面定义行为涉及到的属性、方法;
  • 将Component和Behavior绑定起来;
  • 像使用Component自身的属性和方法一样,尽情使用行为中定义的属性和方法。

使用行为,必须像前文描述的一样先把它附加到 yii\base\Component 类或其子类。一旦行为附加到组件,就可以直接使用它。

行为附加到组件后,可以通过组件访问一个行为的公共成员变量或 getter 和 setter 方法定义的属性:

// "prop1" 是定义在行为类的属性
echo $component->prop1;
$component->prop1 = $value;
类似地也可以调用行为的公共方法:

// foo() 是定义在行为类的公共方法
$component->foo();

如你所见,尽管 $component 未定义 prop1 和 foo() ,它们用起来也像组件自己定义的一样。

如果两个行为都定义了一样的属性或方法,并且它们都附加到同一个组件,那么首先附加上的行为在属性或方法被访问时有优先权。

附加行为到组件时的命名行为,可以使用这个名称来访问行为对象,如下所示:

$behavior = $component->getBehavior('myBehavior');

也能获取附加到这个组件的所有行为:

$behaviors = $component->getBehaviors();

移除行为

要移除行为,可以调用 yii\base\Component::detachBehavior() 方法用行为相关联的名字实现:

$component->detachBehavior('myBehavior1');

也可以移除全部行为:

$component->detachBehaviors();
PHP 相关文章推荐
PHP 和 MySQL 基础教程(一)
Oct 09 PHP
php面向对象全攻略 (五) 封装性
Sep 30 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
Dec 16 PHP
PHP 图像尺寸调整代码
May 26 PHP
php array_filter除去数组中的空字符元素
Jun 21 PHP
php中日期加减法运算实现代码
Dec 08 PHP
PHP实现生成唯一编号(36进制的不重复编号)
Jul 01 PHP
phpmyadmin中禁止外网使用的方法
Nov 04 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
深入讲解PHP的Yii框架中的属性(Property)
Mar 18 #PHP
Symfony2函数用法实例分析
Mar 18 #PHP
Symfony2联合查询实现方法
Mar 18 #PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 #PHP
Symfony2创建页面实例详解
Mar 18 #PHP
symfony2.4的twig中date用法分析
Mar 18 #PHP
Symfony2之session与cookie用法小结
Mar 18 #PHP
You might like
PHP图片库imagemagick安装方法
2014/09/23 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
关于JavaScript数组你所不知道的3件事
2016/08/24 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
python实现最长公共子序列
2018/05/22 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
python 最简单的实现适配器设计模式的示例
2020/06/30 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
联想C++笔试题
2012/06/13 面试题
英文版销售经理个人求职信
2013/11/20 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
学校督导评估方案
2014/06/10 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
2014年物流工作总结
2014/11/25 职场文书
捐款感谢信
2015/01/20 职场文书
签字仪式主持词
2015/07/03 职场文书
迎新年主持词
2015/07/06 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers
Android实现图片九宫格
2022/06/28 Java/Android