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