整理自:https://www.cnblogs.com/itbsl/p/13407489.html
搬运贴,如果有侵权请联系删除
-
需求背景
-
实现登录功能
-
添加登录次数统计
-
添加登录区域判断
-
添加登录后消息推送
-
添加登录后…
-
使用PHP原生观察者模式实现
-
splsubject接口 - 被观察者
-
Observer接口 - 观察者
-
SplObjectStorage对象 - 容器
-
用户登录类
-
首先在构造函数里,让他new SplObjectStorag()对象并赋值到属性上方便后面调用
-
实现attach()方法,用来注册观察者
-
实现detach()方法,用来删除观察者
-
实现notify()方法,用来遍历容器,调用每个观察者的update方法(必须是update)
-
rewind方法是容器指针重置到最开始,valid方法检测容器是否遍历完成并返回布尔,current方法是获取当前的观察者,next方法是将指针后移一位
-
修改login()方法,在里面调用notify()来通知观察者事件完成了
class 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(); } } }
-
观察者
-
每个观察者实现SplObserver接口,并实现update()方法
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();