老生常谈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面向对象之注册表模式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

时间: 2024-09-24 15:19:45

老生常谈PHP面向对象之注册表模式的相关文章

php设计模式入门-注册表模式

对于这个模式的应用场景不是太好总结,只是根据之前的经验,注册表类里面经常会存储一些别的地方需要用到的对象,比如redis.memcache类,还比如配置信息config类等,它扮演的是一个类似于全局变量的角色.具体的实现其实非常简单,如下代码所示: containers[$key] = $value; } public function get($key){ return isset($this->containers[$key]) ? $this->containers[$key] : nu

PHP设计模式 注册表模式_php技巧

下面是基本的注册表类的代码: 复制代码 代码如下: <?php class Registry { private static $instance; private $request;//注册表的内容类 private function __construct(){}//本类,不可实例化 static function instance(){//单例类,通过这个方法返回实例 if (!isset(self::$instance)){self::$instance=new self();} ret

PHP设计模式 注册表模式(多个类的注册)_php技巧

以前我也写过一个注册表类,不过那一个不能进行多个类的注册,下面用数组对类进行了存储. 复制代码 代码如下: <?php //基础类 class webSite {//一个非常简单的基础类 private $siteName; private $siteUrl; function __construct($siteName,$siteUrl){ $this->siteName=$siteName; $this->siteUrl=$siteUrl; } function getName(){

老生常谈PHP面向对象之命令模式(必看篇)

这个模式主要由 命令类.用户请求数据类.业务逻辑类.命令类工厂类及调用类构成,各个类的作用概括如下: 1.命令类:调用用户请求数据类和业务逻辑类: 2.用户请求数据类:获取用户请求数据及保存后台处理后返回的结果: 3.业务逻辑类:如以下的示例中验证用户登陆信息是否正确的功能等: 4.命令工厂类(我自己取的名字,哈哈):生成命令类的实例,这个类第一次看的时候我觉得有点屌,当然看了几遍了还是觉得很屌 :): 5.调用类:调用命令类,生成视图: 直接看代码: //命令类 abstract class

cmd模式下中文乱码的解决方法(注册表)_DOS/BAT

技术分析 其实大部分情况下,图方便的话,重做系统可以解决.但是情况一,客户不愿重做系统,主机是单位工作机,二,这个也不是中病毒,是注册表被篡改了,可以通过修改恢复. 解决方案 regedit (register edit) 打开注册表编辑器 然后找到 HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe 将CodePage选项将数值改为十六进制3a8或十进制"936 十六进制"000003a8"或十进制"93

保护Windows注册表

保护注册表是很重要的,有很多不同的工具可以实现这一目的.当没有安全设置时,用户可能的错误会更多.幸运的是,他们可以有几中方法来保护Windows注册表,在注册表失败时他们可以用额外的拷贝来恢复注册表.下面就是其中的一些方法:   1.使用windows备份软件   注:Win95和Win98备份程序有部分区别,在这里只讲Win98的备份程序.   Win98中包括一个备份程序.当安装Win98时如果你选择"自定义安装",或者你可以在控制面板中的添加/删除程序里安装它.当你安装了这个备份

javaweb-网页调用ocx控件打开或创建注册表的权限问题

问题描述 网页调用ocx控件打开或创建注册表的权限问题 在某几个win7 64位笔记本上, 通过服务器页面调用ocx读取注册表会提示无权限的现象,但使用本地html文件调用没问题, 不知是何原因,求大侠给点提示 解决方案 又试了一下,使用世界之窗浏览器可以正常使用了.但不明白为何? 解决方案二: ie本地file协议浏览(intranet)和http访问(internet)使用的是不同的安全设置,你按照本地的intranet安全配置internet安全设置 不过你这种需求没什么意义,只能针对特殊

一步一步教你用JS和INF编辑注册表

js|注册表 JScript小知识:JScript是一种解释型的.基于对象的脚本语言.尽管与C++这样成熟的面向对象的语言相比,JScript的功能要弱一些,但对于它的预期用途而言,JScript的功能已经足够大了.JScript程序是语句的集合,一条Jscript语句相当于英语中的一个完整句.Jscript语句将表达式组合起来,完成一个任务.一条语句由一个或多个表达式.关键字或者运算符(符号)组成.典型地,一条语句写一行,尽管一条语句可以超过两行或更多行.两条或更多条语句也可以写在同一行上,语

WIN98注册表编辑器的常用操作

注册表 WIN98注册表编辑器的常用操作注册表编辑器是一个可以让你改变系统注册设定的高级工具,有经验的Windows用户可以通过编辑注册表改变系统设定. 启动注册表编辑器的方法是执行Windows文件夹下的REGEDIT.EXE.如果注册表中有错误,计算机可能不能正常运行.如果发生这种情况,可以将注册表信息恢复到上次启动计算机时的状态.下面详细介绍Win98注册表编辑器常用的操作. 一.恢复注册表 1.单击"开始",再单击"关闭系统": 2.单击"重新启动