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

 

事件机制发展到现在, 有时候也算是一种预留手段, 根据你的经验在需要的地方 埋点, 方便之后 打补丁。

swoft 的事件机制基于 PSR-14 实现, 高度内聚简洁。

 

由三部分组成:

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

 

执行流程:

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

 

使用起来就更加简单了:

namespace Swoft\Event;
 
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 库即可。