1

DBインタラクション用にこのクラスがあります。それは正常に動作します。

<?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(); を置き換えると with mysql_close($this->link);

次のエラーが表示されます: 警告: mysql_close() はパラメーター 1 がリソースであると想定しています。

4

2 に答える 2

2

自家製のmysqlラッパーを使用する代わりに、を使用しますPDO

これに失敗すると、PHPは非永続的なDB接続を独自に閉じます。そのメソッドの必要性を取り除くオブジェクトデストラクタを呼び出す前にこれを行う可能性があります。

于 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 に答える