PHP:共享数据库连接还是创建新连接?

PHP:共享数据库连接还是创建新连接?,php,design-patterns,singleton,Php,Design Patterns,Singleton,有人建议我不要在我的数据库类中使用单例模式。我还没有完全理解它的缺点是什么,无论如何,这一点似乎是一致的,所以我遵循规则 但是,在PHP中共享类实例通常是一个坏习惯吗?从这里提供的两个示例中,哪一个最好?事实上,我在第一种方法中使用了单例模式 //semi-pseudo Code Class DB extends mysqli{ // } Class A { $db; //Of type Class DB, initialized in the constructor.

有人建议我不要在我的数据库类中使用单例模式。我还没有完全理解它的缺点是什么,无论如何,这一点似乎是一致的,所以我遵循规则

但是,在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类

我有一个类别A,成员类型为DB

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

我使用依赖注入模式,所以A应该将一个DB实例传递给B


我应该实例化一个新的DB实例来传递给B,还是只传递一个对a的DB实例的引用。

在PHP中使用单例模式没有什么错,就像任何语言一样,太多的东西都可能表明设计不好

也就是说,Singleton非常适合数据库访问。有人证明这是个坏主意吗

反对单例测试的主要理由是测试的难度,因为您不能用单元测试套件来模拟它们。就我个人而言,我在测试中尽量避免使用模拟对象(尤其是w/PHPUnit),所以这通常并不重要

我应该实例化一个新的DB实例来传递给B,还是可以 传递对数据库实例的引用


当然,您必须将a的DB实例的引用传递给B类。

这里有一个参数:是的,这是主要参数,但是您可以将您的单例实现放在接口后面,这样您就可以模拟它。有一些方法可以解决这个问题,但我更喜欢我提到的选择,首先要避免模拟,若你们的需求是共享DB实例,你们必须把它作为引用传递到B类中。无论您使用Singleton还是DI,这只是关于如何在类中获取DB实例的问题。但是从A到B的传递应该只由ref执行。对于Singleton,您根本不需要传递实例。大多数单例实现都提供了getInstance()方法或类似方法,因此DB::getInstance()方法可以从类a和B的实例中独占调用,但是实例实际上是相同的,这就是单例的工作方式。当然,你也可以传递这个例子,但是为什么还要麻烦我们使用单例呢?谢谢你介绍单例生活,但是我已经读过GoF的书,并且在我的项目中使用了很多单例。我回答的问题是
我应该实例化一个新的DB实例来传递给B,还是只传递对a的DB实例的引用。
,这就是为什么您的评论与我的答案不相关。