过早关闭传递给不起作用的对象的PDO连接

时间:2013-08-02 23:30:44

标签: php class pdo null

K我正在将PDO连接传递给类构造函数以获取一些sql信息。当我不用NULL手动关闭PDO时,它完美地工作。

try
{
    $dbh = new PDO('mysql:host=localhost;dbname=test');
}
catch(PDOException $ex)
{
    echo "Failed to connect to the database: " . $ex->getMessage();
}

$objGetReference = new getReference($dbh);
$reference=$objGetReference->getReference();

然而,当我有一个$ dbh = null的完全相同的代码时;最后关闭pdo对象失败了。所以以下内容不起作用:

try
{
    $dbh = new PDO('mysql:host=localhost;dbname=test');
}
catch(PDOException $ex)
{
    echo "Failed to connect to the database: " . $ex->getMessage();
}

$objGetReference = new getReference($dbh);
$reference=$objGetReference->getReference();

$dbh=NULL;

我知道php脚本无论如何都会终止它,但我想这样结束它。只是好习惯。

如何提前关闭数据库连接?

此外,如果我将它传递给多个类,我应该在每个使用它的类中单独关闭它吗?

谢谢大家。

2 个答案:

答案 0 :(得分:1)

以这种方式关闭PDO连接应该没问题。您应该更清楚地描述“不起作用”的含义。

我猜你将$ dbh设置为null,但后来尝试在后续的代码行中使用它。

要确认这一点,我会确保我的类期望PDO对象得到一个而不是null。例如,使用类型提示

class getReference {
  public function __construct(PDO $dbh) {
    ...
  }
}

这很容易做到,如果您不小心传递了null,应该使构造函数抛出致命错误。

$dbh = null
$r = new getReference($dbh);

这是错误:

Catchable fatal error: Argument 1 passed to getReference::__construct() 
must be an instance of PDO, null given

答案 1 :(得分:1)

如果要终止脚本的执行,可以使用dieexit以及将向用户显示的可选错误消息。

根据PDO manual

  

要关闭连接,您需要通过确保来销毁对象   删除所有剩余的引用 - 你这样做   将NULL分配给包含对象的变量

措辞有点不对(至少对我而言),因为你不仅需要销毁所有引用,而且还需要销毁所有副本。

例如:

$a = new PDO( [args] );
$b = $a;
$a = null;

然后$b仍然连接到数据库,所以你必须确保你也销毁它。将它用作方法/函数的参数也是如此,因为这会创建原始对象的副本而不是引用(除非通过引用传递):

function killDbh($dbh) {
    $dbh = null;
}
killDbh($dbh);
echo get_class($dbh); // echoes PDO

要关闭连接,您需要关闭所有连接,包括任何对象。但是,如果你这样做,

$a = new PDO( [args] );
$b =& $a;
$a = null;

然后$b$a的引用,它也将被销毁。本质上,除了脚本终止之外,没有 true 方法来关闭PDO对象的连接(如mysqli_close),因为没有办法将对象设置为“断开连接”状态,所以对象的任何副本仍然是连接的。

根据我的经验,无论如何都很少需要显式关闭数据库连接,所以你几乎不用担心。