本篇文章主要介绍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);
}
}相关推荐:
立即学习“PHP免费学习笔记(深入)”;
享有盛誉的PHP高级教程,Zend Framework核心开发人员力作,深入设计模式、PHP标准库和JSON 。 今天,PHP已经是无可争议的Web开发主流语言。PHP 5以后,它的面向对象特性也足以与Java和C#相抗衡。然而,讲述PHP高级特性的资料一直缺乏,大大影响了PHP语言的深入应用。 本书填补了这一空白。它专门针对有一定经验的PHP程序员,详细讲解了对他们最为重要的主题
468
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号