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(‘className’, ‘print’), $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版本开始才有的特性
相关推荐
YII 多种缓存机制的运用 如文件缓存内存缓存 动态缓存等
yii2.0基础和高级应用程序模板两个,不想使用composer安装yii2.0的,就直接下载这个用吧
Yii 2和PHP Web应用程序开发
主要介绍了Yii框架组件的事件机制原理与用法,结合实例形式分析了Yii框架组件的事件机制相关概念、原理、用法及操作注意事项,需要的朋友可以参考下
YII框架应用
yii框架源码分析
Yii2的基本应用程序模板 yii-basic-app-2.0.12
去返网分享yii权限管理,yii权限,以及函数的讲解分析
Yii2的高级应用程序模板yii-advanced-app-2.0.12.tgz
php yii 源码分析
文件结构 程序结构及配置 入口文件index php流程 CApplication构造流程 Request组件初始化 Run 方法流程 Yii核心参考
Yii_PHP_框架源码分析 Yii_PHP_框架源码分析 Yii_PHP_框架源码分析 Yii_PHP_框架源码分析
很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架
yii2-easy-wechat:应用于yii2的WeChatSDK
yii2.0高级应用程序模板,不想使用composer安装yii2.0的,就直接下载这个用吧
2本yii方面的书,使用yii敏捷开发web应用, cookbook, 都是初学者必备
YII框架源码分析,这个比较适合深度去了解框架的原理!
本文实例讲述了Yii Framework框架中事件和行为的区别及应用。分享给大家供大家参考,具体如下: 个人觉得,在 Yii 里面,最难以明白的就是事件(Event)和行为(behavior)了。这不仅仅是因为它们的概念 比较难明,...
从 MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主题化,I18N和L10N,Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。事实上,Yii是最有效率的PHP框架之一。 Yii是一个高性能的PHP5的...