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

php监听事件,php触发事件

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

逛公众号文章看到文章"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.20230611.cn/post/71.html

分享给朋友:

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

php非对称加密

php非对称加密

先在centos安装openssl,然后开始://生成私钥openssl genrsa -out rsa_private_key.pem 1024//生成公钥openssl rsa -in rsa_private_key.pem&...

php迭代器学习

php迭代器学习

php官方已经提供了Iterator(迭代器)接口,通过网上资料的学习,目前看适合超大集合或者数组提取使用。学习一个函数的实现对比内存占用差距.使用迭代器和普通循环实现range()函数。(1).普通循环实现range()函数。function newrange($low, $h...

php arrayaccess的应用场景:配置管理器

php arrayaccess的应用场景:配置管理器

上篇文章已经讲解arrayacces的原理,现在来讲解下arrayaccess的实际应用。一个大型的互联网项目中必然会存在各种配置信息,例如多种数据库信息:mysql,tidb,mongodb,redis,某个业务模块单独的配置信息如比例,额度等等,那么该如何治理配置信息?PHP项目中大部分的框架都...

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习:    (2.1)pcntl_fork()执行时:       &nbs...

PHP getenv函数和putenv函数的学习

PHP getenv函数和putenv函数的学习

(1).在PHP中可以查看的环境变量包括: (1.1).电脑环境变量 (2.1).服务器环境变量(2).getenv()函数获取一个环境变量的值.参数1是环境变量的key,参数2值为true的时候仅从你的电脑环境变量中查找,参数2值为false会从两种变量中全部查询//获取我电脑登录的用户名,输出A...

cookie跨域,cookie p3p跨域

cookie跨域,cookie p3p跨域

最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...