本篇文章主要介紹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); } }