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 相关文章推荐
初学者入门:细述PHP4的核心Zend
Sep 05 PHP
通过ODBC连接的SQL SERVER实例
Oct 09 PHP
几个学习PHP的网址
Nov 25 PHP
对squid中refresh_pattern的一些理解和建议
Apr 17 PHP
PHP clearstatcache()函数详解
Mar 02 PHP
解析php时间戳与日期的转换
Jun 06 PHP
ThinkPHP模板中数组循环实例
Oct 30 PHP
PHP四种基本排序算法示例
Apr 09 PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 PHP
Laravel使用RabbitMQ的方法示例
Jun 18 PHP
php中文语义分析实现方法示例
Sep 28 PHP
Laravel5.1 框架控制器基础用法实例分析
Jan 04 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
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
深入php中var_dump方法的使用详解
2013/06/24 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
用JS剩余字数计算的代码
2008/07/03 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
vue中slot(插槽)的介绍与使用
2018/11/12 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
2015/12/24 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
django用户登录和注销的实现方法
2018/07/16 Python
python3.6的venv模块使用详解
2018/08/01 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
优秀员工自荐书
2013/12/19 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
专题民主生活会对照检查材料思想汇报
2014/09/29 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
暂住证证明
2015/06/19 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书