详解在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 相关文章推荐
将数字格式的计算结果转为汉字格式
Oct 09 PHP
php 8小时时间差的解决方法小结
Dec 22 PHP
php 输出双引号"与单引号'的方法
May 09 PHP
PHP session有效期session.gc_maxlifetime
Apr 20 PHP
php数据类型判断函数有哪些
Sep 23 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
PHP+APACHE实现网址伪静态
Feb 22 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
PHP防止图片盗用(盗链)的方法小结
Nov 11 PHP
浅谈PHP匿名函数和闭包
Mar 08 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 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实现图片旋转效果实例代码
2014/10/01 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
js 获取、清空input type="file"的值示例代码
2014/02/19 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
python自动化测试实例解析
2014/09/28 Python
Python中类型检查的详细介绍
2017/02/13 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
元旦趣味活动方案
2014/08/22 职场文书
2014年关工委工作总结
2014/11/17 职场文书
2014年村委会工作总结
2014/11/24 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
终止合同协议书范本
2016/03/22 职场文书
mysql主从复制的实现步骤
2021/10/24 MySQL