详解在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 相关文章推荐
NOT NULL 和NULL
Jan 15 PHP
QueryPath PHP 中的jQuery
Apr 11 PHP
php下使用iconv需要注意的问题
Nov 20 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
Jun 13 PHP
一个简洁的PHP可逆加密函数(分享)
Jun 06 PHP
深入PHP5中的魔术方法详解
Jun 17 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
Jun 21 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
CI框架使用composer安装的依赖包步骤与方法分析
Nov 21 PHP
php中bind_param()函数用法分析
Mar 28 PHP
Laravel validate error处理,ajax,json示例
Oct 25 PHP
详解no input file specified 三种解决方法
Nov 29 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
自己做矿石收音机
2021/03/02 无线电
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
php ajax 静态分页过程形式
2011/09/02 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
做网页的一些技巧
2007/02/01 Javascript
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
js调用css属性写法
2013/09/21 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
2014/08/24 Javascript
javascript常用方法汇总
2014/12/02 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
[01:16:28]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第二场 2月23日
2021/03/11 DOTA
python通过ssh-powershell监控windows的方法
2015/06/02 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
python中提高pip install速度
2020/02/14 Python
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
中学老师的自我评价
2013/11/07 职场文书
中年人生感言
2014/02/04 职场文书
农业项目建议书
2014/08/25 职场文书
小学中等生评语
2014/12/29 职场文书
员工工作能力评语
2014/12/31 职场文书
放牛班的春天观后感
2015/06/01 职场文书
培训简讯范文
2015/07/20 职场文书
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python