PHP SPL 实现观察者模式的完整示例

阿橙
阿橙
发布时间:2026-10-14 | 2人浏览过
原创

观察者模式用于建立对象间的一对多依赖关系。在 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 设计模式优化技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表