在mvc框架中可以看到事件类,实现事件的监听和触发。
举例:
<?php /** * 事件类 */ class Event { // 事件绑定记录 private static $events; /** * 初始化 */ public static function init() { self::$events = array (); // 获取插件列表return true; } /** * 注册事件 * * @param string $event * @param mixed $callback * @param bool $first 是否优先执行,以靠后设置的为准 */ public static function register($event, $callback, $first=false) { if (! isset(self::$events[$event])) { self::$events[$event] = array (); } if($first) { array_unshift(self::$events[$event],$callback); } else { self::$events[$event][] = $callback; } } /** * 触发事件(监听事件) * @param name $event * @param boolean $once * @return mixed */ public static function trigger($event, &$params=array()) { if (isset(self::$events[$event])) { foreach (self::$events[$event] as $item) { if(true === call_user_func($item,$params)) { // 事件返回true时不继续执行其余事件 return true; } } return false; } return true; } }
就是说,在框架中,我们可以注册事件,并在某点触发事件,不需要修改源代码
使用Event类监听一个事件
function addArtice() { ....... Event::trigger('ON_Artice_ADD',array('userInfo'=>$userInfo,'result'=>&$result)); //这里监听触发当文章被添加的时候的事件:ON_Artice_ADD }
注册事件:
Event::register('ON_Artice_ADD',function($data){ // 这里可以做一些事情 .......... });
没有注册,不能触发。
注册才可以触发