老生常谈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生成EXCEL的东东
Oct 09 PHP
使用php4加速网络传输
Oct 09 PHP
缓存技术详谈―php
Dec 14 PHP
PHP跨时区(UTC时间)应用解决方案
Jan 11 PHP
PHP时间戳 strtotime()使用方法和技巧
Oct 29 PHP
php使用qr生成二维码的示例分享
Jan 20 PHP
php实现mysql封装类示例
May 07 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
浅谈COOKIE和SESSION区别
Jul 19 PHP
基于JQuery+PHP编写砸金蛋中奖程序
Sep 08 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
PDO::rollBack讲解
Jan 29 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
PHP5 面向对象(学习记录)
2009/12/02 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
PHP网站开发中常用的8个小技巧
2015/02/13 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
解决Layui数据表格显示无数据提示的问题
2019/11/14 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
举例区分Python中的浅复制与深复制
2015/07/02 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
python安装requests库的实例代码
2019/06/25 Python
心得体会怎么写
2013/12/30 职场文书
高中考试作弊检讨书
2014/01/14 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
工作总结与自我评价
2014/09/18 职场文书
委托函范文
2015/01/29 职场文书
捐款通知怎么写
2015/04/24 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书