zoukankan      html  css  js  c++  java
  • php中自定义事件---事件驱动

    PHP中自定义事件驱动,处理机制。

    原文:https://www.cnblogs.com/mafeifan/p/4322271.html

    --------------------------------

    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');
    复制代码
     
     
  • 相关阅读:
    linux脚本启动停止一个jar
    如何突破各种防火墙的防护 [转]
    linux查看端口占用
    网页标题图标添加
    Go语言的一些使用心得
    kubernetes系列之ConfigMap使用方式
    Kubernetes因限制内存配置引发的错误
    Kubernetes系列之理解K8s Service的几种模式
    kubernetes中的Pause容器如何理解?
    Kubernetes系列之Helm介绍篇
  • 原文地址:https://www.cnblogs.com/oxspirt/p/9515457.html
Copyright © 2011-2022 走看看