PHP观察者模式
2022/2/22 17:27:39
本文主要是介绍PHP观察者模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
观察者模式定义:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式有四个角色:
抽象通知者角色(Subject):定义了通知的接口规则。
具体通知者角色(ConcreteSubject):实现抽象通知者的接口,接到状态改变向观察者下发通知。
抽象观察者角色(Observer):定义接到通知后所做的操作接口规则。
具体观察者角色(JingDong):实现具体操作方法。
考虑这样一种场景,有个电商平台,每天都要统计客户数据和订单数据,那么就可以定义一个类(Subject),当每天时间发生变化时,就要通知更新客户数据(Observer)和订单数据(Observer)。
本代码基于Yii2.0 具体通知者类: <?php namespace common\services; use Yii; use SplObserver; class SubjectService implements \SplSubject { protected $observers; public function __construct() { $this->observers = new \SplObjectStorage(); } /** * 获取参数 * @return mixed */ public function getParams() { return $this->observers->getInfo(); } /** * 添加观察者 * @param SplObserver $observer * @param null $params */ public function attach(SplObserver $observer,$params = null) { $this->observers->attach($observer,$params); } /** * 移除观察者 * @param SplObserver $observer */ public function detach(SplObserver $observer) { $this->observers->detach($observer); } /** * 通知观察者 */ public function notify() { foreach ($this->observers as $obj) { try { $obj->update($this); } catch (\Throwable $e) { } } } }
具体观察者类:
<?php namespace common\services; use Yii; use SplSubject; use common\services\SubjectService;
/** * 客户统计类 * Class UserObserverService * * @package common\services */ class UserObserverService implements \SplObserver { /** *更新数据 * @param SplSubject $subject */ public function update(SplSubject $subject) { //获取参数 $params = $subject->getParams(); //统计数据 $this->statData($params); } /** *统计客户数据 * @param $params */ public function statData($params) { echo "stat user data"; } }
<?php namespace common\services; use Yii; use SplSubject; use common\services\SubjectService; /** * 订单统计类 * Class OrderObserverService * * @package common\services */ class OrderObserverService implements \SplObserver { /** *更新数据 * @param SplSubject $subject */ public function update(SplSubject $subject) { //获取参数 $params = $subject->getParams(); //统计数据 $this->statData($params); } /** *统计订单数据 * @param $params */ public function statData($params) { echo "stat order data"; } } 测试类:
<?php namespace backend\controllers; use common\services\SubjectService; use common\services\UserObserverService; use common\services\OrderObserverService; use Yii; use yii\web\Controller; class ObserverTestController extends Controller { /** * 测试 */ public function actionIndex() { $day = date('Y-m-d'); $subject = \Yii::createObject(SubjectService::class); $subject->attach(new UserObserverService(),['day'=>$day]); $subject->attach(new OrderObserverService(),['day'=>$day]); $subject->notify(); } }
这篇关于PHP观察者模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-19php8的协程和hyperf的协程有什么区别?-icode9专业技术文章分享
- 2024-12-19php8 的fiber是什么?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-11-29使用PHP 将ETH账户的资产汇集到一个账户
- 2024-11-23怎么实现安卓+php 热更新方案?-icode9专业技术文章分享
- 2024-11-22PHP 中怎么实现判断多个值是否为空、null 或者为 false?-icode9专业技术文章分享
- 2024-11-11开源 PHP 商城项目 CRMEB 二次开发和部署教程
- 2024-11-09怎么使用php在kaufland平台刊登商品?-icode9专业技术文章分享
- 2024-11-05PHP的抽象类和接口是什么,有什么区别-icode9专业技术文章分享