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

发布时间 - 2026-01-11 01:20:35    点击率:

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

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面向对象注册表模式  # thinkPHP中钩子的两种配置调用方法详解  # thinkPHP中钩子的使用方法实例分析  # PHP钩子与简单分发方式实例分析  # thinkPHP基于反射实现钩子的方法分析  # php面向对象值单例模式  # PHP面向对象程序设计组合模式与装饰模式详解  # 老生常谈PHP面向对象之命令模式(必看篇)  # 老生常谈PHP面向对象之解释器模式  # PHP面向对象之事务脚本模式(详解)  # 浅谈PHP面向对象之访问者模式+组合模式  # PHP钩子实现方法解析  # 注册表  # 给大家  # 应用程序  # 全局变量  # 大家都  # 也就  # 老生常谈  # 把他  # 希望能  # 可以看到  # 只有一个  # 这篇  # 主要功能  # 留言版  # 小编  # 者也  # 大家多多  # 文本文件  # 面向对象  # 中因 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在万网开始建站?分步指南解析  微信公众帐号开发教程之图文消息全攻略  Laravel distinct去重查询_Laravel Eloquent去重方法  HTML 中动态设置元素 name 属性的正确语法详解  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  奇安信“盘古石”团队突破 iOS 26.1 提权  php json中文编码为null的解决办法  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  javascript中的try catch异常捕获机制用法分析  音乐网站服务器如何优化API响应速度?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  PythonWeb开发入门教程_Flask快速构建Web应用  如何快速生成高效建站系统源代码?  如何在自有机房高效搭建专业网站?  使用C语言编写圣诞表白程序  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel怎么上传文件_Laravel图片上传及存储配置  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  网页设计与网站制作内容,怎样注册网站?  在centOS 7安装mysql 5.7的详细教程  微信小程序 闭包写法详细介绍  北京网站制作的公司有哪些,北京白云观官方网站?  简单实现Android文件上传  如何在Windows服务器上快速搭建网站?  原生JS获取元素集合的子元素宽度实例  如何快速搭建高效香港服务器网站?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  如何用AWS免费套餐快速搭建高效网站?  Laravel如何实现本地化和多语言支持?(i18n教程)  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel怎么在Controller之外的地方验证数据  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  手机软键盘弹出时影响布局的解决方法  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  青岛网站建设如何选择本地服务器?  新三国志曹操传主线渭水交兵攻略  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何将凡科建站内容保存为本地文件?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?