2009-08-19 14 views
2

は、私はPHPのオブジェクト指向の側面を学ぶためにしようとしてきた、と思っていた:PHP __Constructor&__Destructor質問

私はデータベースへの接続を開くために_constructorを使用した場合は、そのクラス内の関数を使用しました(挿入など)を実行すると、定義された__destructorはメソッド "insert"の実行後に接続を終了しますか?

class data(){ 
    function __constructor { 
    // connect to db 
    } 

    function insert($data){ 
    // mysql_query(...) 
    } 

    function __destructor { 
    // close connection to db 
    } 
} 

$obj = new db(); 
$obj->insert('mumbo jumbo'); 

また、データベースへの接続はまだ開いていますか? 原因オブジェクトが破棄された場合にのみデストラクタが実行されることを読みました。しかし、どのようにオブジェクトを破壊するのですか?

+0

クラスデータを呼び出したので、db()ではなく$ obj = new data()と思っています。あなたは永続的な接続について言及しています - どのようなmysql接続方法を使用していますか?私は、mysql_pconnect()がmysqlと永続的な接続をインスタンス化する唯一の方法だと考えています。 –

+0

私のコードをあまりにも真剣に受け止めないで、私は単に私の意見を理解しようとしていました。上記の主な質問は、必要に応じてDBへの接続を開いたり閉じたりして、安全な接続を実現することでした... – chutsu

答えて

6

PHPでは、オブジェクトがスコープから外れるとオブジェクトが破棄されます。スクリプト機能は、それが終了する以内に作成されたときに実行するか、または停止しますが、あなたが使用して早期にあなたのコード内のオブジェクトを破壊することができたときにこれが通常であるに:

unset($my_variable); 

だから、あなたの質問に答えるために、あなたができるように問題ないはずですほとんどの状況、特に小さなスクリプトでDBを閉じるのを処理するデストラクタ。

+2

その行はオブジェクトの割り当てが解除されるだけで、 '$ my_variable'がオブジェクトを指す最後のものであれば、そのデストラクタが呼び出されます。 – chaos

3

はい、それはあなたのコンストラクタとデストラクタの正しい名前、__construct() and __destruct()を使用する限り、正常に動作します。

2

オブジェクトが参照されなくなると、オブジェクトは破棄されます。たとえば、オブジェクトを保持する最後の変数を指定するか、スクリプトの実行が終了したときです。

ちなみに、魔法は__construct__destructという名前で、末尾には-orはありません。

1

ところで、コンストラクタとデストラクタは__constructと__destructと呼ばれます。

dbへの参照がなくなると__destructorが呼び出されます。通常、これはオブジェクトが範囲外になったときに発生しますが、他の参照を保存している場合は発生しません。あなたはどこかの$ OBJを保存している場合

unset($obj); 

と同様に使用してdbへの参照を削除することができます。

0

PHPはデータベースへの永続的な接続もサポートしています。つまり、オブジェクトが破棄されたとしても、DBへの接続は「バックグラウンドで」開かれ、対応するpconnectを呼び出すと再利用されますまたはPDO類似体)を同定する。

+0

明確にするために、PHPはmysql_pconnect()を使うと永続的な接続をサポートします。他のすべてのmysql接続メソッドAFAIKは、スクリプトの実行が終了すると自動的に閉じます。 –

+0

ああ、pg_pconnect、sybase_pconnectなどのmysql_pconnect以外のものがあります これは世界でコネクションプーリングを行う良い方法ですが、あなたはそれについて絶対に正しいです。私はちょうどそれが 'データベース接続を閉じること'に関する質問だったので、これを言及する適切な場所だと思った。 –