大家好!这是注册表模式的一个小单例。它很常见。
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中的任何全局var时,我显然不想花费额外的行。在上面的示例中,我们可以省略调用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" } }
现在没关系!
所以,我想问的问题=)是否有任何未被注意的缺点使用这种方法?也许是一些不受欢迎的资源开销或其他什么?
答案 0 :(得分:0)
可能有人试图用悍马杀死一只蚂蚁
为什么你不喜欢我的想法:
class REG {
public function data($name, $value=null){
if(!$value) return $this->{$name};
$this->{$name} = $value;
}
}
$bin = new REG();
$bin->data('working','no');
echo $bin->data('working');
修改
你伤害了我的面向对象的心灵
嗯,你想创建一个存储粒子的桶,然后将它提供给每一类人 但是,如果将它们存放在垃圾箱中,然后将其交给需要它的人 OOP带有封装的概念。但是辛格尔顿伤害了它。因为您的vars将全球可用 另一件事是OOP带来了良好的代码可重用性的想法 但是如果你创建一个带有一些从singlton调用的函数的类呢?下次你需要同时使用singlton和你的主类。
所以,如果你决定使用singlton。然后它不是那么糟糕,因为很多人都使用它 但是,**我建议将变量作为参数传递给需要它的函数 感谢您有时间阅读它。我再也没有那么多经验,我只是17岁