1

我有这个用于数据库交互的课程。它工作正常。

<?php require_once('inc/config.inc.php'); ?>
<?php
final class MySQL {
private $link;

public function __construct($hostname, $username, $password, $database) {
    if (!$this->link = mysql_connect($hostname, $username, $password)) {
        //error('Error: Could not make a database link using ' . $username . '@' . $hostname);

    }
    if (!mysql_select_db($database, $this->link)) {
        //error('Error: Could not connect to database ' . $database);
    }
    //echo "open". time();
}

public function __destruct() {
    mysql_close(); // Problem In here
    //echo "closed". time();
}
}

$database=new MySQL(DB_SERVER,DB_USER,DB_PASS,DB_NAME);
?>

但是如果我替换 mysql_close(); 用 mysql_close($this->link);

我收到一个错误:警告:mysql_close() 期望参数 1 是资源,给定 null

4

2 回答 2

2

我不会使用自制mysql包装器,而是使用PDO.

如果做不到这一点,PHP 会自行关闭非持久数据库连接。它可能会在调用对象析构函数之前执行此操作,从而避免对该方法的需求。

于 2012-06-29T21:14:16.917 回答
2

这个错误的原因很简单:$this->link 是一个资源。并且(引用文档本身)...

...自动检测到不再引用它的资源,并由垃圾收集器释放。因此,很少需要手动释放内存。

换句话说,它在你的__destruct方法被调用之前就关闭了。更重要的是,在mysql_close文档中说:

通常不需要使用 mysql_close(),因为非持久打开的链接会在脚本执行结束时自动关闭。

顺便说一句,我通常认为是__destruct内部方法(并且很少找到它的用途):PHP 不是 C++,释放资源的整个概念在这里完全不同(有很多原因)。如果我需要执行一些清理任务,我通常使用register_shutdown_function,因为事实证明它更容易预测。

于 2012-06-29T21:40:49.880 回答