如果声明对象未设置,是否需要调用PDOStatement :: closeCursor()?

hak*_*kre 10 php mysql pdo

我正在使用与PDOStatement(; )的基于Mysql的PDO连接,并且我已经运行了一些在方法中使用的开发人员的代码.::prepare()::execute()PDOStatement::closeCursor()

无论如何,该函数在函数结束时未设置:

public function fooBar($identifier)
{
    ...
    /** @var $dbc PDO */
    $dbc      = $conn->getConnection();
    $stmt     = $dbc->prepare('SELECT orderType, orderComment, payload FROM cart WHERE identifier = :identifier');
    $stmt->execute(array('identifier' => $identifier));

    $stmt->setFetchMode(PDO::FETCH_OBJ);
    $cart = $stmt->fetch();
    $stmt->closeCursor();

    ...

    return $result;
}
Run Code Online (Sandbox Code Playgroud)

在我的心智模型中,我会说PDOStatement无论如何都在这里被清除,因为我发现对象要处理这个内务处理(封装基础知识).因此,调用PDOStatement::closeCursor()看起来对我来说是多余的,特别是因为这可能不是这里想要的:因为语句不能被重用,所以我根本不需要关闭光标.

注意:这段代码是示例性的,在实际代码中,$stmt->execute(...)如果行计数不是一(1),甚至会抛出异常.

Stackoverflow上的现有材料

查尔斯 于2011年5月在问题pdo免费结果中回复:

不只是一些驱动程序 - 驱动程序提供的某些设置需要在触发另一个查询之前关闭结果集,例如关闭MySQL PDO::MYSQL_ATTR_USE_BUFFERED_QUERY.谢天谢地,你可以打电话closeCursor,当它不需要采取行动时它将成功地做任何事情.否则,只需取消设置包含语句句柄的变量即可清除.

另一个问题我何时应该将closeCursor()用于PDO语句?没有接受的答案,我不会怀疑,因为它是所有的愚蠢.

在重用PDO语句var崩溃过程中有一个注释,即取消设置变量不会导致所有错误(内存损坏错误):

[...]我确实尝试在重新分配之前取消设置语句var,但它没有帮助.[...]

但是我不知道对于范围不大的局部变量是否也是如此.我也不使用mod_phpSAPI.

相关的Bug材料

Dav*_*dom 9

pdo_mysql_stmt_dtor()运行相同的清理操作pdo_mysql_stmt_cursor_closer(),因此只要语句对象显式取消设置或超出范围,操作将始终执行.

因此,closeCursor()如果该声明即将被销毁,则无需致电.我个人也会这么做,因为我喜欢明确可读性,但这归结为个人风格偏好.

基于上面的引用,这只能说明某些关于PDO_mysql - 对于其他驱动程序,这可能不成立.

  • 感谢@bwoebi [聊天中的反馈](http://chat.stackoverflow.com/transcript/message/17526064#17526064)以及*"[PHP的'unset'构造如何在内部工作?](http:// stackoverflow.com/q/24557958/367456)"*现在我很清楚`unset`总是会调用析构函数.这与垃圾收集无关.当范围离开函数时,[`unset`被隐式调用](http://chat.stackoverflow.com/transcript/message/17523775#17523775).这与你的答案相结合,涵盖了我的案例100%.谢谢你的回答! (3认同)