详解在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生成WAP页面
Oct 09 PHP
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
May 27 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
Apr 28 PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 PHP
PHP实现克鲁斯卡尔算法实例解析
Aug 22 PHP
php实现的树形结构数据存取类实例
Nov 29 PHP
php检索或者复制远程文件的方法
Mar 13 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 PHP
php图形jpgraph操作实例分析
Feb 22 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 PHP
实现laravel 插入操作日志到数据库的方法
Oct 11 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
Apache设置虚拟WEB
2006/10/09 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
php输出形式实例整理
2020/05/05 PHP
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
python 正则式使用心得
2009/05/07 Python
用Python编写一个国际象棋AI程序
2014/11/28 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
python实现石头剪刀布程序
2021/01/20 Python
python爬虫 线程池创建并获取文件代码实例
2019/09/28 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
如何通过python实现人脸识别验证
2020/01/17 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
介绍一下JNDI的基本概念
2013/07/26 面试题
建设投标担保书
2014/05/13 职场文书
大学生安全责任书
2014/07/25 职场文书
五好家庭事迹材料
2014/12/20 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
Android实现图片九宫格
2022/06/28 Java/Android