详解在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分页显示制作详细讲解
Oct 09 PHP
我用php+mysql写的留言本
Oct 09 PHP
使PHP自定义函数返回多个值
Nov 26 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
Apr 07 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 PHP
php json_encode()函数返回json数据实例代码
Oct 10 PHP
以文件形式缓存php变量的方法
Jun 26 PHP
PHP实现的memcache环形队列类实例
Jul 28 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
Yii2.0 RESTful API 基础配置教程详解
Dec 26 PHP
深入理解PHP+Mysql分布式事务与解决方案
Dec 03 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实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
jQuery 白痴级入门教程
2009/11/11 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
python使用生成器实现可迭代对象
2018/03/20 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
pandas数据处理进阶详解
2019/10/11 Python
python的scipy实现插值的示例代码
2019/11/12 Python
内部类的定义、种类以及优点
2013/10/16 面试题
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
辞职离别感言
2015/08/04 职场文书
2016教师国培研修感言
2015/12/08 职场文书
企业团队精神心得体会
2016/01/19 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
Python中request的基本使用解决乱码问题
2022/04/12 Python