【问题标题】:PDO & custom Database wrapper class: static or instance? [closed]PDO 和自定义数据库包装类:静态还是实例? [关闭]
【发布时间】:2012-07-12 09:55:17
【问题描述】:

我在 PHP 中寻找一个好的 PDO 包装类;由于在我所见的课程中没有一个课程适合我的需要,我决定编写自己的课程,增强我之前已经编写的课程,使用现在可怕的mysql_* 函数来集成本机转义、db-agnosticity、prepared statements 和以此类推。

我想知道的是,开发和使用这样的类的最佳方法是什么?一种选择是通过实例:

$db = new Database();
$db->query("SELECT this FROM that");

另一个是静态方法:

DB::query("SELECT foo FROM bar WHERE answer=42");

我看到一些框架(例如 Joomla API)更喜欢使用第一种方法,但我不确定第二种方法可能存在哪些缺陷。

你有什么见解吗?

【问题讨论】:

  • 如果你不为此使用静态上下文,那么单元测试的生活会更轻松,所以我建议使用第一种方法。但是我什至建议使用像 Doctrine2 这样的 ORM。
  • 第一个通常是首选,因为 1) 静态很难进行单元测试,2) 有可能连接到两个不同的数据库,虽然这种情况很少见,但它可能会发生,并且是最好的处理方式那只是有两个不同的数据库实例。
  • 使用静态方法,您必须创建一堆方法来映射所有 PDO 方法。使用您不使用的实例,您将获得更好的 IDE 支持。
  • @bcmcfc - 有什么证据表明您获得了更好的 IDE 支持,或者它来自您的头脑?
  • 来吧。这些问题中的另一个?那里有大量关于设计和实例与静态的信息。去阅读,你的决定会为你做出......

标签: php mysql oop pdo


【解决方案1】:

我个人认为不需要 PDO 包装类(PDO 本身就是一个数据库包装类)。

但是,如果您想这样做,请作为实例进行,原因如下:

  1. 这更有意义,您可能需要多个数据库连接。
  2. 它更易于使用。
  3. 它使用更少的全局空间,which is evil
  4. 这让我很开心。

所以是的,实例是要走的路,尽管我只会使用原生 PDO 来完成大多数任务。

【讨论】:

  • 需要对某些数据(具有特定的自定义操作和类)采用更结构化的方法,它可以更好地与我正在开发的框架集成。
  • @Cranio:PDO 的结构很有意义。您有一个 PDO 对象,它是一个连接对象,以及一个 PDOStatement 对象,它是一个描述语句(基本上是一个查询)的对象。我仍然认为没有必要改变,但正如我在回答中所说,如果你必须这样做,那就是要走的路。
  • 任何能让真理快乐的事情。
  • @deceze:除非你想见 The Gate。
  • @Cranio:您可能不是在寻找数据库适配器,而是如何进行数据映射。 i.stack.imgur.com/JRjML.jpg
【解决方案2】:

数据库类的静态实例很方便,因为不必将对象作为参数传递给函数/方法或调用global($db),您只需调用$db = Database::instance(),而不是实例化您有权访问的新对象单身人士。

这取决于您希望应用程序如何工作。

【讨论】:

  • 单例方法正是我迄今为止所使用的。但我经常看到非静态方法,想知道为什么......
  • 是的,no
  • 为什么这个答案被否决了?其实还不错。如果一个人想要getInstance() 可用而不是做 DI 或任何你想调用它的东西,静态的会很方便。这个答案只是列出了两种可能性,并没有涵盖所有的可能性,但我认为任何有一点智慧的人都可以理解它的含义。
  • @N.B.:静态函数与普通函数没有什么不同。它是程序性的,这将其降低到程序性 mysqli 和 mysql_* 的级别。数据库连接是经典的 OOP。
  • 你知道什么是真正的方便吗?一个全局变量。它以英里为单位击败静态。 Static 适合那些想在朋友面前看起来很酷的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
相关资源
最近更新 更多