正常的程序执行, 或者说人的思维趋势, 都是按照 时间线性串行 的, 保持 连续性. 不过现实中会存在各种 打断, 程序也不是永远都是 就绪状态, 那么, 就需要有一种机制, 来处理可能出现的各种打断, 或者在程序不同状态之间切换。
事件机制发展到现在, 有时候也算是一种预留手段, 根据你的经验在需要的地方 埋点, 方便之后 打补丁。
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 库即可。