我正在使用基于Mysql的PDO连接和 PDOStatement (::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;
}
在我的心智模型中,我会说这里无论如何都清除了PDOStatement,因为我期望该对象负责此内务处理(封装基础知识)。因此,对我来说,调用
PDOStatement::closeCursor()
似乎是多余的,特别是因为这可能与此处不完全一样:由于该语句不再被重复使用,因此我根本不需要关闭游标。Stackoverflow上的现有 Material
Charles问题中的commmented back in May 2011 pdo free result:
另一个问题When should I use closeCursor() for PDO statements?没有被接受的答案,我不会对此感到奇怪,因为它全是一厢情愿的。
在Reusing PDO statement var crashes the process中,有一个a comment made:取消设置变量不会完全消除所有错误(内存损坏错误):
但是我不知道对于范围将消失的局部变量来说是否也是如此。我也不使用
mod_php
作为SAPI。相关Bug资料
最佳答案
pdo_mysql_stmt_dtor()
运行与 pdo_mysql_stmt_cursor_closer()
相同的清除操作,因此只要声明对象未明确设置或超出范围,该操作将始终执行。
因此,如果该语句将要被销毁,则不必严格要求调用closeCursor()
。就个人而言,我还是会这样做,因为我希望明确表示可读性,但这取决于个人的风格偏好。
基于上述引用,只能肯定地说到PDO_mysql-对于其他驱动程序,可能不成立。