【PHP】使用PHP原生自带的观察者模式

 

整理自:https://www.cnblogs.com/itbsl/p/13407489.html

搬运贴,如果有侵权请联系删除

  1. 需求背景

  • 实现登录功能

  • 添加登录次数统计

  • 添加登录区域判断

  • 添加登录后消息推送

  • 添加登录后…

  1. 使用PHP原生观察者模式实现 

  • splsubject接口 - 被观察者

  • Observer接口 - 观察者

  • SplObjectStorage对象 - 容器

  1. 用户登录类

  • 首先在构造函数里,让他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();
        }
    }
}

  

  1. 观察者

  • 每个观察者实现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. 应用

1
2
3
4
$user = new user();
$user->attach(new cat());
$user->attach(new dog());
$user->login();

  

 

posted @   蓝色星辰1993  阅读(111)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示