PHP物件導向之註冊表模式詳解

來源:互聯網
上載者:User
本篇文章主要介紹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);  }    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.