1. 程式人生 > 實用技巧 >【PHP】使用PHP原生自帶的觀察者模式

【PHP】使用PHP原生自帶的觀察者模式

整理自:https://www.cnblogs.com/itbsl/p/13407489.html

搬運貼,如果有侵權請聯絡刪除

  1. 需求背景

  • 實現登入功能

  • 新增登入次數統計

  • 新增登入區域判斷

  • 新增登入後訊息推送

  • 新增登入後…

  1. 使用PHP原生觀察者模式實現

  • splsubject介面 - 被觀察者

  • Observer介面 - 觀察者

  • SplObjectStorage物件 - 容器

  1. 使用者登入類

  • 首先在建構函式裡,讓他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();
        }
    }
}

  

  1. 觀察者

  • 每個觀察者實現SplObserver介面,並實現update()方法

class cat implements SplObserver {

    public function update(SplSubject $subject)
    {
        echo '小貓叫一下';
    }
}
class dog implements SplObserver {
    public function update(SplSubject $subject)
    {
        echo '小狗吼一聲';
    }
}

  

  1. 應用

$user = new user();
$user->attach(new cat());
$user->attach(new dog());
$user->login();