【问题标题】:Should an object save to the database on setting property (e.g. a Blog Post object)对象是否应在设置属性时保存到数据库(例如博客文章对象)
【发布时间】:2012-05-05 22:58:39
【问题描述】:

我开始接触更多面向对象的 PHP 并为这些对象编写测试。我的主要问题是:如果我有一个Blog_Post 对象,并且我调用$post->setCategory( 'Foo' ),是否应该直接保存到数据库中?

我问的原因是单元测试,我经常不想将数据库用于这类事情,因为那不是我要测试的。

我看到人们建议做类似的事情

function __construct( PDO $db )

传入要使用的数据库对象,然后在测试时使用mock。但是,我真的不喜欢总是通过调用 Blog_Post 类来实例化我的数据库对象的想法。

这是在 WordPress 的范围内,它基本上没有 OO 方法 - 在我当前的 Blog_Post 中,setter 方法只会调用 DB(通过全局 $wpdb!!(我知道!))。

我真的很想知道,这种情况下阻力最小的路径的一般模式是什么。 Blog_Post 会只写它自己,还是可能会使用“save()”方法来实际将所有设置的属性推送到数据库?或者在调用 setter 之前在对象“setSaveToDB(false)”上设置一个标志。

谢谢,希望这有点意义!

【问题讨论】:

  • 简短回答:否。将加载保存到另一层。
  • @hakre 谢谢,正是我想要的——一个直接的答案:)
  • 我将其添加为答案。

标签: php wordpress unit-testing


【解决方案1】:

如果您希望获得任何类型的性能,那么在对象上使用 ->save() 函数比在设置属性时保存更可取。如果每次设置属性时都写入数据库,则具有 7 个属性的对象将向数据库写入 7 次,如果您有保存功能,则所有 7 个属性仅使用一次写入。由于打开数据库连接是数据库中最慢的功能,因此您需要尽量减少单独的读/写次数。一般而言,打开与数据库的连接并写入一行与打开连接并写入 100000 行所花费的时间大致相同。 SQL 在处理大型数据集时速度很快,但打开连接并找到正确的读/写位置非常慢。

希望这会有所帮助:-)

【讨论】:

    【解决方案2】:

    简答:不。委托加载,保存到另一层。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      相关资源
      最近更新 更多