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 Memcache 中实现消息队列
Nov 24 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
Mar 12 PHP
php把大写命名转换成下划线分割命名
Apr 27 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
谈谈php对接芝麻信用踩的坑
Dec 01 PHP
PHP的PDO预定义常量讲解
Jan 24 PHP
PHP实现数据四舍五入的方法小结【4种方法】
Mar 27 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
Apr 30 PHP
php解析非标准json、非规范json的方式实例
Dec 10 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 动态执行带有参数的类方法
2009/04/10 PHP
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
paypal即时到账php实现代码
2010/11/28 PHP
php中socket的用法详解
2014/10/24 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
PHP7 新增常量
2021/03/09 PHP
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
Json序列化和反序列化方法解析
2013/12/19 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
Python中input和raw_input的一点区别
2014/10/21 Python
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
python实现的简单RPG游戏流程实例
2015/06/28 Python
基于python实现KNN分类算法
2020/04/23 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
暑期实习鉴定
2013/12/16 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
环保志愿者活动总结
2014/06/27 职场文书
本科应届生求职信
2014/08/05 职场文书
信访稳定工作汇报
2014/10/27 职场文书
民事二审代理词
2015/05/25 职场文书
小学少先队工作总结2015
2015/05/26 职场文书