我有这个类用于数据库交互。它工作正常。
<?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($这 - &GT;链接);
我收到错误: 警告:mysql_close()期望参数1为资源,给定
为null答案 0 :(得分:2)
我会使用mysql
而不是使用自制的PDO
包装器。
如果失败,PHP会自行关闭非持久性数据库连接。它可能会在调用对象析构函数之前执行此操作,从而无需使用该方法。
答案 1 :(得分:2)
此错误的原因非常简单:$ this-&gt; link是一种资源。并且(引用the doc本身)......
...自动检测到没有更多引用的资源, 它被垃圾收集器释放。因此,它是 很少需要手动释放内存。
换句话说,在调用__destruct
方法之前它已关闭。更重要的是,在mysql_close文档中说:
通常不需要使用mysql_close(),因为非持久性打开 链接在脚本执行结束时自动关闭。
顺便说一句,我通常认为__destruct
是内部方法(并且很少用它):PHP不是C ++,解放资源的整个概念在这里有很大的不同(通过大量的原因)。如果我需要执行一些清理任务,我通常会使用register_shutdown_function,因为事实证明它更具可预测性。