在this PHP documentation中,它给出了以下关于如何关闭连接的示例:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// use the connection here
// and now we're done; close it
$dbh = null;
但是如果我在$dbh
只有本地范围的函数中使用它,我是否必须将其设置为null,或者当函数返回时连接是否会关闭?
在我的下面示例中,连接是否已关闭?
public function doDBWork(){
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// use the connection here
return true;
}
答案 0 :(得分:3)
根据文件:
通过将
NULL
分配给保存对象的变量来[关闭连接]。如果您没有明确地执行此操作,PHP将在脚本结束时自动关闭连接。
因此,由于您未指定null
,因此不会在函数末尾关闭连接。虽然它是不可访问的,因为它的范围是函数的本地范围,但在技术上它不会在脚本结束之前关闭。
注意:通常,我不建议在函数调用中建立和关闭数据库连接。
答案 1 :(得分:1)
PHP PDO为您管理连接。您可以确保将关闭连接设置为PDO连接对象的null。但没有必要。
在这种情况下,您没有使用连接来进行查询,当方法结束时,连接将被关闭。
答案 2 :(得分:1)
严格地说,将$dbh
设置为null不会关闭连接。这将使PDO实例符合垃圾收集条件(只要没有对该对象的任何其他引用)。据推测,PDO的析构函数可以清除连接。
要回答您的问题,您的示例将关闭连接(或至少以与第一个示例相同的方式执行),因为$dbh
将再次符合垃圾回收条件。
答案 3 :(得分:0)
您可以将DB句柄作为参数传递给全局函数(或静态方法)。但这真的没必要。代码执行结束时,DB句柄自动关闭。无需明确关闭它。
function close_connection(PDO $dbh) {
$dbh = null;
}
答案 4 :(得分:0)
更好的方法可能是依赖注入,这样您就不必打开多个连接。
class MyClass {
protected $PDO;
public function __construct(PDO $PDO) {
$this->PDO = $PDO;
}
public function DoDbWork() {
$this->PDO->Query(); //uses same PDO instance that was supplied outside class
}
}
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
//call multiple functions, do stuff procedurely, etc.
$t = new MyClass($dbh);
$t->DoDbWork();
$dbh = null;