2013-03-22 19 views
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:我在问这个问题之前搜索过,但没有找到答案。也许是因为我的英语不太好。那么请指出我的正确方向。
感谢您提前提供任何帮助!

+1

一个名为__call的魔术功能将自动运行在你调用的每个函数上。所以,用每次需要执行的代码创建一个名为__call的函数。 – 2013-03-22 16:14:04

+0

真的吗?对我感到羞耻...谢谢。但它会在静态类上工作吗? – 2013-03-22 17:06:22

+0

看一看:http://www.php.net/manual/en/language.oop5.overloading.php#object.callstatic – 2013-03-22 17:13:29

回答

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带有封装的想法。但是singlton伤害了它。因为你的变数将全球可用。
另一件事是OOP带来了良好的代码重用性的想法。
但是如果你用一个叫singlton的函数创建一个类的话。下次你需要同时使用singlton和你的主要课程。

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

+0

如果你会阅读我的文章,你会看到 1我试图避免每次需要时添加额外的行\设置一些变种 2我想使用单身人士来确保我有在我的项目的任何一点相同的变数 – 2013-03-22 14:09:20

+0

好吧,如果鞋子合身,穿上它。但我认为你的代码应该有一些性能问题。只是本标志看到regult。我目前正在访问我的电脑。 – 2013-03-22 14:14:36

+0

这正是我问这个问题的原因 - 我对可能的性能问题的解释。 =) 顺便说一下,tnx的短语“如果鞋适合,穿它”,就像它。 – 2013-03-22 14:17:19

相关问题