<?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();