【PHP】使用PHP原生自带的观察者模式
整理自:https://www.cnblogs.com/itbsl/p/13407489.html
搬运贴,如果有侵权请联系删除
-
需求背景
-
实现登录功能
-
添加登录次数统计
-
添加登录区域判断
-
添加登录后消息推送
-
添加登录后…
-
使用PHP原生观察者模式实现
-
splsubject接口 - 被观察者
-
Observer接口 - 观察者
-
SplObjectStorage对象 - 容器
-
用户登录类
-
首先在构造函数里,让他new SplObjectStorag()对象并赋值到属性上方便后面调用
-
实现attach()方法,用来注册观察者
-
实现detach()方法,用来删除观察者
-
实现notify()方法,用来遍历容器,调用每个观察者的update方法(必须是update)
-
rewind方法是容器指针重置到最开始,valid方法检测容器是否遍历完成并返回布尔,current方法是获取当前的观察者,next方法是将指针后移一位
-
修改login()方法,在里面调用notify()来通知观察者事件完成了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | class user implements splsubject{ protected $observer = null; public function __construct() { $this ->observer = new SplObjectStorage(); } public function login() { $this ->notify(); echo '登录完毕' ; } public function attach(SplObserver $observer ) { $this ->observer->attach( $observer ); } public function detach(SplObserver $observer ) { $this ->observer->detach( $observer ); } public function notify() { $this ->observer-> rewind (); while ( $this ->observer->valid()) { $observer = $this ->observer->current(); $observer ->update( $this ); $this ->observer->next(); } } } |
-
观察者
-
每个观察者实现SplObserver接口,并实现update()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 | class cat implements SplObserver { public function update(SplSubject $subject ) { echo '小猫叫一下' ; } } class dog implements SplObserver { public function update(SplSubject $subject ) { echo '小狗吼一声' ; } } |
-
应用
1 2 3 4 | $user = new user(); $user ->attach( new cat()); $user ->attach( new dog()); $user ->login(); |
得意时做事,失意时读书
分类:
PHP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律