老生常谈PHP面向对象之注册表模式

 更新时间:2017年05月26日 08:09:48   投稿:jingxian  
下面小编就为大家带来一篇老生常谈PHP面向对象之注册表模式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

注册表模式可似把他想像成一个全局变量,所有的模块都从这个全局变量里存取数据,或者也可以想象成某个酒吧的许愿墙或留言版,上面的内容大家都可以看到,也可以改写。这里主要按作用域介绍三种类别的注册表类(请求级别、会话级别、应用程序级别)。

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导出带样式的Excel示例代码

    PHP导出带样式的Excel示例代码

    相信大家在工作的时候有客户会向你抱怨,软件为他们导出的Excel格式太难看了,这个时候我们就需要到处自定义样式的Excel了,那么或许这篇文章会对你有所帮助,有需要的可以参考借鉴。
    2016-08-08
  • CI框架简单分页类用法示例

    CI框架简单分页类用法示例

    这篇文章主要介绍了CI框架简单分页类用法,结合实例形式分析了CI框架简单分页类基本定义与使用方法,需要的朋友可以参考下
    2020-06-06
  • thinkPHP3.2.3结合Laypage实现的分页功能示例

    thinkPHP3.2.3结合Laypage实现的分页功能示例

    这篇文章主要介绍了thinkPHP3.2.3结合Laypage实现的分页功能,结合实例形式分析了thinkPHP3.2.3结合Laypage实现分页的model控制器与view视图相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • thinkPHP删除前弹出确认框的简单实现方法

    thinkPHP删除前弹出确认框的简单实现方法

    这篇文章主要介绍了thinkPHP删除前弹出确认框的简单实现方法,结合实例形式分析了thinkPHP前台HTML部分结合js控制弹出框效果,以及后台控制器的删除数据处理功能,需要的朋友可以参考下
    2016-05-05
  • 微信公众号实现会员卡领取功能

    微信公众号实现会员卡领取功能

    这篇文章主要介绍了微信公众号实现会员卡领取功能的相关资料,需要的朋友可以参考下
    2017-06-06
  • 如何修改Laravel中url()函数生成URL的根地址

    如何修改Laravel中url()函数生成URL的根地址

    这篇文章主要给大家介绍了关于如何修改Laravel中url()函数生成URL根地址的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用laravel具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • thinkphp特殊标签用法概述

    thinkphp特殊标签用法概述

    这篇文章主要介绍了thinkphp特殊标签用法,实例分析了in、between、present、Empty等标签的用法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • PHP使用Memcache时模拟命名空间及缓存失效问题的解决

    PHP使用Memcache时模拟命名空间及缓存失效问题的解决

    这篇文章主要介绍了PHP使用Memcache时模拟命名空间及缓存失效问题的解决,这里谈到的缓存失效主要针对高并发场景下取不到缓存的情况,需要的朋友可以参考下
    2016-02-02
  • Laravel学习教程之IOC容器的介绍与用例

    Laravel学习教程之IOC容器的介绍与用例

    最近在学习laravel,正好学习到了ioc容器,但发现网上这方面的资料较少,所以将自己学习的总结下,下面这篇文章主要给大家介绍了关于Laravel学习教程之IOC容器的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • php定义数组和使用示例(php数组的定义方法)

    php定义数组和使用示例(php数组的定义方法)

    这篇文章主要介绍了php定义数组和使用示例(php数组的定义方法),需要的朋友可以参考下
    2014-03-03

最新评论