首頁 >後端開發 >php教程 >關於註冊表模式

關於註冊表模式

WBOY
WBOY原創
2016-08-08 09:32:451609瀏覽

    通常應用程式可以分為以下幾個層次:
    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