老生常谈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开发文件系统实例讲解
Oct 09 PHP
如何给phpadmin一个保护
Oct 09 PHP
收集的二十一个实用便利的PHP函数代码
Apr 22 PHP
PHP转换IP地址到真实地址的方法详解
Jun 09 PHP
PHP制作万年历
Jan 07 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
php 指定范围内多个随机数代码实例
Jul 18 PHP
基于php实现的验证码小程序
Dec 13 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
详解关于php的xdebug配置(编辑器vscode)
Jan 29 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 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中count获取多维数组长度的方法
2014/11/03 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
深入分析PHP设计模式
2020/06/15 PHP
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
ExtJs的Date格式字符代码
2010/12/30 Javascript
基于Jquery的简单图片切换效果
2011/01/06 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
2016/06/23 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
对于Python装饰器使用的一些建议
2015/06/03 Python
Python SQLite3简介
2018/02/22 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
机械工程系毕业生求职信
2013/09/27 职场文书
村优秀党员事迹材料
2014/01/15 职场文书
家长会邀请书
2014/01/25 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
个人求职自荐信范文
2015/03/06 职场文书
初中重阳节活动总结
2015/05/05 职场文书
高三毕业感言
2015/07/30 职场文书
音乐研修感悟
2015/11/18 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang