老生常谈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 相关文章推荐
ajax返回值中有回车换行、空格的解决方法分享
Oct 24 PHP
destoon实现首页显示供应、企业、资讯条数的方法
Jul 15 PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
Nov 14 PHP
php实现监控varnish缓存服务器的状态
Dec 30 PHP
THINKPHP2.0到3.0有哪些改进之处
Jan 04 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
Dec 22 PHP
PHP封装返回Ajax字符串和JSON数组的方法
Feb 17 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 PHP
php实现表单提交上传文件功能
May 28 PHP
centos7上编译安装php7以php-fpm方式连接apache
Nov 08 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 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
2006/10/09 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
jQuery 行级解析读取XML文件(附源码)
2009/10/12 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
Python中使用HTMLParser解析html实例
2015/02/08 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
Python求凸包及多边形面积教程
2020/04/12 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
蔻驰美国官网:COACH美国
2016/08/18 全球购物
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
父亲八十大寿答谢词
2014/01/23 职场文书
名人演讲稿范文
2014/09/16 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python