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

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

观察者模式用于建立对象间的一对多依赖关系。在 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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。