观察者模式

<?php
//观察者模式
class User implements SplSubject{
    public $lognum;
    public $hobby;

    protected $observers = null;
    public function __construct($hobby){
        $this->lognum = rand(1,10);
        $this->hobby = $hobby;
        $this->observers = new SplObjectStorage();
    }

    public function login(){
        $this->notify();
    }

    public function attach(SPLObserver $observer){
        $this->observers->attach($observer);
    }

    public function detach(SPLObserver $observer){
        $this->observers->detach($observer);
    }

    public function notify(){
        $this->observers->rewind();
        while($this->observers->valid()){
            $observer = $this->observers->current();
            $observer->update($this);
            $this->observers->next();
        }
    }
}

class Secrity implements SPLObserver{
    public function update(SplSubject $subject){
        if($subject->lognum <= 3){
            echo '这是第'.$subject->lognum . '次安全登陆';
        }else{
            echo '这是第'.$subject->lognum . '次登陆,异常';
        }
    }
}

class Ad implements SPLObserver{
    public function update(SplSubject $subject){
        if($subject->hobby == 'sports'){
            echo '台球英锦赛门票预订';
        }else{
            echo '好好学习天天向上';
        }
    }
}

$user = new User('sports');
$user->attach(new Secrity());
$user->attach(new Ad());

$user->login();
原文地址:https://www.cnblogs.com/nr-zhang/p/10943873.html