老生常談PHP面向?qū)ο笾?cè)表模式
注冊(cè)表模式可似把他想像成一個(gè)全局變量,所有的模塊都從這個(gè)全局變量里存取數(shù)據(jù),或者也可以想象成某個(gè)酒吧的許愿墻或留言版,上面的內(nèi)容大家都可以看到,也可以改寫。這里主要按作用域介紹三種類別的注冊(cè)表類(請(qǐng)求級(jí)別、會(huì)話級(jí)別、應(yīng)用程序級(jí)別)。
namespace woo\base;
//基類
abstract class Registry {
abstract protected function get($key);
abstract protected function set($key,$val);
}
//請(qǐng)求級(jí)別,他的生存周期通常為從用戶發(fā)起一個(gè)請(qǐng)求到后臺(tái)程序回復(fù)這個(gè)請(qǐng)求為止
class RequestRegistry extends Registry{
private $values = array();
private static $instance;
private function __construct (){}
static function instance(){ // 單例,即這個(gè)類只有一個(gè)唯一的實(shí)例
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 主要功能是處理用戶請(qǐng)求信息的一個(gè)類
return self::instance()->set('request',$request);
}
}
//會(huì)話級(jí)別,此示例中類的生存周期主要還是看SESSION的生存時(shí)間
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');
}
}
//應(yīng)用程序級(jí)別,此示例中因相關(guān)的值是保存在文本文件中,所以只要文件存在,保存的值也就一直存在
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緩存的上次記錄的文件修改時(shí)間
$mtime = filemtime($path);
if(!isset($this->mtimes[$key])){
$this->mtimes[$key] = 0;
}
if($mtime > $this->mtimes[$key]){ // 文件內(nèi)容假如被修改過,那么就要重新獲取里面的值
$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);
}
}
以上這篇老生常談PHP面向?qū)ο笾?cè)表模式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解如何實(shí)現(xiàn)phpoffice的excel導(dǎo)入功能解耦
這篇文章主要為大家介紹了詳解如何實(shí)現(xiàn)phpoffice的excel導(dǎo)入功能解耦,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
PHP的Yii框架中使用數(shù)據(jù)庫的配置和SQL操作實(shí)例教程
這篇文章主要介紹了PHP的Yii框架中使用數(shù)據(jù)庫的配置和SQL操作實(shí)例教程,Yii支持綁定多種數(shù)據(jù)庫,文中主要對(duì)各種查詢語句在Yii中的使用給出了例子,需要的朋友可以參考下2016-03-03
Laravel 5.5 異常處理 & 錯(cuò)誤日志的解決
今天小編就為大家分享一篇Laravel 5.5 異常處理 & 錯(cuò)誤日志的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10
Thinkphp實(shí)現(xiàn)MySQL讀寫分離操作示例
這篇文章主要介紹了Thinkphp實(shí)現(xiàn)MySQL讀寫分離的方法,需要的朋友可以參考下2014-06-06
Codeigniter的一些優(yōu)秀特性總結(jié)
本文總結(jié)了一下Codeigniter的一些優(yōu)秀特性,算是個(gè)人的一些心得分享,推薦給大家。2015-01-01
phpcms配置列表頁以及獲得文章發(fā)布時(shí)間
這篇文章主要介紹了phpcms配置列表頁以及獲得文章發(fā)布時(shí)間 ,需要的朋友可以參考下2017-07-07
PHP使用Guzzle發(fā)起的異步請(qǐng)求示例詳解
這篇文章主要為大家介紹了PHP使用Guzzle發(fā)起的異步請(qǐng)求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

