通常應用程式可以分為以下幾個層次:
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在
基於一次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教程有興趣的朋友有所幫助。