PHP中的事件處理


看下面的事件類

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');

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM