加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

老生常谈PHP面向对象之注册表模式

发布时间:2021-01-16 19:54:25 所属栏目:PHP教程 来源:网络整理
导读:注册表模式可似把他想像成一个全局变量,所有的模块都从这个全局变量里存取数据,或者也可以想象成某个酒吧的许愿墙或留言版,上面的内容大家都可以看到,也可以改写。这里主要按作用域介绍三种类别的注册表类(请求级别、会话级别、应用程序级别)。 //基

注册表模式可似把他想像成一个全局变量,所有的模块都从这个全局变量里存取数据,或者也可以想象成某个酒吧的许愿墙或留言版,上面的内容大家都可以看到,也可以改写。这里主要按作用域介绍三种类别的注册表类(请求级别、会话级别、应用程序级别)。

//基类
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(woocontrollerRequest $request){      //woocontrollerRequest 主要功能是处理用户请求信息的一个类
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);
}

}

以上这篇老生常谈PHP面向对象之注册表模式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程之家。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读