<?php
class Subject implements SplSubject {
private $observers = [];
private $state;
public function attach(SplObserver $observer) {
$this->observers[] = $observer;
}
public function detach(SplObserver $observer) {
foreach ($this->observers as $key => $obs) {
if ($obs === $observer) {
unset($this->observers[$key]);
}
}
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
public function setState($state) {
$this->state = $state;
$this->notify();
}
public function getState() {
return $this->state;
}
}
class Observer implements SplObserver {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function update(SplSubject $subject) {
echo "观察者==》{$this->name} 开始执行事件: " . $subject->getState() . "\n";
}
}
$subject = new Subject();
$observer1 = new Observer("观察者 1");
$observer2 = new Observer("观察者 2");
$subject->attach($observer1);
$subject->attach($observer2);
$subject->setState("事件");
输出

基础版本
<?php
interface Subject {
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notifyObservers();
}
class ConcreteSubject implements Subject {
private $_observers;
public function __construct() {
$this->_observers = array();
}
public function attach(Observer $observer) {
return array_push($this->_observers, $observer);
}
public function detach(Observer $observer) {
$index = array_search($observer, $this->_observers);
if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
return FALSE;
}
unset($this->_observers[$index]);
return TRUE;
}
public function notifyObservers() {
if (!is_array($this->_observers)) {
return FALSE;
}
foreach ($this->_observers as $observer) {
$observer->update();
}
return TRUE;
}
}
interface Observer {
public function update();
}
class ConcreteObserver implements Observer {
private $_name;
public function __construct($name) {
$this->_name = $name;
}
public function update() {
echo 'Observer', $this->_name, ' has notified.<br />';
}
}
$subject = new ConcreteSubject();
$observer1 = new ConcreteObserver('aaa');
$subject->attach($observer1);
$subject->notifyObservers();
$observer2 = new ConcreteObserver('bbb');
$subject->attach($observer2);
$subject->notifyObservers();
$subject->detach($observer1);
$subject->notifyObservers();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本