PHP事件机制

你说的曾经没有我的故事 提交于 2020-10-24 17:23:05

先用 3W1H(who what why how) 分析法的思路来解释一下 事件机制

更重要的是, 这个有什么用?

正常的程序执行, 或者说人的思维趋势, 都是按照 时间线性串行 的, 保持 连续性. 不过现实中会存在各种 打断, 程序也不是永远都是 就绪状态, 那么, 就需要有一种机制, 来处理可能出现的各种打断, 或者在程序不同状态之间切换。

事件机制发展到现在, 有时候也算是一种预留手段, 根据你的经验在需要的地方 埋点, 方便之后 打补丁。swoft 的事件机制基于 PSR-14 实现, 高度内聚简洁。

由三部分组成:

  • EventManager: 事件管理器
  • Event: 事件
  • EventHandler / Listener: 事件处理器/监听器

执行流程:

  • 先生成 EventManager
  • 将 Event 和 EventHandler 注册到 EventManager
  • 触发 Event, EventManager 就会调用相应的 EventHandler

使用起来就更加简单了:

namespace SwoftEvent;
 
class ListenerQueue implements IteratorAggregate, Countable
{
    protected $store;
 
    /**
     * 优先级队列
     * @var SplPriorityQueue
     */
    protected $queue;
 
    /**
     * 计数器
     * 设定最大值为 PHP_INT_MAX == 300
     * @var int
     */
    private $counter = PHP_INT_MAX;
 
    public function __construct()
    {
        $this->store = new SplObjectStorage(); // Event 对象先添加都这里
        $this->queue = new SplPriorityQueue(); // 然后加入优先级队列, 之后进行调度
    }
    ...
}

稍微玩过 ACM 的人对 优先级队列 就不会陌生了, 基本所有 OJ 都有相关的题库。不过 PHPer 懒得操心底层实现的话, 直接借助 SPL 库即可。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!