Menu
Coddy logo textTech

デストラクタ (__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 メソッドは、オブジェクトが不要になったときに、ファイルのクローズ、リソースの解放、ログの記録などのクリーンアップタスクを実行するのに役立ちます。

challenge icon

チャレンジ

中級

resource.php 内の Resource クラスを完成させてください:

  1. $name を受け取り、それをプロパティとして設定し、"[name] was created" と出力する __construct メソッドを追加してください。
  2. $message を受け取り、"Log: [message]" と出力する logMessage メソッドを追加してください。
  3. "[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 object

unset() が呼び出されない場合、デストラクタはスクリプトの終了時に自動的に実行されます。

__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");
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン