デストラクタ (__destruct)
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 8/91。
__destruct メソッドは、オブジェクトが破棄されるときに自動的に呼び出される特殊なメソッドです。オブジェクトは、それに対する参照がなくなったとき、またはスクリプトが終了したときに破棄されます。
コンストラクタとデストラクタの両方を持つクラスの例を次に示します。
<?php
class Resource {
public $name;
public function __construct($name) {
$this->name = $name;
echo $this->name . " was created\n";
}
public function __destruct() {
echo $this->name . " was destroyed\n";
}
}オブジェクトを作成し、ライフサイクルを確認します:
echo "=== Start ===\n";
$r = new Resource("Connection");
echo "Using " . $r->name . "\n";
unset($r); // 明示的にオブジェクトを破棄する
echo "=== End ===\n";出力:
=== Start ===
Connection was created
Using Connection
Connection was destroyed
=== End ===unset() 関数はオブジェクトへの参照を削除し、デストラクタを即座に実行します。
unset() を呼び出さない場合、スクリプトの終了時にデストラクタが自動的に実行されます:
$r = new Resource("Logger");
echo "Working...\n";
// スクリプトの終了時に __destruct が自動的に呼び出されます出力:
Logger was created
Working...
Logger was destroyed重要なポイント: __destruct メソッドは、オブジェクトが不要になったときに、ファイルのクローズ、リソースの解放、ログの記録などのクリーンアップタスクを実行するのに役立ちます。
チャレンジ
中級resource.php 内の Resource クラスを完成させてください:
$nameを受け取り、それをプロパティとして設定し、"[name] was created"と出力する__constructメソッドを追加してください。$messageを受け取り、"Log: [message]"と出力するlogMessageメソッドを追加してください。"[name] was destroyed"と出力する__destructメソッドを追加してください。
driver.php ファイルが Resource オブジェクトのライフサイクルをテストします。
チートシート
__destruct メソッドは、オブジェクトが破棄されるとき(そのオブジェクトへの参照がなくなったとき、またはスクリプトが終了したとき)に自動的に呼び出されます。
コンストラクタとデストラクタを持つクラスの例:
<?php
class Resource {
public $name;
public function __construct($name) {
$this->name = $name;
echo $this->name . " was created\n";
}
public function __destruct() {
echo $this->name . " was destroyed\n";
}
}unset() 関数はオブジェクトへの参照を削除し、即座にデストラクタをトリガーします:
$r = new Resource("Connection");
unset($r); // explicitly destroy the objectunset() が呼び出されない場合、デストラクタはスクリプトの終了時に自動的に実行されます。
__destruct メソッドは、ファイルのクローズ、リソースの解放、ログの記録などのクリーンアップタスクに役立ちます。
自分で試してみよう
<?php
require_once 'resource.php';
$testCase = trim(fgets(STDIN));
if ($testCase == "basic_test") {
echo "=== Start ===\n";
$r = new Resource("FileHandler");
echo "Using " . $r->name . "\n";
unset($r);
echo "=== End ===\n";
} elseif ($testCase == "auto_destruct_test") {
$r = new Resource("Logger");
$r->logMessage("Application started");
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。