YII的事件大致是这种:
<?php /** * 事件产生类 * Class EventGenerator */abstract class EventGenerator{ private $ObServers = []; //增加观察者 public function add(ObServer $ObServer) { $this->ObServers[] = $ObServer; } //事件通知 public function notify() { foreach ($this->ObServers as $ObServer) { $ObServer->update(); } }}/** * 观察者接口类 * Interface ObServer */interface ObServer{ public function update($event_info = null);}/** * 观察者1 */class ObServer1 implements ObServer{ public function update($event_info = null) { echo "观察者1 收到执行通知 执行完毕!\n"; }}/** * 观察者1 */class ObServer2 implements ObServer{ public function update($event_info = null) { echo "观察者2 收到执行通知 执行完毕!\n"; }}/** * 事件 * Class Event */class Event extends EventGenerator{ /** * 触发事件 */ public function trigger() { //通知观察者 $this->notify(); }}//创建一个事件$event = new Event();//为事件增加旁观者$event->add(new ObServer1());$event->add(new ObServer2());//执行事件 通知旁观者$event->trigger();
PHP原生拥有SplObserver观察者类:
<?phpclass user implements splsubject{ protected $observer = null; public function __construct() { $this->observer = new SplObjectStorage(); } public function login() { $this->notify(); echo '登录完毕'; } //增加观察者 public function attach(SplObserver $observer) { $this->observer->attach($observer); } //减少观察者 public function detach(SplObserver $observer) { $this->observer->detach($observer); } //观察 public function notify() { $this->observer->rewind(); while ($this->observer->valid()) { $observer = $this->observer->current(); $observer->update($this); $this->observer->next(); } }}//观察者猫class cat implements SplObserver { public function update(SplSubject $subject) { echo '小猫叫一下'; }}//观察者狗class dog implements SplObserver { public function update(SplSubject $subject) { echo '小狗吼一声'; }}//创建一个事件$user = new user();//为事件增加旁观者$user->attach(new cat());$user->attach(new dog());//执行事件 通知旁观者$user->login();