我想创建一种datamapper库,你可以这样做:
$users = Users::getTable();
$users->add($newUser1);
$users->add($newUser2);
现在$users
包含2个用户记录,但它们尚未保存到数据库中。为了提高效率,我想立即冲洗它们。我想有一个flush()
方法来做这个(不是问题),但我也希望它在$users
表引用超出范围时隐式发生。我有什么理由不在析构函数中这样做吗?
答案 0 :(得分:2)
如果未明确调用flush()
方法,我建议更好的解决方法是在析构函数中引发错误。
在这种情况下,最好是明确的并且在析构函数中引发错误确保您确实要么调用flush()
(或“回滚”或者你称之为的任何内容)。通过引发错误,你也会得到一个真正的通知,说明出了问题,而如果你什么都不做,那么你可能不会注意到它。
答案 1 :(得分:1)
谁能保证在调用析构函数时数据库可用?
垃圾收集器通常不保证对象图中析构函数的执行顺序,因此您甚至可能不依赖于任何外部引用。 数据库更糟糕。
编辑: 好吧,php使用ref计数而不是世代GC,但在析构函数中有副作用仍然是不好的做法。
明确调用flush有什么不好?也许你图书馆的用户只是想让一些变化消失。
答案 2 :(得分:1)
当前的PHP解释器关闭顺序不会发生任何保证,并且在调用之前可能会破坏您的数据库句柄。 (这就是为什么它没有记录btw ..)