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