先用 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 庫即可.