当前位置:首页 > PHP > 正文内容

php监听事件,php触发事件

高老师6年前 (2018-12-02)PHP2023

逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。

先看下监听类:

class Event
{
    /**
     * 监听列表
     * @var array
     */
    protected static $listens = [];

    /**
     * 事件监听
     * @param $event
     * @param $callback
     * @param bool $once
     * @return bool
     */
    public static function listen($event, $callback, $once = false)
    {
        //检查是否可以调用
        if (is_callable($callback) == false)
        {
            return false;
        }

        self::$listens[$event][] = [
            'once' => $once,
            'callback' => $callback
        ];

        return true;
    }

    /**
     * 事件移除
     * @param $event
     * @param null $index
     */
    public static function remove($event, $index = null)
    {
        if ($index == null)
        {
            unset(self::$listens[$event]);
        }
        else
        {
            unset(self::$listens[$event][$index]);
        }
    }

    /**
     * 事件触发
     */
    public static function trigger()
    {
        //提取参数和事件
        $args = func_get_args();
        if ($args == false)
        {
            return;
        }

        //获取事件
        $event = array_shift($args);
        $events = self::$listens;
        if (isset($events[$event]) == false || $events == false)
        {
            return;
        }

        //循环调用
        foreach ($events[$event] as $key => $item)
        {
            $callback = $item['callback'];
            $item['once'] && self::remove($event, $key);
            call_user_func_array($callback, $args);
        }
    }

}

再看下使用代码:

/**
 * 监听select事件
 */
Event::listen('select', function ($sql) {
    echo "DB:select():" . $sql . PHP_EOL;
});


/**
 * 监听update
 */

Event::listen('update', function ($sql) {
    echo "DB:update():" . $sql . PHP_EOL;
}, true);


/**
 * 触发select事件
 */
$sql = 'select *  from  member';
Event::trigger('select', $sql);
Event::trigger('select', $sql);
Event::trigger('select', $sql);

/**
 * 触发update事件
 */
$sql = 'update member set age=16';
Event::trigger('update', $sql);
Event::trigger('update', $sql);

监听普通事件,可多次触发事件,如果监听我一次性事件,只能单次调用

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.5b1.cn/post/71.html

分享给朋友:

“ php监听事件,php触发事件” 的相关文章

编写php com组件,php调用.net dll,php源码保护

编写php com组件,php调用.net dll,php源码保护

开发com组件可以用c++,vc++,net,我比较熟悉net,演示用dnet(1).创建项目:启动vs2017,新建项目,选择Visual C# ->Windows桌面->类库通用windows(2). 修改Com项目:点击 项目->项目属性,再点击应用程序->程序集信息,...

php  RabbitMQ消息队列

php RabbitMQ消息队列

(1).config.php 配置文件<?php /**  * RabbitMQ_Config  */ $config = [     'host' => ...

php执行慢原因查找

php执行慢原因查找

今天帮朋友查询wordpress执行超级慢的原因,特此记录开启fpm的慢日志,记录执行超过30秒的脚本request_slowlog_timeout = 30 slowlog = var/log/slow.log查看日志[23-May-2019 17...

pcntl_signal(): Error assigning signal

pcntl_signal(): Error assigning signal

当我想在一个进程中监听kill 和 kill -9命令报了这个错误。//监听kill pcntl_signal(SIGTERM, function () {     posix_kill(0, SIGTERM); });...

php代理下载,php代下载文件,php下载远程文件,php远程文件下载

php代理下载,php代下载文件,php下载远程文件,php远程文件下载

经常我们下载国外资源容易被墙,可以通过php脚本获取远程文件流然后输出给我们的浏览器来下载。<?php //设置下载文件的url $url = 'https://mirrors.huaweicloud.com/ubuntukylin/ubuntukylin-19....

php mcrypt扩展被废弃的解决方案

php mcrypt扩展被废弃的解决方案

使用openssl扩展对应替换mcrypt的函数,(比较麻烦,但是openssl是未来趋势)在新版php中编译mcrypt扩展使用一个纯php代码实现的mcrypt扩展库,git地址为https://github.com/phpseclib/mcrypt_compat,每个mcrypt的方法都已经实...