好好爱自己!

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');
复制代码
复制代码

 

 

 
标签: php事件
 
posted @   立志做一个好的程序员  阅读(331)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2017-08-22 PostgreSQL sum typecasting as a bigint
2017-08-22 Using KafkaBolt to write to a kafka topic
2017-08-22 How to pass external configuration properties to storm topology?
2016-08-22 elasticSearch indices VS type
2016-08-22 一个不错的简历制作网站
2016-08-22 php active-record 设计模式

不断学习创作,与自己快乐相处

点击右上角即可分享
微信分享提示