0

大家!这是注册表模式的一个小单例。它很常见。

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:在问这个问题之前我已经搜索过,但没有找到答案。也许是因为我的英语不是很好。那么请指点我正确的方向。
提前感谢您的帮助!

4

1 回答 1

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 带有封装的思想。但是单顿会伤害它。因为您的变量将在全球范围内可用。
另一件事是 OOP 带有良好的代码可重用性的想法。
但是,如果您创建一个具有从单例调用的某些函数的类怎么办。下次你需要同时使用 singlton 和你的主类。

所以,如果你下定决心使用singlton。然后它还不错,因为很多人都在使用它。
但是,** 我建议将您的变量作为参数传递给需要它的函数。
感谢您有时间阅读。再说一次,我没有那么多经验,我才 17 岁

于 2013-03-22T14:02:03.127 回答