PHP SPL 实现观察者模式的完整示例
观察者模式用于建立对象间的一对多依赖关系。在 PHP 中,可通过 SPL 标准库的 SplSubject 和 SplObserver 接口快速实现,避免手动管理事件注册与触发逻辑。
观察者模式核心机制
该模式主要包含两个角色:
- Subject(被观察对象):负责维护观察者列表,并在状态改变时通知所有已注册的观察者。
- Observer(观察者):实现更新接口,接收 Subject 的状态变化并进行处理。
PHP SPL 库内置了相关接口规范,开发者只需实现这两个接口即可满足标准兼容。
第1步:实现被观察类(Subject)
目的:创建一个可被观察的对象,内部维护状态值及观察者数组。
入口:定义类并实现 SplSubject 接口。
动作:实现 attach()、detach()、notify() 以及状态 setter/getter。
class DemoSubject implements SplSubject {
private $observers = array();
private $value;
public function __construct() {
$this->observers = array();
}
public function attach(SplObserver $observer) {
$this->observers[] = $observer;
}
public function detach(SplObserver $observer) {
if ($idx = array_search($observer, $this->observers, true)) {
unset($this->observers[$idx]);
}
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
public function setValue($value) {
$this->value = $value;
$this->notify();
}
public function getValue() {
return $this->value;
}
}
第2步:实现观察者类(Observer)
目的:定义具体的响应行为。
入口:定义类并实现 SplObserver 接口。
动作:实现 update() 方法,获取 Subject 最新状态。
class DemoObserver implements SplObserver {
public function update(SplSubject $subject) {
echo 'The new value is ' . $subject->getValue() . PHP_EOL;
}
}
第3步:运行测试
目的:验证状态变更时的通知机制。
入口:实例化 Subject 和 Observer。
动作:将 Observer 绑定到 Subject,修改 Subject 状态。
$subject = new DemoSubject();
$observer = new DemoObserver();
$subject->attach($observer);
$subject->setValue(5);
// 输出: The new value is 5
完成判断
当执行 setValue() 后,控制台成功打印出新值,说明 notify() 正确触发了 update(),观察者模式生效。
简要总结
利用 PHP 原生的 SPL 接口是实现观察者模式最简洁的方式。相比手写事件总线,这种方式保证了接口的一致性,便于与其他遵循相同规范的组件集成。以上就是 PHP 中基于 SPL 接口实现观察者模式的详细内容,更多关于 PHP 设计模式优化技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









