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);
    }

 }
时间: 2024-07-30 20:31:50

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

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

对于这个模式的应用场景不是太好总结,只是根据之前的经验,注册表类里面经常会存储一些别的地方需要用到的对象,比如redis.memcache类,还比如配置信息config类等,它扮演的是一个类似于全局变量的角色.具体的实现其实非常简单,如下代码所示: <?php class Registry{ static $instance; public $containers = array(); static function getInstance(){ if(is_null(self::$instan

注册表模式

通常应用程序可以分为如下几个层次: 1.前端视图 2.命令控制 3.业务逻辑 4.数据处理 前端视图负责显示对用户数据和收集用户输入数据,提交给命令控制层次.命令控制层收到数据进行一系列加工,委托业务逻辑层完成具体的任务.业务逻辑层调用数据处理模块完成用户数据的存储. 但是前端提交的数据如何在几个层次直接恰当的传递呢?一种是通过前面命令模式提供的一个上下文(context)类来传递,把参数放置在context对象里面,从命令控制层传递到业务逻辑层,完成一系列操作后,通过context返回操作结果

PHP架构之注册表

啥是注册表模式?其实很简单! 注册表的作用是提供系统级别的对象访问功能.我们在编码时通常把"全局变量是不好的"当做信条.不过,凡事都有两面性,全局性的数据访问非常具有吸引力. 问题来了: 大多系统都分为几个层,每个层都只通过事先定义好的通道和相邻的层交流.对层的分享使程序变得灵活,替换或修改每个层可以最小化对系统其他部分的影响.但当你需要在一个层中获取不相邻另一个层所需要的信息时,该如何? 方案一:通过系统的层之间的联系将上下文信息从一个对象传递给另一个需要的对象:在系统中把这些信息从

Win 10 注册表设置护眼模式

做为一个 IT 民工来说整天对着电脑屏幕,会给我们的眼睛带来极大的伤害,所以我们要寻找一种护眼模式,以减弱电脑对我们眼睛的影响. 1.使用快捷键打开运行窗口. 2.打开注册表修改:[HKEY_CURRENT_USER\Control Panel\Colors] 下 Windows 键值为 202 232 207 ,值根据个人情况进行修改. 3.上面操作后并不完美休眠.睡眠.锁屏后会变白,俺是完全主义者,哈哈. 4.注册表修改:[HKEY_LOCAL_MACHINE\SOFTWARE\Micros

Windows内核函数(3) - 内核模式下的注册表操作

Windows内核函数(3) - 内核模式下的注册表操作 2010-12-13 13:37:16|  分类: 驱动编程 |  标签:status  hkey  ulsize  注册  kdprint  |举报|字号 订阅 注册表里的几个概念: 1.       创建关闭注册表项 NTSTATUS   ZwCreateKey(    OUT PHANDLE  KeyHandle,    IN ACCESS_MASK  DesiredAccess, //访问权限,一般为KEY_ALL_ACCLESS

内核模式下的注册表操作

注册表操作 注册表里的几个概念: 1.       创建关闭注册表项 NTSTATUS    ZwCreateKey(     OUT PHANDLE  KeyHandle,     IN ACCESS_MASK  DesiredAccess, //访问权限,一般为KEY_ALL_ACCLESS     IN POBJECT_ATTRIBUTES  ObjectAttributes,     IN ULONG  TitleIndex, //一般为NULL     IN PUNICODE_STRI

Windows平台使用C语言在用户模式下注册表的增删改查

一.Wiodws注册表介绍 Windows操作系统提供了一个称为“注册表”的中心存储设施作为系统的配置和管理中心.应用程序和内核通过访问注册表来读写各种配置.Windows同时提供了一些API供应用程序访问注册表,这些API函数在接到注册表访问请求后会将他们转发给内核的系统服务.然后内核会做出相应的处理. Widows注册表是一个树状结构,每一个节点是一个键或值.键是一个容器,好比文件系统中的文件夹,值存储的是数据,相当于文件系统的文件,键可以包含其它的键(目录)或值(文件).注册表的根目录称为

管理员模式下将当前路径下程序添加到注册表开机启动批处理命令

cd /d %~dp0reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v [注册表键名] /t REG_SZ /d %cd%\[可执行程序文件名] /fpause 以下为删除命令 reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v [注册表键名] pause 原文地址:https://www.

PHP 设计模式 笔记与总结(6)基础设计模式:工厂模式、单例模式和注册树模式

三种基础设计模式(所有面向对象设计模式中最常见的三种): ① 工厂模式:使用工厂方法或者类生成对象,而不是在代码中直接new 在 Common 目录下新建 Factory.php: <?php namespace Common; class Factory{ static function createDatabase(){ //$db = new \Common\Database; $db = new Database; return $db; } } index.php: <?php de