老生常谈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 相关文章推荐
DedeCMS 核心类TypeLink.class.php摘要笔记
Apr 07 PHP
php allow_url_include的应用和解释
Apr 22 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
php注销代码(session注销)
May 31 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
Zend Framework页面缓存实例
Jun 25 PHP
php实现按照权重随机排序数据的方法
Jan 09 PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 PHP
php 浮点数比较方法详解
May 05 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
PHP实现的操作数组类库定义与用法示例
May 24 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将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
PHP创建XML接口示例
2019/07/04 PHP
jquery得到font-size属性值实现代码
2013/09/30 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
JavaScript实现的使用键盘控制人物走动实例
2014/08/27 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
机电专业大学生求职信
2013/10/04 职场文书
建筑专业自我鉴定
2013/10/22 职场文书
拾金不昧表扬信范文
2014/01/11 职场文书
幼儿园保育员辞职信
2014/01/12 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
欢迎新生标语
2014/10/06 职场文书
邀请书格式范文
2015/02/02 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书