`
月影无痕
  • 浏览: 1008844 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Yii的事件机制原理及应用分析

 
阅读更多

 

Yii中的事件机制原理及应用分析

 

YII的事件机制,是其比较独特之处,合理使用好事件机制,会使各个组件之间的耦合更为松散,利于团体协作开发。

 

何时需要使用事件,如何给事件绑定事件处理函数,以及如何触发事件,与其它语言是有较大的差别的。例如Javascript中,可以使用

$(‘#id’).onclick(function() {});

方式给DOM元素绑定处理函数,当DOM元素上发生指定的事件(如click)时,将自动执行设定的函数。

 

若对本文有任何建议或是交流,请联系笔者zhangxugg@163.com

 

但是PHP是服务器端的脚本语言,就不存在自动触发事件之说,所以和Javascript对比,YII中的事件是需要手动触发的。一般来说,要实现YII组件的事件机制,需要以下几步:

 

1. 定义事件名称,其实就是级组件定义一个on开头的方法,其中的代码是固定的,如:
public function onBeginRequest($event){

$this->raiseEvent('onBeginRequest',$event);

}

即函数名与事件名是一致的。此步的作用就是将绑定在此事件上的处理函数逐个执行。

 

2. 给组件对象绑定事件处理函数

$component->attachEventHandler($name, $handler);

$component->onBeginRequest = $handler ;

 

yii支持一个事件绑定多个回调函数,上述的两个方法都会在已有的事件上增加新的回调函数,而不会覆盖已有回调函数。

 

$handler即是一个PHP回调函数,关于回调函数的形式,本文的最后会附带说明。

CLogRouter组件的init事件中,有以下代码:
Yii::app()->attachEventHandler('onEndRequest',array($this,'processLogs'));

 

这就是给CApplication对象的onEndRequest绑定了CLogRouter::processLogs()回调函数。而CApplication组件确实存在名为onEndRequest的方法(即onEndRequest事件),它之中的代码就是激活了相应的回调函数,即CLogRouter::processLogs()方法。所以从这里可以得出,日志的记录其实是发生在CApplication组件的正常退出时。

 

 

3. 在需要触发事件的时候,直接激活组件的事件,即调用事件即可,如:

比如CApplication组件的run方法中:
if($this->hasEventHandler('onBeginRequest'))

$this->onBeginRequest(new CEvent($this));

 

这样即触发了事件处理函数。如果没有第一行的判断,那么在调试模式下(YII_DEBUG常量被定义为true),会抛出异常,而在非调试模式下(YII_DEBUG常量定义为false或没有定义YII_DEBUG常量),则不会产生任何异常。

 

回调函数的形式:

1. 普通全局函数(内置的或用户自定义的)

call_user_func(print, $str);

 

2. 类的静态方法,使用数组形式传递
call_user_func(array(classNameprint),  $str );

 

3. 对象方法,使用数组形式传递

$obj = new className();

call_user_func(array($obj, print),  $str );

 

4. 匿名方法,类似javascript的匿名函数
call_user_func(function($i){echo $i++;},4);

 

或使用以下形式:
$s = function($i) {

    echo $i++;

};

call_user_func($s,4);

 

注意:PHP匿名函数是  5.3版本开始才有的特性

 

1
0
分享到:
评论
1 楼 phper08 2014-02-12  
$('#id').onclick(function() {});写错了,jquery的事件方法没有on,应为
$('#id').click(function() {});

相关推荐

Global site tag (gtag.js) - Google Analytics