<p>PHP SPL模块中自带一个观察者模式,观察者模式是一个非常简单事件系统,包含两个或者更多交互的类,这个模式允许一个类观察另一个类的状态,当被观察的类发生变化的时候,这个模式会得到通知。</p><p>在观察者模式中,被观察的叫subject,而负责观察的类叫做observe,为了表达这些内容,SPL提供了SplSubject和SplObserver接口。</p><p>SplSubject接口;</p><pre class="brush:php;toolbar:false">classSplSubject{
/*Methods*/
publicattach(SplObserver$observer):void
publicdetach(SplObserver$observer):void
publicnotify():void
}</pre><p>SplObserver接口;</p><pre class="brush:php;toolbar:false">interfaceSplObserver{
publicfuntionupdate(SplSubject$subject);
}</pre><p>这个模式的概念是SplSubject类维护了一个特定状态,当这个状态发生变化时,它就会调用notify()方法。当调用notify()方法的时候,所有之前的使用的attach()方法注册的SplObserver实例的update()方法都会被调用。</p><p>代码:</p><pre class="brush:php;toolbar:false">classMyObserver1implementsSplObserver{
publicfunctionupdate(SplSubject$subject){
echo__CLASS__.'-'.$subject->getName();
}
}
classMyObserver2implementsSplObserver{
publicfunctionupdate(SplSubject$subject){
echo__CLASS__.'-'.$subject->getName();
}
}
classMySubjectimplementsSplSubject{
private$_observers;
private$_name;
publicfunction__construct($name){
$this->_observers=newSplObjectStorage();
$this->_name=$name;
}
publicfunctionattach(SplObserver$observer){
$this->_observers->attach($observer);
}
publicfunctiondetach(SplObserver$observer){
$this->_observers->detach($observer);
}
publicfunctionnotify(){
foreach($this->_observersas$observer){
$observer->update($this);
}
}
publicfunctiongetName(){
return$this->_name;
}
}
$observer1=newMyObserver1();
$observer2=newMyObserver2();
$subject=newMySubject("test");
$subject->attach($observer1);
$subject->attach($observer2);
$subject->notify();
/*
willoutput:
MyObserver1-test
MyObserver2-test
*/
$subject->detach($observer2);
$subject->notify();</pre>