Php 维护:单例与依赖注入

Php 维护:单例与依赖注入,php,dependency-injection,singleton,Php,Dependency Injection,Singleton,我有一个由很多类组成的脚本。在类的函数中执行了大量mysql操作。我想在整个脚本中使用一个数据库句柄。因此,单例方法或依赖注入(DI)可以完成这项工作 但是,我想知道,从维护的角度来看,使用Singleton是更有效的方法,这一点是否正确: 假设我的所有(父)类最终都扩展了singleton类。因此,为了更改有关获取数据库句柄的内容,我只需要修改singleton类。特别是,在添加新类或类似类时,我不必考虑任何问题,因为通过扩展Singleton类的相应类,数据库句柄将始终存在 相反,在使用DI

我有一个由很多类组成的脚本。在类的函数中执行了大量mysql操作。我想在整个脚本中使用一个数据库句柄。因此,单例方法或依赖注入(DI)可以完成这项工作

但是,我想知道,从维护的角度来看,使用Singleton是更有效的方法,这一点是否正确:

假设我的所有(父)类最终都扩展了singleton类。因此,为了更改有关获取数据库句柄的内容,我只需要修改singleton类。特别是,在添加新类或类似类时,我不必考虑任何问题,因为通过扩展Singleton类的相应类,数据库句柄将始终存在

相反,在使用DI时,我必须提供代码,用于在每个脚本中创建数据库句柄,该脚本可以作为起点(并将句柄传递给创建的实例)。例如,在script1.php、script2.php、script3.php等中。因此,必须在每个脚本、script1.php、script2.php、script3.php等中修改获取数据库句柄的方式


在这方面,前一种方法在我看来比后一种好得多。还是我要监督一些重要的事情?

让基类扩展数据库句柄的想法似乎是错误的。您的模型类不是某种形式的数据库类的扩展。将事物作为DI传递也允许单元测试更好地锻炼被测试的类。我投票结束这个问题,因为这种类型的设计和工程问题更适合,因为我确实认为singleton用于描述对象,而不是类。一般来说,扩展基类不会使它成为单例。一般来说,对于大型项目(即,您希望在6到12个月内仍能维护的任何项目),我绝对建议不要使用单例,并鼓励依赖注入。当事情变得足够复杂,以至于您认为测试真的很有帮助时,如果您选择DI路线,您会非常高兴,如果您选择单例路线,您会非常糟糕,因为您无法单独测试与另一个紧密耦合的类,而另一个类与数据库紧密耦合。