看下面的事件類
class Event { protected static $listens = array(); /** * [listen 注冊監聽事件] * @param [string] $event [事件名] * @param [callback] $callback [事件內容] * @param [bool] $once [是否是一次性事件,默認false] */ public static function listen($event, $callback, $once=false){ if(!is_callable($callback)) return false; self::$listens[$event][] = array('callback'=>$callback, 'once'=>$once); return true; } // 一次性事件 public static function one($event, $callback){ return self::listen($event, $callback, true); } public static function remove($event, $index=null){ if(is_null($index)) unset(self::$listens[$event]); else unset(self::$listens[$event][$index]); } public static function trigger(){ // 沒有參數(傳遞事件) 退出 if(!func_num_args()) return; // 事件名的數組 $args = func_get_args(); // 將函數名(callback)賦給 $event $event = array_shift($args); // 檢測事件是否被注冊過,沒有則退出 if(!isset(self::$listens[$event])) return false; foreach( self::$listens[$event] as $index=>$listen){ $callback = $listen['callback']; $listen['once'] && self::remove($event, $index); call_user_func_array($callback, $args); } } }
這個類包含了事件的注冊,觸發及移除方法。
下面添加一個事件,事件名叫walk,事件的動作就是輸出 "I am walking...n" ,執行后。該事件會存儲在 $listens 這個數組中。
Event::listen('walk', function($a='',$b=''){ echo "I am walking...n" .$a .$b; });
觸發walk事件
Event::trigger('walk');
也可以傳參數進去
Event::trigger('walk','~~~','!!!');
如果不移除該事件,觸發一次就會執行一次。
而一次性事件執行過一次就會被銷毀。再次調用沒有任何反應。
Event::one('walkOnce', function(){ echo "run...once"; }); Event::trigger('walkOnce',true); // 因為已經執行過了,再次調用返回了false Event::trigger('walkOnce');