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

php监听事件,php触发事件

高老师7年前 (2018-12-02)PHP2238

逛公众号文章看到文章"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模拟并发请求

原理:使用curl_init()创建多个请求实例,再使用curl_multi_init()批量执行创建的多个请求实例。文件1:curl.php<?php  $threads=500;//并发请求次数 $url='http://blog.cn/index.php?';...

php 开启错误提示,php 关闭错误提示

php 开启错误提示,php 关闭错误提示

开启错误提示代码:ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);关闭错误提示代码:error_reporting(E_ALL ^&n...

 php调用.net的dll文件,php调用.net dll

php调用.net的dll文件,php调用.net dll

本篇文章不是讲解如何用.net开发自己的dll然后PHP通过com调用。主要记录PHP官方支持的DOTNET 基本语法如下:$obj = new DOTNET("assembly", "classname")a...

 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 获取当前执行文件,php 获取当前执行文件,php 获取当前文件

php 获取当前执行文件,php 获取当前执行文件,php 获取当前文件

php官方的超全局变量$_SERVER['PHP_SELF']也能直接获取,只不过如果url参数太多也会获取。下面提供一个方法获取/*  * 获取当前PHP文件名称  */ if (!function_exists('phpself&#...

PHP获取站点根目录,PHP获取应用根目录,cgi和cli都支持

PHP获取站点根目录,PHP获取应用根目录,cgi和cli都支持

重构框架的时候想要考虑支持下cli模式,于是参考了thinkphp的底层。/**  * 获取应用根目录  * @return string  */ public static function getRootP...