PHP-SPL标准库中实现了观察者模式接口,PHP内置提供了两个接口来供外部应用区实现这个模式。
 <文档>http://www.php.net/manual/zh/splobserver.update.php
 SplSubject 接口
 SplSubject代表着被观察的对象,其结构:
    
 
interface SplSubject{
    //添加(注册)一个观察者
    public function attach(SplObserver $observer);
    //删除一个观察者
    public function detach(SplObserver $observer);
    //当状态发生改变时,通知所有观察者
        public function notify();
    } 
 SplObserver 接口
 SplObserver 代表着充当观察者的对象,其结构:
    
interface SplObserver{
      //在目标发生改变时接收目标发送的通知;当关注的目标调用其notify()时被调用 
      public function update(SplSubject $subject);
    }
<说明>
 SplSubject维护了一个特定的状态,在其状态改变时调用 notify()方法,一旦这个方法被调用,任何先前通过 attach()方法注册上来的 SplObserver对象都会以调用其 update()方法的方式被更新。
 编程OOP
    
class MyObserver1 implements SplObserver
{
public function update(SplSubject $subject)
{
echo "MyObserver1 updated\n";
}
}
class MyObserver2 implements SplObserver
{
public function update(SplSubject $subject)
{
echo "MyObserver2 updated\n";
}
}
class MySubject implements SplSubject
{
private $_observers;
private $_name;
public function __construct($name)
{
$this->_observers = new SplObjectStorage();
$this->_name = $name;
}
public function attach(SplObserver $observer)
{
$this->_observers->attach($observer);
}
public function detach(SplObserver $observer)
{
$this->_observers->detach($observer);
}
public function notify()
{
foreach ($this->_observers as $observer) {
$observer->update($this);
}
}
public function getName()
{
return $this->_name;
}
}
 测试用例Test Case:
 <代码>
    
class testDriver
{
public function run()
{
$observer1 = new MyObserver1();
$observer2 = new MyObserver2();
$subject = new MySubject("test");
$subject->attach($observer1);
$subject->attach($observer2);
$subject->notify();
}
}
$test = new testDriver();
$test->run();










