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 文章中的远程图片采集到本地的代码
Jul 30 PHP
php模拟asp中的XmlHttpRequest实现http请求的代码
Mar 24 PHP
PHP 实现explort() 功能的详解
Jun 20 PHP
php对图像的各种处理函数代码小结
Jul 08 PHP
SSO单点登录的PHP实现方法(Laravel框架)
Mar 23 PHP
PHP sleep()函数, usleep()函数
Aug 25 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 04 PHP
Nginx+php配置文件及原理解析
Dec 09 PHP
thinkphp 获取控制器及控制器方法
Apr 16 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/03/04 星际争霸
PHP5+UTF8多文件上传类
2008/10/17 PHP
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
Vue.js实现大转盘抽奖总结及实现思路
2019/10/09 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
实例Python处理XML文件的方法
2015/08/31 Python
django反向解析和正向解析的方式
2018/06/05 Python
python获取txt文件词向量过程详解
2019/07/05 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
pandas中ix的使用详细讲解
2020/03/09 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
知名企业招聘广告词大全
2014/03/18 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
个人优缺点总结
2015/02/28 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
团组织关系介绍信
2019/06/24 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python
python tkinter模块的简单使用
2021/04/07 Python
深入理解Vue的数据响应式
2021/05/15 Vue.js
python实现MD5进行文件去重的示例代码
2021/07/09 Python