【PHP】使用PHP原生自帶的觀察者模式
阿新 • • 發佈:2020-12-24
整理自: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();