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 相关文章推荐
一次编写,随处运行
Oct 09 PHP
BBS(php &amp; mysql)完整版(八)
Oct 09 PHP
php调用shell的方法
Nov 05 PHP
php格式化金额函数分享
Feb 02 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
修改WordPress中文章编辑器的样式的方法详解
Dec 15 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
php+jQuery+Ajax简单实现页面异步刷新
Aug 08 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
Jun 06 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
PHP进阶学习之Geo的地图定位算法详解
Jun 19 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通用检测函数集合
2006/11/25 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
$()JS小技巧
2007/07/21 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
python实现按任意键继续执行程序
2016/12/30 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
Python3 合并二叉树的实现
2019/09/30 Python
Python ATM功能实现代码实例
2020/03/19 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
超级实用的8个Python列表技巧
2020/08/24 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
医学专业五年以上个人求职信
2013/12/03 职场文书
怎样客观的做好自我评价
2013/12/28 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
民政局未婚证明
2015/06/15 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
angular4实现带搜索的下拉框
2022/03/25 Javascript