はじめに
PHPでは、クラスのインスタンス生成・破棄のタイミングで自動的に呼ばれる特殊メソッドとして、コンストラクタ __construct()
と デストラクタ __destruct()
があります。
PHP8以降、特に手動で __construct()
を呼ぶ挙動がバージョンによって異なるため、上級試験でもよく問われるポイントです。
目次
サンプルコード(PHP8.0 実行例)
<?php
declare(strict_types=1);
error_reporting(-1);
class Hoge {
public function __construct(){
echo __METHOD__ , "\n";
}
public function __destruct(){
echo __METHOD__ , "\n";
}
}
// 1回目
echo "start\n";
$obj = new Hoge(); // __construct 自動呼び出し
echo "middle\n";
unset($obj); // __destruct 呼び出し
echo "end\n";
// 2回目
echo "start 2\n";
$obj = new Hoge(); // __construct 自動呼び出し
echo "middle\n";
$obj->__construct(); // PHP8.0では手動呼び出しOK
出力例(PHP8.0):
start
Hoge::__construct
middle
Hoge::__destruct
end
start 2
Hoge::__construct
middle
Hoge::__construct
Hoge::__destruct
コンストラクタ (__construct
)
- インスタンス生成時に自動的に呼ばれる
- 引数を受け取り、初期化処理などに利用
デストラクタ (__destruct
)
- インスタンス破棄時に自動的に呼ばれる
- 後始末(ファイルクローズやリソース解放など)に利用
コンストラクタ・デストラクタのライフサイクル
インスタンス生成 インスタンス破棄
+-----------------+ +------------------+
| $obj = new Hoge | --------> | unset($obj) |
+-----------------+ +------------------+
| |
v v
+---------------+ +----------------+
| __construct() | | __destruct() |
+---------------+ +----------------+
| ^
+---------- 使用中 ------------+
💡 ポイント:
__construct()
は インスタンス生成時に自動呼び出し__destruct()
は 破棄時に自動呼び出し- PHP8.0では手動で
__construct()
を呼ぶことも可能
PHPバージョンによる違い
バージョンによって挙動が異なります。
PHPバージョン | $obj->__construct() の手動呼び出し |
---|---|
8.0〜8.1 | 呼べる(普通のメソッドとして実行される) |
8.2〜 | Fatal error になる(禁止) |
まとめ
- コンストラクタ・デストラクタは タイミング依存の自動呼び出し
- PHP8.0〜8.1では手動呼び出しも可能、8.2以降では禁止
unset()
またはスコープ終了で自動的にデストラクタが呼ばれる- 上級試験では「どのタイミングで何が呼ばれるか」を正確に理解しておく