老生常谈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 相关文章推荐
Adodb的十个实例(清晰版)
Dec 31 PHP
PHP中ADODB类详解
Mar 25 PHP
php 读取shell管道传输过来的内容
Mar 01 PHP
收集的二十一个实用便利的PHP函数代码
Apr 22 PHP
php抓取页面与代码解析 推荐
Jul 23 PHP
探讨如何在php168_cms中提取验证码
Jun 08 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 PHP
php微信浏览器分享设置以及回调详解
Aug 01 PHP
php中二分法查找算法实例分析
Sep 22 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
Nov 28 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
使用PHP开发留言板功能
Nov 19 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实现二维数组按某列进行排序的方法
2016/11/18 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
vue父组件给子组件的组件传值provide inject的方法
2019/10/23 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
利用python实现数据分析
2017/01/11 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
简单了解django orm中介模型
2019/07/30 Python
如何写python的配置文件
2020/06/07 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
如何使用html5与css3完成google涂鸦动画
2012/12/16 HTML / CSS
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
Linux文件系统类型
2012/09/16 面试题
普师专业个人自荐信范文
2013/11/26 职场文书
房屋买卖委托公证书
2014/04/08 职场文书
工商管理专业自荐信
2014/06/03 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
机动车登记业务委托书
2014/10/08 职场文书
学生个人总结范文
2015/02/15 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
golang中字符串MD5生成方式总结
2021/07/04 Golang
java项目构建Gradle的使用教程
2022/03/24 Java/Android
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python
python三子棋游戏
2022/05/04 Python