大家!这是注册表模式的一个小单例。它很常见。
class REG {
private $_objects;
protected static $_instance;
private function __construct() {}
public static function getInstance() {
if (self::$_instance === NULL) self::$_instance = new self();
return self::$_instance;
}
public static function set($name, $object) {
self::$_instance->_objects[$name] = $object;
}
public static function get($name) {
return self::$_instance->_objects[$name];
}
public static function testMe() {
return self::$_instance;
}
private function __clone() {}
private function __wakeup() {}
}
使用它假设我们应该REG::getInstance()
首先调用任何所需的方法。
REG::getInstance();
REG::set('name','Denis');
var_dump(REG::testMe());
// object(REG)#1 (1) { ["_objects":"REG":private]=> array(1) { ["name"]=> string(5) "Denis" } }
一切正常!但是......因为我打算使用这个类来存储我的项目的全局变量,所以我显然不想每次需要访问 func 中的任何全局变量时都花费额外的代码。在上面的例子中,我们可以省略调用REG::getInstance()
并且在运行脚本时不会出错。唯一的区别是self::$_instance
现在将是 stdClass 的一个实例
REG::set('name','Denis');
var_dump(REG::testMe());
// object(stdClass)#1 (1) { ["_objects"]=> array(1) { ["name"]=> string(5) "Denis" } }
在这种特殊情况下,它没有任何区别,但是如果我们需要类的一些附加功能,这可能变得至关重要。另一种避免调用的方法是在我们类的每个方法上REG::getInstance()
加上if (self::$_instance === NULL) self::$_instance = new self();
一行:
class REG {
private $_objects;
protected static $_instance;
private function __construct() {}
public static function getInstance() {
if (self::$_instance === NULL) self::$_instance = new self();
return self::$_instance;
}
public static function set($name, $object) {
if (self::$_instance === NULL) self::$_instance = new self();
self::$_instance->_objects[$name] = $object;
}
public static function get($name) {
if (self::$_instance === NULL) self::$_instance = new self();
return self::$_instance->_objects[$name];
}
public static function testMe() {
if (self::$_instance === NULL) self::$_instance = new self();
return self::$_instance;
}
private function __clone() {}
private function __wakeup() {}
}
REG::set('name','Denis');
var_dump(REG::testMe());
// object(REG)#1 (1) { ["_objects":"REG":private]=> array(1) { ["name"]=> string(5) "Denis" } }
现在好了!
所以,我想问的问题=) 使用这种方法有没有被忽视的缺点?也许是一些不希望的资源开销或其他什么?
PS:在问这个问题之前我已经搜索过,但没有找到答案。也许是因为我的英语不是很好。那么请指点我正确的方向。
提前感谢您的帮助!