PHPのクラスのコンストラクタ・デストラクタについて

PHP

PHPのクラスのコンストラクタとデストラクタについて書いています。
載せているコードはPHPのバージョン8.2.6で動作を確認しました。

公式ページの「コンストラクタとデストラクタ」の内容になります。

コンストラクタ(__construct)を使うには?

PHPのクラスにはコンストラクタを作成することができます。

コンストラクタは、クラスをnewしてオブジェクトを作成するときに、最初にオブジェクトに動作させる処理を書くことができます。
オブジェクトの内部で保持しておく初期値を設定するのに、コンストラクタをよく使います。

例えば、下記のようにコンストラクタを実装することができます。

class Food {
    protected string $name;
    protected int $price;

    public function __construct(string $name, int $price)
    {
        $this->name = $name;
        $this->price = $price;
    }

    public function showNameAndPrice()
    {
        echo "{$this->name}は{$this->price}円です。\n";
    }
}

Foodクラスを定義しています。
プロパティとして、名前($name)と価格($price)を保持しています。

__constructと定義しているのがコンストラクタです。
この「__construct」でメソッドを作っておくと、クラスからオブジェクトを作成するときに処理してくれます。

引数を設定していますが、設定した引数がnewを行うときに渡すことができる引数です。

__construct(string $name, int $price)

今回は名前と価格を渡して、内部の変数に保持するように処理しています。
showNameAndPriceメソッドは持っている変数の内容を出力するだけのメソッドです。

コンストラクタを使ってみる

このクラスは、下記のように使うことができます。

$apple = new Food('りんご', 150);
$apple->showNameAndPrice();

クラスをnewして、オブジェクトにするときに、引数をふたつ渡しています。
これでコンストラクタで処理をしてくれて、内部の$name$priceに設定します。

showNameAndPriceメソッドを呼び出すと、下記のように内部に設定された値が出力されました。

りんごは150円です。

このようにnewしてオブジェクトを作成するときに処理をすることができます。

デストラクタ(__destruct)を使うには?

デストラクタは、スクリプトが終わるときやオブジェクトが使われずに破棄されるときに呼び出されます。

デストラクタはクラスの中に__destructメソッドを定義することで実装することができます。
個人的にもあまり実装した経験がなく、実務ではあまり使うことがないメソッドかもしれません。

先ほどのクラスに、デストラクタを追加で実装してみました。

class Food {
    protected string $name;
    protected int $price;

        // --- 省略 ---

    public function __destruct()
    {
        echo "デストラクタ実行!\n";
    }
}

デストラクタを使ってみる

作成したデストラクタを下記のように実行して、動作を確認してみました。

$apple = new Food('りんご', 150);
$apple->showNameAndPrice();

echo "テスト\n";

出力結果を確認すると、下記のようになります。

りんごは150円です。
テスト
デストラクタ実行!

まずコンストラクタが動いて、その後にshowNameAndPriceメソッドを呼び出し、保持している値を出力されています。
次にechoで「テスト」が出力されました。

最後にスクリプトが終わるので、デストラクタに実装した「デストラクタ実行!」が出力されました。

デストラクタを先に動かしたい

デストラクタを最後の処理の前に動かしたいときには、オブジェクトを破棄すると実行されました。
例えば、下記のようにクラスを使ってみます。

$apple = new Food('りんご', 150);
$apple->showNameAndPrice();
unset($apple);

echo "テスト\n";

echoで「テスト」を出力する前にunset関数でオブジェクトを破棄しました。
そうすると、下記のようにデストラクタが先に実行されるようになりました。

りんごは150円です。
デストラクタ実行!
テスト

PHPのコンストラクタ・デストラクタまとめ

今回はPHPのコンストラクタとデストラクタについて書きました。

コンストラクタを実装すると、クラスからオブジェクトを作るときに、処理したい内容を定義できました。
デストラクタを実装すると、オブジェクトが破棄されるか、スクリプトの終了時に処理したい内容を定義できました。

コメント

タイトルとURLをコピーしました