attachments-2020-05-aIBW3Vjd5ecf62df3566a.jpg

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

 

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

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

 

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

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 库即可。