PHP使用标准库spl实现的观察者模式示例


Posted in PHP onAugust 04, 2018

本文实例讲述了PHP使用标准库spl实现的观察者模式。分享给大家供大家参考,具体如下:

前面使用纯php实现了一个观察者模式(php观察者模式), 现在使用php标准库spl在次实现观察者模式,好处是:随意的生成您想使用的观察者!

<?php
/**
 * Created by PhpStorm.
 * User: evolution
 * Date: 14-12-27
 * Time: 下午5:50
 */
class Login implements SplSubject {
  private $storage;
  public $status;
  public $ip;
  const LOGIN_ACCESS = 1;
  const LOGIN_WRONG_PASS = 2;
  const LOGIN_USER_UNKNOWN = 3;
  function __construct(){
    $this->storage = new SplObjectStorage();
  }
  function attach (SplObserver $observer) {
    $this->storage->attach($observer);
  }
  function detach(SplObserver $observer){
    $this->storage->detach($observer);
  }
  function notify(){
    foreach ($this->storage as $obs) {
      $obs->update($this);
    }
  }
  /**
   * @author jichao.wang
   * 执行登陆
   */
  function handleLogin()
  {
    $ip = rand(1,100);
    switch (rand(1, 3)) {
      case 1:
        $this->setStatus(self::LOGIN_ACCESS, $ip);
        $ret = true;
        break;
      case 2:
        $this->setStatus(self::LOGIN_WRONG_PASS, $ip);
        $ret = false;
        break;
      case 3:
        $this->setStatus(self::LOGIN_USER_UNKNOWN, $ip);
        $ret = false;
        break;
    }
    /**
     * handle event
     */
    $this->notify();
    return $ret;
  }
  /**
   * @param $status
   * @author jichao.wang
   * set login status
   */
  function setStatus($status,$ip)
  {
    $this->status = $status;
    $this->ip = $ip;
  }
  /**
   * @return mixed
   * @author jichao.wang
   * get login status
   */
  function getStatus()
  {
    return $this->status;
  }
}
/**
 * 只针对登陆的贯观察者
 * Class LoginObserver
 */
abstract class LoginObserver implements SplObserver {
  private $login;
  function __construct(Login $login){
    $this->login = $login;
    $login->attach($this);
  }
  /**
   * 对外统一的访问点
   * @param SplSubject $subject
   */
  function update( SplSubject $subject ){
    if($subject === $this->login){
      $this->doUpdate($subject);
    }
  }
  abstract function doUpdate( Login $login );
}
/**
 * Class EmailObserver
 */
class EmailObserver extends LoginObserver{
  //不同功能的观察者实现不同的功能
  function doUpdate( Login $login ){
    $status = $login->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
      echo __CLASS__.'用户ip:'.$login->ip.'登陆成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
      echo __CLASS__.'用户ip:'.$login->ip.'登陆失败,密码错误!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
      echo __CLASS__.'用户ip:'.$login->ip.'登陆失败,无此用户!'.'------------------';
    }
  }
}
//实例化登陆信息
$login = new Login();
//实现发邮件观察者
new EmailObserver($login);
//开始登陆
$login->handleLogin();

运行结果:

EmailObserver用户ip:77登陆成功!------------------

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php 5.3.5安装memcache注意事项小结
Apr 12 PHP
php解析url的三个示例
Jan 20 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
浅谈json_encode用法
Mar 05 PHP
PHP和C#可共用的可逆加密算法详解
Oct 26 PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 PHP
PHP操作Redis数据库常用方法示例
Aug 25 PHP
使用PHPWord生成word文档的方法详解
Jun 06 PHP
Thinkphp5框架异常处理操作实例分析
Jun 03 PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 #PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 #PHP
PHP一致性hash分布式算法封装类定义与用法示例
Aug 04 #PHP
PHP实现的函数重载功能示例
Aug 03 #PHP
thinkPHP5框架导出Excel文件简单操作示例
Aug 03 #PHP
PHP命名空间namespace及use的简单用法分析
Aug 03 #PHP
PHP后台实现微信小程序登录
Aug 03 #PHP
You might like
重置版战役片段
2020/04/09 魔兽争霸
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
Python中atexit模块的基本使用示例
2015/07/08 Python
Python中的集合类型知识讲解
2015/08/19 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
Python读取指定日期邮件的实例
2019/02/01 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
初中生个人学习的自我评价
2013/12/04 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
党建工作汇报材料
2014/12/24 职场文书
八年级数学教学反思
2016/02/17 职场文书
OpenCV 图像梯度的实现方法
2021/07/25 Python
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技