老生常谈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中str_replace函数使用小结
Oct 11 PHP
PHP Ajax中文乱码问题解决方法
Feb 27 PHP
php 应用程序安全防范技术研究
Sep 25 PHP
php中对2个数组相加的函数
Jun 24 PHP
php GUID生成函数和类
Mar 10 PHP
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
Aug 19 PHP
PHP内核学习教程之php opcode内核实现
Jan 27 PHP
php加密解密字符串示例
Oct 13 PHP
php实现文件上传及头像预览功能
Jan 15 PHP
详解json在php中的应用
Sep 30 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
Aug 26 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
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
Javascript - HTML的request类
2006/07/15 Javascript
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
基于jQuery的js分页代码
2010/06/10 Javascript
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
2015/05/12 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
js实现扫雷源代码
2020/11/27 Javascript
python中urlparse模块介绍与使用示例
2017/11/19 Python
python感知机实现代码
2019/01/18 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
python实现简易学生信息管理系统
2020/04/05 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
Pandas的Apply函数具体使用
2020/07/21 Python
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
出国签证在职证明
2014/01/16 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
素质教育培训心得体会
2016/01/19 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
python 如何在list中找Topk的数值和索引
2021/05/20 Python
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技