老生常谈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 相关文章推荐
第1次亲密接触PHP5(2)
Oct 09 PHP
用PHP实现将GB编码转换为UTF8
Nov 25 PHP
php中的时间显示
Jan 18 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
Jul 19 PHP
php判断ip黑名单程序代码实例
Feb 24 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 PHP
PHP实现微信网页授权开发教程
Jan 19 PHP
laravel中的错误与日志用法详解
Jul 26 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
Yii2数据库操作常用方法小结
May 04 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
浅谈PHPANALYSIS提取关键字
Mar 08 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
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
番茄的表单验证类代码修改版
2008/07/18 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
2014/07/17 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
用pickle存储Python的原生对象方法
2017/04/28 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
django模板语法学习之include示例详解
2017/12/17 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
python的sys.path模块路径添加方式
2020/03/09 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
写好自荐信的几个要点
2013/12/26 职场文书
《母鸡》教学反思
2014/02/25 职场文书
创业大赛策划书
2014/03/01 职场文书
元旦晚会感言
2014/03/12 职场文书
关爱残疾人标语
2014/06/25 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
项目合作意向书
2015/05/08 职场文书
红色革命电影观后感
2015/06/18 职场文书
社区服务理念口号
2015/12/25 职场文书
Java实现简易的分词器功能
2021/06/15 Java/Android