代码之家  ›  专栏  ›  技术社区  ›  ryeguy

我有什么理由不从析构函数调用数据库吗?

  •  0
  • ryeguy  · 技术社区  · 14 年前

    我想创建一种数据映射器库,您可以在其中执行以下操作:

    $users = Users::getTable();
    $users->add($newUser1);
    $users->add($newUser2);
    

    现在 $users 包含2个用户记录,但它们尚未持久化到数据库。为了提高效率,我想一次把它们全部冲掉。我想要一个 flush() 方法执行此操作(不是问题),但我也希望在 $用户 表引用超出范围。有什么理由我不应该在析构函数中这样做吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Dean Harding    14 年前

    我建议一个更好的解决办法是 引发错误 在你的析构函数中如果 flush() 尚未显式调用方法。

    在这种情况下,最好是显式的并在析构函数中引发错误,以确保 刷新() (或“回滚”或您所称的任何操作)。通过提出一个错误,你也会得到一个真正的当面通知,说有什么地方出了问题,而如果你什么都不做,那么你可能不会注意到。

        2
  •  1
  •   Cristian Rodriguez    14 年前

    不保证当前的PHP解释器关闭顺序不会更改,并且您的数据库句柄在被调用之前可能会被销毁。(这就是为什么它是非法的BTW。)

        3
  •  1
  •   Johannes Rudolph    14 年前

    谁能保证在调用析构函数时数据库是可用的?

    垃圾收集器通常不保证对象图中析构函数的执行顺序,因此您甚至可能不依赖任何外部引用。一 数据库 更糟。

    编辑: 好的,PHP使用引用计数而不是世代GC,但是在析构函数中产生副作用仍然是不好的做法。

    明确调用flush有什么不好?也许您的库的用户只是想让一些更改消失。