详解在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及Zend Engine的线程安全模型分析
Nov 10 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
PHP面向对象程序设计之接口用法
Aug 20 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
PHP实现简单搜歌的方法
Jul 28 PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 PHP
浅析PHP中的i++与++i的区别及效率
Jun 15 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
Feb 03 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 PHP
PHP常用字符串函数用法实例总结
Jun 04 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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
PHP实现分页的一个示例
2006/10/09 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
javascript读取xml
2006/11/04 Javascript
页面中js执行顺序
2009/11/09 Javascript
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
javascript中节点的最近的相关节点访问方法
2013/03/20 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
Python中Class类用法实例分析
2015/11/12 Python
Python的Lambda函数用法详解
2019/09/03 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
销售人员自我评价怎么写
2013/09/19 职场文书
syb养殖创业计划书
2014/01/09 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
改革共识倡议书
2014/08/29 职场文书
领导班子奢靡之风查摆问题及整改措施
2014/09/27 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
经理岗位职责
2015/02/02 职场文书
加入学生会自荐书
2015/03/05 职场文书
年度考核表个人总结
2015/03/06 职场文书
七年级作文之雪景
2019/11/18 职场文书
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers