大家好!这是注册表模式的一个小单例。它非常普遍。在每种方法中自行创建单例。它不好吗?
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:我在问这个问题之前搜索过,但没有找到答案。也许是因为我的英语不太好。那么请指出我的正确方向。
感谢您提前提供任何帮助!
一个名为__call的魔术功能将自动运行在你调用的每个函数上。所以,用每次需要执行的代码创建一个名为__call的函数。 – 2013-03-22 16:14:04
真的吗?对我感到羞耻...谢谢。但它会在静态类上工作吗? – 2013-03-22 17:06:22
看一看:http://www.php.net/manual/en/language.oop5.overloading.php#object.callstatic – 2013-03-22 17:13:29