老生常谈PHP面向对象之注册表模式


Posted in PHP onMay 26, 2017

注册表模式可似把他想像成一个全局变量,所有的模块都从这个全局变量里存取数据,或者也可以想象成某个酒吧的许愿墙或留言版,上面的内容大家都可以看到,也可以改写。这里主要按作用域介绍三种类别的注册表类(请求级别、会话级别、应用程序级别)。

namespace woo\base;

//基类
abstract class Registry {
  abstract protected function get($key);
  abstract protected function set($key,$val);
}

//请求级别,他的生存周期通常为从用户发起一个请求到后台程序回复这个请求为止
class RequestRegistry extends Registry{
  private $values = array();
  private static $instance;
  
  private function __construct (){}

  static function instance(){// 单例,即这个类只有一个唯一的实例
    if(!isset(self::$instance)){
      self::$instance = new self();
    }
    return self::$instance;
  }
  
  protected function get($key){
    if(isset($this->values[$key]){
      return $this->values[$key];
    }
    return null;
  }
  
  protected function set($key,$val){
    $this->values[$key] = $val;
  }
  
  static function getRequest(){
    return self::instance()->get('request');
  }
  
  static function setRequest(\woo\controller\Request $request){//\woo\controller\Request 主要功能是处理用户请求信息的一个类
    return self::instance()->set('request',$request);
  }
}

//会话级别,此示例中类的生存周期主要还是看SESSION的生存时间
class SessionRegistry extends Registry{
  private static $instance;
  private function __construct (){
    session_start();
  }
  
  static function instance(){
    if(!isset(self::$instance)){
      self::$instance = new self();
    }
    return self::$instance;
  }
  
  protected function get($key){
    if(isset($_SESSION[__CLASS__][$key])){
      return $_SESSION[__CLASS__][$key];
    }
    return null;
  }
  
  protected function set($key,$val){
    $_SESSION[__CLASS__][$key] = $val;
  }
  
  function setComplex(Complex $complex){
    self::instance()->set('complex',$complex);
  }
  
  function getComplex(){
    return self::instance()->get('complex');
  }
}

//应用程序级别,此示例中因相关的值是保存在文本文件中,所以只要文件存在,保存的值也就一直存在
 class ApplicationRegistry extends Registry{
  private Static $instance;
  private $freezedir = 'data';
  private $values = array();
  private $mtimes = array();

  private function __construct (){}
   
  static function instance(){
    if(!isset(self::$instance)){
      self::$instance = new self();    
    }
    return self::$instance;
  }
  
  protected function get($key){
    $path = $this->freezedir . DIRECTORY_SEPARATOR . $key; // 保存值的文件的路径
    if(file_exists($path)){
      clearstatcache();   // 清除filemtime缓存的上次记录的文件修改时间
      $mtime = filemtime($path);
      if(!isset($this->mtimes[$key])){
        $this->mtimes[$key] = 0;
      }
      if($mtime > $this->mtimes[$key]){// 文件内容假如被修改过,那么就要重新获取里面的值
        $data = file_get_contents($path);
        $this->mtimes[$key] = $mtime;
        return ($this->values[$key] = unserialize($data));
      }
    }
    if(isset($this->values[$key])){
      return $this->values[$key];
    }
    return null;
  }
  
  protected function set ($key,$val){
    $this->values[$key] = $val;
    $path = $this->freezedir . DIRECTORY_SEPARATOR . $key;
    file_put_contents($path,serialize($val));
    $this->mtimes[$key] = time();
  }
  
  static function getDSN(){
    return self::instance()->get('dsn');
  }
  
  static function setDSN($dsn){
    return self::instance()->set('dsn',$dsn);
  }
   
 }

以上这篇老生常谈PHP面向对象之注册表模式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
让你的PHP同时支持GIF、png、JPEG
Oct 09 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
Feb 16 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
Php中文件下载功能实现超详细流程分析
Jun 13 PHP
深入php之规范编程命名小结
May 15 PHP
深入PHP5中的魔术方法详解
Jun 17 PHP
浅析php原型模式
Nov 25 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
php用正则判断是否为数字的方法
Mar 25 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
Yii框架中sphinx索引配置方法解析
Oct 18 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 #PHP
Yii框架实现多数据库配置和操作的方法
May 25 #PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 #PHP
[原创]php正则删除html代码中class样式属性的方法
May 24 #PHP
PHP 年月日的三级联动实例代码
May 24 #PHP
php验证码生成器
May 24 #PHP
php批量修改表结构实例
May 24 #PHP
You might like
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
[52:03]Secret vs VG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
理解Python中的With语句
2015/02/02 Python
Python2.x与Python3.x的区别
2016/01/14 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
python模拟实现斗地主发牌
2020/01/07 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
小班秋游活动方案
2014/02/22 职场文书
文秘求职信范文
2014/04/10 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
单位实习介绍信
2015/05/05 职场文书
入党积极分子群众意见
2015/06/01 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python