<?phpinterface Subject{ public function add(Observer $observer); public function del(Observer $observer); public function notify();}interface Observer{ public function say();}class ConcreteObserver implements Observer{ private $name ; public function __construct($name) { $this->name = $name; } public function say() { echo 'say '.$this->name.PHP_EOL; }}class ConcreteSubject implements Subject{ private $_observer; private $notify_times = 0; public function __construct() { $this->_observer = []; } public function add(Observer $observer) { return array_push($this->_observer, $observer); } public function del(Observer $observer) { $index = array_search($observer, $this->_observer); if ($index === false || !key_exists($index, $this->_observer)) { return false; } unset($this->_observer[$index]); return true; } public function notify() { $this->notify_times++; echo "开始第 $this->notify_times 次通知".PHP_EOL;; if (!is_array($this->_observer)) return false; foreach ($this->_observer as $item) { $item->say(); } return true; }}$dog = new ConcreteObserver('dog');$cat = new ConcreteObserver('cat');$subject = new ConcreteSubject();$subject->add($dog);$subject->notify();$subject->add($cat);$subject->add($cat);$subject->notify();$subject->del($cat);$subject->notify();$subject->del($dog);$subject->notify();$subject->del($cat);$subject->notify();