【问题标题】:What are the disadvantages of using a PHP database class as a singleton?将 PHP 数据库类用作单例有哪些缺点?
【发布时间】:2011-03-08 15:41:49
【问题描述】:

使用 PHP 数据库类作为singleton 有什么缺点?

【问题讨论】:

    标签: php singleton


    【解决方案1】:

    缺点与任何使用单例模式的类相同:

    【讨论】:

      【解决方案2】:

      如果您的 DB 类被构建为仅连接到单个数据库,那么当您的脚本需要连接到 2 个两个独立的数据库时,您将遇到问题。但是,您可以构建单例类来接受多个服务器配置,然后在单例中管理它们。

      否则,将数据库类设计为单例是一种很有意义的做法,因为您可以严格控制脚本在任何给定时间建立的连接数。

      【讨论】:

      • 当你必须处理多个数据库时,然后使用“注册表”设计模式(它看起来像一个单例关联数组),并使用连接 DSN 作为注册表键。
      • 注册表模式是一个糟糕的解决方案。只需使用 multiton 并提供键/值对(其中键是连接的名称,例如“connection_1”,值是连接信息(用户名/密码、主机、数据库名称等))并拥有您的所有存储在 multiton 中的连接对象。注册表对象实际上没有任何位置,因为它们只不过是美化的全局变量。
      • @Adrian,我完全同意。使用单例/多例模式的重点是不惜一切代价避免在同一脚本中创建第二个数据库连接。注册表模式似乎无法解决这里存在的任何问题。
      【解决方案3】:

      您不能使用两个数据库连接。你会想要这个,因为:

      • 您有两个数据库。
      • 当另一个事务已在“当前”数据库连接上运行时,您想在一个事务中执行某些操作。
      • 您想在单元测试中使用多个模拟数据库实例

      【讨论】:

        【解决方案4】:

        这使得针对它运行单元测试变得困难,并且也使得不可能有多个数据库连接。众所周知,全局变量有很多缺点,单例也不例外,只是它们是一个更“友好”的全局变量。

        我找到了一个很好的 article 和一个旧的 SO question

        【讨论】:

        • 我认为您的意思是每页“多个数据库连接”,不是吗?
        • 是的,这是真的。如果不使用单例,对于我正在开发的应用程序,我最终在每个时间点至少有 4 个数据库连接。我只是想知道什么问题更小......
        • @greg:是的,至少有一个经典的getInstance() Singleton。也许发帖人正在寻找数据库连接池之类的东西?
        猜你喜欢
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-08
        相关资源
        最近更新 更多