2012-02-11 61 views
0

我一直建议不要为我的数据库类使用单例模式。我还没有完全理解它有什么缺点,无论如何,似乎在这一点上达成了一致,所以我遵循了这个规则。PHP:共享数据库连接或创建一个新的?

但是,一般在PHP中共享类的实例是坏习惯吗?在这里提供的两个例子中哪一个最好?事实上,我使用第一种方法的单身模式?

//semi-pseudo Code 

Class DB extends mysqli{ 
    // 
} 

Class A { 
    $db; //Of type Class DB, initialized in the constructor. 

    //In some method 

    //Should I do this, so sharing the data base connection? 
    $b = new DB($db); 

    // OR 

    // Should I instantiate a new instance? 
    $newDb = new DB(); 
    $b = new B ($newDb); 

} 

Class B { 
    $db;//Of type Class DB initialized in the constructor. 

我有一类DB是数据碱基延伸..

我有一类与类型DB中的一员。

A类需要创建一个B类的实例,而B类的实例又有一个DB类型的成员。

我使用依赖注入模式,使A应传递一个数据库实例B.

我应该实例化一个新的数据库实例传递到B,或者我可以只传递给A的数据库实例的引用。

回答

2

在PHP中使用Singleton模式没有任何问题,就像任何语言一样,太多的东西都可能表示设计不佳。

也就是说,Singleton非常适合数据库访问。有没有人证明为什么它被认为是一个坏主意?

对Singleton的主要争论是难以测试,因为你不能用单元测试套件来嘲笑它们。就我个人而言,我尽量避免在我的测试中使用模拟对象(尤其是w/PHPUnit),所以通常无关紧要。

+0

+1有关单身人士糟糕的一面的解释 – Svisstack 2012-02-11 09:56:57

+0

这里是参数:http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323 – 2012-02-11 09:58:58

+0

是的,这是主要的参数,但你可以把你的单例实现在一个接口后面,所以你可以嘲笑它 – 2012-02-11 10:01:24

0

我应该实例化一个新的数据库实例传递到B,或者我可以只 传递给A的数据库实例的引用。

当然,您必须将A的数据库实例的引用传递给B类。

+0

为什么它更好? – 2012-02-11 10:00:23

+0

如果您的要求是共享数据库实例,则必须将其作为参考传递给B类。 无论你使用Singleton还是DI,这只是关于如何在A类中获取数据库实例。但是将它从A传递给B应该仅由参考文献执行。 – 2012-02-11 10:09:00

+0

与Singleton相比,你根本不必传递实例。大多数Singleton实现提供了一个getInstance()方法或类似的方法,因此DB :: getInstance()方法可以在类A和B的实例内独占地调用,但实例实际上是相同的,这就是Singleton的工作方式。你当然也可以绕过这个例子,但是为什么还要带着Singleton呢。 – quickshiftin 2012-02-11 10:25:35