时间:2021-07-01 10:21:17 帮助过:11人阅读
这里也可以把注册模式看成单例版本的context对象。
一个简单的Registry实现:
abstract class Registry{
abstract protected function get($key);
abstract protected function set($key, $value);
}
PHP支持三种类型的对象数据生命周期:一种是从接收到一次HTTP请求开始,请求处理完毕结束。另外一种是支持会话(session)级别的对象,即可以把对象数据存储在session中,PHP在
基于一次HTTP请求的数据注册模式:
class RequestRegistry extends Registry{
private static $instance;
private $values = array();
private function __construct(){}
static public 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, $value){
$this->values[$key] = $value;
}
static function set_request(Request $request){
self::$instance->set('request', $request);
}
static function get_request(){
return self::$instance->get('request');
}
}
会话请求的注册表:
class SessionRegistry extends Registry{
private $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, $value){
$_SESSION[__CLASS__][$key] = $value;
}
public function set_complex(Complex $complex){
self::$instance->set('complex', $complex);
}
public function get_complex(){
return self::$instance->get('complex');
}
}
支持应用程序级别的注册表:
class ApplicationRegistry extends Registry{
private $dir = "data";
private static $instance;
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 set($key, $value){
$this->values[$key] = $value;
$path = $this->dir . DIRECTORY_SEPARATOR . $key;
file_put_contents($path, serialize($value));
$this->mtimes[$key] = time();
}
protected function get($key){
$path = $this->dir . DIRECTORY_SEPARATOR . $key;
if(file_exists($path)){
$mtime = filetime($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;
}
static function get_dsn(){
return self::$instance->get('dsn');
}
static function set_dsn($dsn){
self::$instance->set('dsn', $dsn);
}
}
The end.
以上就介绍了关于注册表模式,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。