老生常谈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 相关文章推荐
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
Oct 03 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
让ThinkPHP支持大小写url地址访问的方法
Oct 31 PHP
php中print(),print_r(),echo()的区别详解
Dec 01 PHP
PHP通过串口实现发送短信
Jul 08 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
Sep 19 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
May 05 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 PHP
php中钩子(hook)的原理与简单应用demo示例
Sep 03 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
文件上传程序的全部源码
2006/10/09 PHP
深入php数据采集的详解
2013/06/02 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
2014/12/22 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
vue实现信息管理系统
2020/05/30 Javascript
python引用DLL文件的方法
2015/05/11 Python
Python编码爬坑指南(必看)
2016/06/10 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
2018/10/26 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
华三通信H3C面试题
2015/05/15 面试题
建筑文秘专业个人求职信范文
2013/12/28 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
交警失职检讨书
2015/01/26 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书