Yii框架的事件(Event)和行为(Behavior)
2013-09-11 16:35
405 查看
一、Yii事件机制(Event):
<?php
class TestController extends CController
{
//添加onclick事件
public function onClick($event)
{
$this->raiseEvent('onClick',$event);
}
//页面载入自动调用,为onclick事件绑定函数 "Click"
public function init()
{
$this->attachEventHandler('onClick',array($this,'Click'));
}
//onClick事件对应的方法
public function Click()
{
echo "This message comes from Event Click!";
echo "<br>";
}
//使用到事件的页面
public function acrtionLogin()
{
//调用事件onclick
if($this->hasEventHandler('onClick'))
{
$this->onClick(new CEvent());
}
//页面其他正常逻辑
echo "this is page login!";
}
}
?>
##注:在访问页面login的时候会输出:
This message comes from Event Click!
this is page login!
##分析:YII事件机制其实就是采用了设计模式中的“观察者模式”,当对象的成员变量发生变化的时候会通知另一个对象做出相应的改变。
事件机制分为这么几个步骤:1.添加事件,也就是上例中的方法1,2.为事件绑定方法,也就是上例中init()方法里面那句代码,
3.触发事件,也就是login方法中的那个if语句中的那句代码。
####################################################################
####################################################################
二、Yii的行为(Behavior):
<?php
class TestController extends CController
{
public function init()
{
$this->attachBehavior('mybehavior',new MyBehavior());
}
public function actionLogin(){
echo $this->name;
}
}
class MyBehavior extends CBehavior
{ private $_name="No1";
public function getName()
{
return $this->_name;
}
public function setName($value)
{
$this->_name=$value;
}
}
?>
##注:访问test的login页面,输出 "No1";
##分析:一般来说为一个类添加属性和方法的方式通常是2种,第一是直接在类里面做修改,
第二种是使用扩展类。实际开发中当然用的最多的是第二种。这也符合设计原则中的封闭原则。
然而这种方式也不是十全十美的,有时候一个属性或者方法只有在特定的环境中才会用到,
如果我们因此为其做了扩展类或者在现有的类中添加,是相当浪费的。
Yii框架使用的Behavior挂载方式来实现对类的扩展。说白了也就是类的组合。分析观察Yii所有类的
基类CComponent可以发现,此类中除了一些魔术方法之外,有2个私有属性 "$_m"和"$_e";其中$_m是用来存放
添加的Behavior对象,$_e是用来存放注册的事件对象Event。此类中的魔术方法会寻找扩展类中以get和set打头的方法,
上面这个例子就是一个很好的说明,当在login中访问属性name的时候,TestController并没有name属性,但是TestController
挂载了MyBehavior对象,那就会去$_m中的MyBehavior对象中寻找name,还是找不到,就会触发__get()这个魔术方法,此方法中
会搜寻有没有getName()这个方法,如果有就调用之。这也是一些比较主流的框架喜欢采用的方式。
关于CComponent的详细介绍:http://www.yiiframework.com/forum/index.php?/topic/17072-ccomponent%E5%9F%BA%E7%A1%80%E7%B1%BB/
<?php
class TestController extends CController
{
//添加onclick事件
public function onClick($event)
{
$this->raiseEvent('onClick',$event);
}
//页面载入自动调用,为onclick事件绑定函数 "Click"
public function init()
{
$this->attachEventHandler('onClick',array($this,'Click'));
}
//onClick事件对应的方法
public function Click()
{
echo "This message comes from Event Click!";
echo "<br>";
}
//使用到事件的页面
public function acrtionLogin()
{
//调用事件onclick
if($this->hasEventHandler('onClick'))
{
$this->onClick(new CEvent());
}
//页面其他正常逻辑
echo "this is page login!";
}
}
?>
##注:在访问页面login的时候会输出:
This message comes from Event Click!
this is page login!
##分析:YII事件机制其实就是采用了设计模式中的“观察者模式”,当对象的成员变量发生变化的时候会通知另一个对象做出相应的改变。
事件机制分为这么几个步骤:1.添加事件,也就是上例中的方法1,2.为事件绑定方法,也就是上例中init()方法里面那句代码,
3.触发事件,也就是login方法中的那个if语句中的那句代码。
####################################################################
####################################################################
二、Yii的行为(Behavior):
<?php
class TestController extends CController
{
public function init()
{
$this->attachBehavior('mybehavior',new MyBehavior());
}
public function actionLogin(){
echo $this->name;
}
}
class MyBehavior extends CBehavior
{ private $_name="No1";
public function getName()
{
return $this->_name;
}
public function setName($value)
{
$this->_name=$value;
}
}
?>
##注:访问test的login页面,输出 "No1";
##分析:一般来说为一个类添加属性和方法的方式通常是2种,第一是直接在类里面做修改,
第二种是使用扩展类。实际开发中当然用的最多的是第二种。这也符合设计原则中的封闭原则。
然而这种方式也不是十全十美的,有时候一个属性或者方法只有在特定的环境中才会用到,
如果我们因此为其做了扩展类或者在现有的类中添加,是相当浪费的。
Yii框架使用的Behavior挂载方式来实现对类的扩展。说白了也就是类的组合。分析观察Yii所有类的
基类CComponent可以发现,此类中除了一些魔术方法之外,有2个私有属性 "$_m"和"$_e";其中$_m是用来存放
添加的Behavior对象,$_e是用来存放注册的事件对象Event。此类中的魔术方法会寻找扩展类中以get和set打头的方法,
上面这个例子就是一个很好的说明,当在login中访问属性name的时候,TestController并没有name属性,但是TestController
挂载了MyBehavior对象,那就会去$_m中的MyBehavior对象中寻找name,还是找不到,就会触发__get()这个魔术方法,此方法中
会搜寻有没有getName()这个方法,如果有就调用之。这也是一些比较主流的框架喜欢采用的方式。
关于CComponent的详细介绍:http://www.yiiframework.com/forum/index.php?/topic/17072-ccomponent%E5%9F%BA%E7%A1%80%E7%B1%BB/
相关文章推荐
- YII 事件event和行为Behavior
- YII框架分析笔记2:组件和事件行为管理
- Axure RP Pro - 相关问题 - master主控文档的behavior行为是custom widget自定义部件时丢失raised event可触发事件
- Yii框架 Event 和 Behavior理解
- YII框架分析笔记2:组件和事件行为管理
- Yii框架组件和事件行为管理详解
- Yii框架中行为Behavior的概念
- 深入解析PHP的Yii框架中的event事件机制
- 事件回调 和通知方式的总结(EventBus框架的使用)
- PHP的Yii框架中行为的定义与绑定方法讲解
- 简单的Java Event-事件框架
- event.preventDefault() 取消事件的默认行为。
- 详解在PHP的Yii框架中使用行为Behaviors的方法
- 清晰理解Yii的事件和行为
- 深入理解Yii2.0 (3)行为(Behavior)
- YII事件EVENT示例
- 深入理解 Yii2.0 - 属性,事件,行为。
- PHP的Yii框架中移除组件所绑定的行为的方法
- 详解在PHP的Yii框架中使用行为Behaviors的方法
- Actor-ES框架:Ray--事件(Event)编写说明