Singleton PHP - 数据库处理程序

时间:2010-07-18 21:21:11

标签: php design-patterns singleton

我最近一直在阅读关于单身人士模式的内容。在阅读其技术方面时,它似乎非常适合管理数据库处理程序等。但在阅读更广泛的资源之后,似乎开发者社区真的不喜欢这种模式。

我正在努力为这样的问题找到更好的解决方案 - 即一次只能初始化一个处理程序 - 那么为什么模式如此糟糕?这是过度使用还是只是根本上有缺陷?

Php是我正在使用的语言。

5 个答案:

答案 0 :(得分:8)

Singletons are glorified global variables。设计模式是为全局变量难以或不可能的语言创建的,或者被认为是不良实践的语言。 (事实上​​,大多数常见的设计模式都是针对限制性语言而设计的。其他语言中很多都是不必要的。)

PHP有全局变量。 PHP全局变量通常是一种不好的做法,但如果你需要使用它们它们确实存在。

但是,有几个原因你需要在PHP中使用Singleton。

当我在脚本中的任何一点调用getInstance(返回Singleton单个实例的方法的规范名称)时,单例很有用。直到那时,该对象不需要存在。如果对象是全局变量,则它必须已经存在,或者尝试引用该对象的代码首先需要实例化它。事实上,在任何可以使用的地方,都需要正确实例化。通过在getInstance中集中创建单个对象,您可以避免每次需要引用对象时都创建复制粘贴样板。

数据库对象通常在请求生命周期的早期创建,因此会浪费Singleton-ness的特定好处。

Singleton还有其他替代品可以通过其他方式完成工作。一个例子是dependency injection,这是一个奇特的术语,用于将新对象在构造时传递给对象的外部对象(例如数据库句柄)。然而,这可能是复杂或烦人的。做得正确可能涉及每次都注入相同对象的批次

另一个替代方案是Registry pattern,它实际上是一个容器,用于本来可以是全局的东西。如果您不喜欢全局变量,但不介意它们被有效地命名空间,那么这将是您想要的解决方案。

最后,选择一种方法来实现它,并在整个代码库中坚持使用这种方式。就个人而言,我是数据库对象的全球粉丝。

答案 1 :(得分:2)

有些人遵循这样的口号,认为单身人士是邪恶的,因为他们就像全局变量一样,使你的代码更难以耦合,更难以测试。

我认为这不是一个坏主意,我认为Singleton对数据库处理程序的效果非常好。它简单,直观,您可以更好地控制Singleton实例,而不是全局变量。

答案 2 :(得分:0)

Singleton模式没有任何问题,我一直都在使用它。

正如您所说,它是理想的资源,您应该只有一个实例并且应用程序是全局的。

我认为一些开发人员不喜欢它,因为可以通过此方法创建依赖项。阅读依赖注入,因为我认为它涵盖了为什么单身人士不好,但我不记得确切。

答案 3 :(得分:0)

我为大多数较小的网络应用程序使用单例数据库处理程序。当与外部配置文件和PDO结合作为数据库访问方法时,只要方法不是特定于应用程序模型(即getRow或getAll而不是getThing或getBreakfast),它仍然可以非常灵活地从一个项目转移到另一个项目。 。我只是尝试确保所有访问常量都是单独定义的。

单身人士的许多懊恼主要来源于比PHP更复杂的语言。

答案 4 :(得分:0)

除了全局变量之外,社区不喜欢Singletons,因为最终你有可能需要一个额外的类实例。例如,您可以使用Singleton进行数据库连接,直到您想要连接到2个数据库为止,它才能正常工作。此时,您要么重构整个应用程序,要么将单例复制粘贴到新类并使用它。无论哪种方式,你都可以在没有划桨的情况下上一条小溪。

然而,Singleton模式是一种设计模式,而不是一种实现。没有人说限制你到一个实例的代码必须在类中。我发现如果通过工厂方法实例化类,可以将单例实现放在工厂方法中。然后,如果有一天你需要一个新的实例,你可以添加一个新的工厂方法来做到这一点,因为类本身没有任何限制。当然,这个价格是你总是通过工厂而不是直接实例化你的单身人士。