• 技术文章 >后端开发 >php教程

    关于注册表模式

    2016-08-08 09:32:45原创967
    通常应用程序可以分为如下几个层次:
    1.前端视图
    2.命令控制
    3.业务逻辑
    4.数据处理
    前端视图负责显示对用户数据和收集用户输入数据,提交给命令控制层次。命令控制层收到数据进行一系列加工,委托业务逻辑层完成具体的任务。业务逻辑层调用数据处理模块完成用户数据的存储。
    但是前端提交的数据如何在几个层次直接恰当的传递呢?一种是通过前面命令模式提供的一个上下文(context)类来传递,把参数放置在context对象里面,从命令控制层传递到业务逻辑层,完成一系列操作后,通过context返回操作结果。第二种方式是修改命令对象的接口,来适配对应的数据传递。这两种方式有时候会破坏封装。我们知道单例模式提供了另外一种访问全局变量的方式。静态变量局部隐藏并通过接口可以轻松的设置获取对象属性。注册模式(Registry)正是利用了这种便利。

    这里也可以把注册模式看成单例版本的context对象。

    一个简单的Registry实现:

    	abstract class Registry{
    		abstract protected function get($key);
    		abstract protected function set($key, $value);
    	}
    PHP支持三种类型的对象数据生命周期:一种是从接收到一次HTTP请求开始,请求处理完毕结束。另外一种是支持会话(session)级别的对象,即可以把对象数据存储在session中,PHP在
    session_start的时候根据cookies里面存储的会话ID恢复不同的对象数据,可以达到同一用户多次请求访问同一对象数据的目的。还有一种是应用程序作用域级别的。即同一应用程序的
    不同使用者可以共享同一对象数据,这个操作需要PHP内置的序列化函数来完成。


    基于一次HTTP请求的数据注册模式:

    class RequestRegistry extends Registry{
    		private static $instance;
    		private $values = array();
    		
    		private function __construct(){}
    		
    		static public 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, $value){
    			$this->values[$key] = $value;
    		}
    		
    		static function set_request(Request $request){
    			self::$instance->set('request', $request);
    		}
    		
    		static function get_request(){
    			return self::$instance->get('request');
    		}
    	}
    会话请求的注册表:


    class SessionRegistry extends Registry{
    		private $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, $value){
    			$_SESSION[__CLASS__][$key] = $value;
    		}
    		
    		public function set_complex(Complex $complex){
    			self::$instance->set('complex', $complex);
    		}
    		
    		public function get_complex(){
    			return self::$instance->get('complex');
    		}
    	}
    支持应用程序级别的注册表:


    class ApplicationRegistry extends Registry{
    		
    		private $dir = "data";
    		private static $instance;
    		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 set($key, $value){
    			$this->values[$key] = $value;
    			$path = $this->dir . DIRECTORY_SEPARATOR . $key;
    			file_put_contents($path, serialize($value));
    			$this->mtimes[$key] = time();
    		}
    		
    		protected function get($key){
    			$path = $this->dir . DIRECTORY_SEPARATOR . $key;
    			if(file_exists($path)){
    				$mtime = filetime($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;
    		}
    		
    		static function get_dsn(){
    			return self::$instance->get('dsn');
    		}
    		
    		static function set_dsn($dsn){
    			self::$instance->set('dsn', $dsn);
    		}
    	}
    The end.


    以上就介绍了关于注册表模式,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:instance function nbsp key self
    上一篇:php-汉字拼音首字母工具类 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 系统讲解PHP缓存技术• 一文理解和实现现代PHP框架里的IOC容器• 深入了解PHP:用gdb调试源码• 实例介绍:使用Docker快速搭建多版本PHP开发环境• 实例详解PHP统计代码行数及文件数量的方法
    1/1

    PHP中文网