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