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

php监听事件,php触发事件

高老师8年前 (2018-12-02)PHP2370

逛公众号文章看到文章"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对象转数组

function objtoarr($obj){ $ret = array(); foreach($obj as $key =>$value){ if(gettype($value) == 'arr...

 php 判断是否post,php判断是否post提交,php 判断是否为post,php 判断get 还是post

php 判断是否post,php判断是否post提交,php 判断是否为post,php 判断get 还是post

if($_SERVER['REQUEST_METHOD'] == 'POST') { echo('This is  post '); } elseif ($_SERVER['...

php trait的使用

php trait的使用

PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts {     public f...

php json_encode 使用注意

php json_encode 使用注意

参数中包含gb2312的字符串,返回结果是false或者null(不同PHP版本具有差异性)代码:<?php $dbms = 'mysql'; $host = '192.168.8.8'; $dbName =&n...

thinkphp3定时任务,tp定时任务,thinkphp定时任务

thinkphp3定时任务,tp定时任务,thinkphp定时任务

本教程使用的定时任务基于EasyTak,EasyTask官方文档:https://gitee.com/392223903/EasyTask由于tp3.2.x官方开发未考虑命令行支持和绝对路径开发的标准,因此我编写了一个支持的类来运行。1.在tp3.2.3根目录下安装easytaskcomposer&...

PHP RSA密文过长加密解密,PHP RSA证书大小自动适配,PHP RSA分段加密

PHP RSA密文过长加密解密,PHP RSA证书大小自动适配,PHP RSA分段加密

项目中需要加密超长json内容才发现rsa加密长度有限制,于是换一种思路:我们将原本需要加密的内容拆分为多个字符串,一段一段的加密,解密端也是一段一段的解密即可完成。(1).确认每次加密多少长度首先我们要知道rsa加密长度是多少,1024位的rsa能加密的长度也是1024位。那么我们一次加密多长的字...