当前位置: 首页 > news >正文

PHP观察者模式的简单实现

PHP5.0以上版本内置了观察者模式的实现。

观察者模式应用的场景:

1,比如新增加用户的时候,需要给用户发送邮件和短信进行通知。我们的主程序就是完成用户的增其,其他方法对进行发短信和通知。

2,具体的代码使用如下

<?php
//一个观察者模式的实现,使用php内置的方法来实现
//构建一个目标类,创建用户的时候,向用户发短息,发邮件。修改密码的时候向用户发短信
class User implements  SplSubject
{
    private $email;
    private $name;
    private $sex;
    private $observs;
        public function getEmail() {
            return $this->email;
        }
    
    
        public function getName() {
            return $this->name;
        }
    
    
        public function getSex() {
            return $this->sex;
        }
    
    
        public function setEmail($email) {
            $this->email = $email;
        }
    
    
        public function setName($name) {
            $this->name = $name;
        }
    
    
        public function setSex($sex) {
            $this->sex = $sex;
        }
    
    public function __construct($name,$email,$sex)
    {
        $this->name=$name;
        $this->email=$email;
        $this->sex=$sex;
        $this->observs=new SplObjectStorage();        
    }
    public function attach(SplObserver $observer)
     {
            $this->observs->attach($observer);
     }
    
    public function detach(SplObserver $observer) 
    {
        $this->observs->detach($observer);
    }
    
    public function notify() 
    {
            foreach($this->observs as $obs)
            {
                $obs->update($this);
            }
    }
    public function crete()
    {
        echo "新增了一个名为{$this->name}的用户<br/>";
        $this->notify();
    }
    public function resetpwd()
    {
        echo "用户{$this->name}重置了密码<br/>";
        $this->notify();
    }
}
//观察者
class sendmsg implements SplObserver
{
    public function update(SplSubject  $subject) 
    {
            echo "我要发短信了,给用户{$subject->getName()}<br/>";
    }
}
class sendemail implements SplObserver
{
    public function update(SplSubject  $subject)
    {
        echo "我给{$subject->getName()}发邮件了<br/>";
    }
}


//测试脚本
$user=new User("小花猫","小花猫@小花猫","猫猫");
$sendemail=new sendemail();
$sendmsg=new sendmsg();
$user->attach($sendemail);//注册发邮件的事件
$user->attach($sendmsg);//发留言信息


$user->crete();
echo "我要重置密码<br/> ";
$user->detach($sendmsg);
$user->resetpwd();

其中user方法实现了spl的接口splsubject,观察者实现了splObserver接口。对于spl是个什么东西,请参考http://www.php.net/spl   今天发现php.net改版了!现在一些东西在上边都很好找。

转载于:https://www.cnblogs.com/minbbp/p/3161208.html

相关文章:

  • (七)Java对象在Hibernate持久化层的状态
  • Ext JS添加子组件的误区
  • vue 个人积累(使用工具,组件)
  • linux_shell_5_shell特性_正则_1
  • 【Python模块】Python UUID模块
  • 以太坊客户端Geth命令参数详解
  • 寒门难再出贵子(4),一篇值得思考的文章
  • Centos7下自建yum源并同步阿里云镜像的rpm包
  • CentOS 网络设置
  • java集合之linkedList链表基础
  • ReSharper7.1.25.234 注册机
  • Java之word导出下载
  • bootstrap完美实现5列布局
  • 第二章 JAVA语言基本语法————数据类型之间的转换
  • 爱奇艺大数据招聘
  • JavaScript 如何正确处理 Unicode 编码问题!
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Bootstrap JS插件Alert源码分析
  • CSS居中完全指南——构建CSS居中决策树
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Debian下无root权限使用Python访问Oracle
  • Gradle 5.0 正式版发布
  • Java-详解HashMap
  • passportjs 源码分析
  • php面试题 汇集2
  • React Transition Group -- Transition 组件
  • Ruby 2.x 源代码分析:扩展 概述
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Terraform入门 - 3. 变更基础设施
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 二维平面内的碰撞检测【一】
  • 翻译:Hystrix - How To Use
  • 应用生命周期终极 DevOps 工具包
  • ###C语言程序设计-----C语言学习(6)#
  • #NOIP 2014# day.2 T2 寻找道路
  • $().each和$.each的区别
  • ()、[]、{}、(())、[[]]命令替换
  • (3)(3.5) 遥测无线电区域条例
  • (python)数据结构---字典
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十六)一篇文章学会Java的常用API
  • (学习日记)2024.01.19
  • (一)Dubbo快速入门、介绍、使用
  • (转)大型网站架构演变和知识体系
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) UML中文FAQ (OO) (UML)
  • .NET Core引入性能分析引导优化
  • .net6+aspose.words导出word并转pdf
  • .net反混淆脱壳工具de4dot的使用
  • .skip() 和 .only() 的使用
  • @Autowired多个相同类型bean装配问题
  • @Mapper作用