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 相关文章推荐
global.php
Dec 09 PHP
基于Discuz security.inc.php代码的深入分析
Jun 03 PHP
使用php统计字符串中中英文字符的个数
Jun 23 PHP
解析php取整的几种方式
Jun 25 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
php的sso单点登录实现方法
Jan 08 PHP
Zend Framework自定义Helper类相关注意事项总结
Mar 14 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 PHP
掌握PHP垃圾回收机制详解
Mar 13 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
Jul 15 PHP
laravel 使用事件系统统计浏览量的实现
Oct 16 PHP
php array_map()函数实例用法
Mar 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
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
discuz安全提问算法
2007/06/06 PHP
PHP 动态随机生成验证码类代码
2010/04/09 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
使用jquery写个更改表格行顺序的小功能
2014/04/29 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
javaScript基础详解
2017/01/19 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
用Python给文本创立向量空间模型的教程
2015/04/23 Python
python3实现磁盘空间监控
2018/06/21 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
Python3 合并二叉树的实现
2019/09/30 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
应届毕业生自我鉴定范文
2013/12/27 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
班主任先进事迹材料
2014/12/17 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python