老生常谈PHP面向对象之注册表模式
注册表模式可似把他想像成一个全局变量,所有的模块都从这个全局变量里存取数据,或者也可以想象成某个酒吧的许愿墙或留言版,上面的内容大家都可以看到,也可以改写。这里主要按作用域介绍三种类别的注册表类(请求级别、会话级别、应用程序级别)。
namespacewoo\base; //基类 abstractclassRegistry{ abstractprotectedfunctionget($key); abstractprotectedfunctionset($key,$val); } //请求级别,他的生存周期通常为从用户发起一个请求到后台程序回复这个请求为止 classRequestRegistryextendsRegistry{ private$values=array(); privatestatic$instance; privatefunction__construct(){} staticfunctioninstance(){//单例,即这个类只有一个唯一的实例 if(!isset(self::$instance)){ self::$instance=newself(); } returnself::$instance; } protectedfunctionget($key){ if(isset($this->values[$key]){ return$this->values[$key]; } returnnull; } protectedfunctionset($key,$val){ $this->values[$key]=$val; } staticfunctiongetRequest(){ returnself::instance()->get('request'); } staticfunctionsetRequest(\woo\controller\Request$request){//\woo\controller\Request主要功能是处理用户请求信息的一个类 returnself::instance()->set('request',$request); } } //会话级别,此示例中类的生存周期主要还是看SESSION的生存时间 classSessionRegistryextendsRegistry{ privatestatic$instance; privatefunction__construct(){ session_start(); } staticfunctioninstance(){ if(!isset(self::$instance)){ self::$instance=newself(); } returnself::$instance; } protectedfunctionget($key){ if(isset($_SESSION[__CLASS__][$key])){ return$_SESSION[__CLASS__][$key]; } returnnull; } protectedfunctionset($key,$val){ $_SESSION[__CLASS__][$key]=$val; } functionsetComplex(Complex$complex){ self::instance()->set('complex',$complex); } functiongetComplex(){ returnself::instance()->get('complex'); } } //应用程序级别,此示例中因相关的值是保存在文本文件中,所以只要文件存在,保存的值也就一直存在 classApplicationRegistryextendsRegistry{ privateStatic$instance; private$freezedir='data'; private$values=array(); private$mtimes=array(); privatefunction__construct(){} staticfunctioninstance(){ if(!isset(self::$instance)){ self::$instance=newself(); } returnself::$instance; } protectedfunctionget($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]; } returnnull; } protectedfunctionset($key,$val){ $this->values[$key]=$val; $path=$this->freezedir.DIRECTORY_SEPARATOR.$key; file_put_contents($path,serialize($val)); $this->mtimes[$key]=time(); } staticfunctiongetDSN(){ returnself::instance()->get('dsn'); } staticfunctionsetDSN($dsn){ returnself::instance()->set('dsn',$dsn); } }
以上这篇老生常谈PHP面向对象之注册表模式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。