PHP设计模式观察者与事件驱动
PHP设计模式观察者与事件驱动观察者模式定义了对象之间的一对多依赖关系。一个对象状态变化时所有依赖它的对象都收到通知。事件驱动编程就是基于这个模式。今天说说PHP中的观察者模式和事件系统。PHP的SPL提供了SplSubject和SplObserver接口实现观察者很方便。phpclass OrderManager implements SplSubject{private SplObjectStorage $observers;private array $data [];public function __construct(){$this-observers new SplObjectStorage();}public function attach(SplObserver $observer): void{$this-observers-attach($observer);}public function detach(SplObserver $observer): void{$this-observers-detach($observer);}public function notify(): void{foreach ($this-observers as $observer) {$observer-update($this);}}public function createOrder(array $data): void{$this-data $data;echo 订单已创建\n;$this-notify();}public function getData(): array{return $this-data;}}class EmailNotifier implements SplObserver{public function update(SplSubject $subject): void{$data $subject-getData();echo 发送邮件: {$data[user]} 的订单\n;}}class Logger implements SplObserver{public function update(SplSubject $subject): void{echo 记录日志\n;}}class SmsNotifier implements SplObserver{public function update(SplSubject $subject): void{echo 发送短信通知\n;}}$manager new OrderManager();$manager-attach(new EmailNotifier());$manager-attach(new Logger());$manager-attach(new SmsNotifier());$manager-createOrder([id 1, user 张三, amount 299]);?自己实现事件系统更灵活。phpclass EventDispatcher{private array $listeners [];public function listen(string $event, callable $handler, int $priority 0): void{$this-listeners[$event][] [handler $handler, priority $priority];}public function dispatch(string $event, mixed $data null): void{$listeners $this-listeners[$event] ?? [];usort($listeners, fn($a, $b) $b[priority] - $a[priority]);foreach ($listeners as $item) {($item[handler])($data);}}public function getListeners(?string $event null): array{if ($event) {return array_map(fn($l) $l[handler], $this-listeners[$event] ?? []);}return array_keys($this-listeners);}}$dispatcher new EventDispatcher();$dispatcher-listen(user.registered, function ($data) {echo 发送欢迎邮件至 {$data[email]}\n;}, 10);$dispatcher-listen(user.registered, function ($data) {echo 记录注册日志\n;}, 5);$dispatcher-listen(user.registered, function ($data) {echo 初始化用户空间\n;}, 0);$dispatcher-dispatch(user.registered, [name 张三, email testtest.com]);?观察者模式的核心是解耦。事件发布者不需要知道谁在监听监听者也不需要知道谁发布了事件。它们通过事件名称连接起来各自独立互不干扰。Laravel的事件系统就是观察者模式的实现。