参考:https://www.phpmianshi.com/?id=58
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();