在每种方法中自我创造单身人士。这不好吗?

时间:2013-03-22 13:44:51

标签: php optimization resources singleton

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

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" } }

现在没关系!
所以,我想问的问题=)是否有任何未被注意的缺点使用这种方法?也许是一些不受欢迎的资源开销或其他什么?

PS:我在问这个问题之前已经搜索过了,但没有找到答案。也许是因为我的英语不是很好。那么请指出我正确的方向。
感谢您提前提供任何帮助!

1 个答案:

答案 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岁