【PHP8.x】RuntimeException::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
__constructメソッドは、RuntimeExceptionクラスの新しいインスタンスを生成し、その初期化を実行するメソッドです。このメソッドは、オブジェクトが作成される際に自動的に呼び出される特別なメソッドであり、コンストラクタとして機能します。主な目的は、プログラムの実行時に発生した予期せぬエラー、すなわち実行時エラーを表現するための例外オブジェクトを準備することです。その際、発生したエラーに関する詳細な情報をオブジェクト内部に設定します。引数として、エラーの内容を説明するためのメッセージ文字列、エラーの種類を識別するための整数コード、そして、この例外が別の例外によって引き起こされた場合にその原因となった例外オブジェクトを渡すことができます。これにより、なぜエラーが発生したのか、どのような種類のエラーなのかといった具体的なコンテキストを持った例外を生成することが可能になります。通常、このメソッドで生成されたオブジェクトはthrow文と組み合わせて使用され、エラーハンドリングの仕組みを通じてプログラムの異常系処理を制御するために役立ちます。
構文(syntax)
1public __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
引数(parameters)
string $message = '', int $code = 0, ?Throwable $previous = null
- string $message = '': 例外発生時に表示されるエラーメッセージを指定します。
- int $code = 0: 例外に紐づけるエラーコードを指定します。
- ?Throwable $previous = null: この例外が発生する原因となった、以前の例外を指定します。
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP 8 コンストラクタ昇格で例外を扱う
1<?php 2 3declare(strict_types=1); 4 5/** 6 * PHP 8.0で導入された「コンストラクタのプロパティ昇格」機能を示すカスタム例外クラス。 7 * 8 * この機能を使うと、コンストラクタの引数リストで直接プロパティを宣言・初期化でき、 9 * クラス内のプロパティ宣言とコンストラクタ内の代入文を省略できます。 10 */ 11class MyCustomException extends RuntimeException 12{ 13 /** 14 * コンストラクタでプロパティ昇格を使用。 15 * 16 * 可視性修飾子(public)を引数に付けるだけで、同名のプロパティが自動的に定義され、 17 * コンストラクタが受け取った値がそのプロパティに代入されます。 18 * ここでは、読み取り専用のプロパティとして定義しています(PHP 8.1+)。 19 * 20 * @param public readonly string $message エラーメッセージ 21 * @param public readonly int $code エラーコード 22 * @param public readonly ?Throwable $previous 直前の例外 23 */ 24 public function __construct( 25 string $message = '', 26 int $code = 0, 27 ?Throwable $previous = null 28 ) { 29 // 親クラスであるRuntimeExceptionのコンストラクタを呼び出す 30 parent::__construct($message, $code, $previous); 31 } 32} 33 34// --- サンプルコードの実行部分 --- 35 36try { 37 // 作成したカスタム例外をスロー(発生させる) 38 throw new MyCustomException('カスタムエラーが発生しました。', 500); 39} catch (MyCustomException $e) { 40 // 例外をキャッチし、プロパティ昇格によって設定されたプロパティの値を出力 41 echo '例外をキャッチしました!' . PHP_EOL; 42 echo 'メッセージ: ' . $e->getMessage() . PHP_EOL; // 親クラスのメソッド経由でアクセス 43 echo 'コード: ' . $e->getCode() . PHP_EOL; // 親クラスのメソッド経由でアクセス 44}
このコードは、PHPの標準的な例外クラスである RuntimeException を継承して、独自の例外クラス MyCustomException を定義するサンプルです。このコードの重要な点は、PHP 8.0から導入された「コンストラクタのプロパティ昇格」という機能を利用していることです。
__construct メソッドは、new を使ってクラスのインスタンスを生成する際に一度だけ自動的に呼び出される初期化用のメソッドで、戻り値はありません。通常は、クラス内でプロパティを宣言し、コンストラクタ内で引数の値をプロパティに代入する記述が必要ですが、「コンストラクタのプロパティ昇格」を使うと、引数に public などの可視性修飾子を付けるだけで、プロパティの宣言と値の代入を同時に行うことができ、コードが簡潔になります。
引数の $message はエラーメッセージ(文字列)、$code はエラーコード(整数)、$previous は直前に発生した例外を指します。受け取ったこれらの引数は parent::__construct() によって親クラス RuntimeException のコンストラクタに渡され、例外オブジェクトの初期設定に使われます。
このコードはPHP 8.0の新機能「コンストラクタのプロパティ昇格」を利用しています。コンストラクタの引数にpublicなどの可視性修飾子を付けることで、プロパティの宣言と値の代入を同時に行え、コードが簡潔になります。注意点として、この機能を使っても、親クラスの機能を正しく動作させるためにparent::__construct()を呼び出すことは必須です。これを忘れると、getMessage()などのメソッドが期待通りに値を返しません。また、サンプルにあるreadonlyはPHP 8.1以降の機能であり、一度初期化したプロパティの再代入を防ぎます。これらの機能は指定されたPHPバージョン以降でしか利用できない点に注意してください。
PHP 8 コンストラクタプロパティプロモーションで例外を扱う
1<?php 2 3declare(strict_types=1); 4 5/** 6 * サービスレイヤーで発生したエラーを表すカスタム例外クラス。 7 * RuntimeException を継承しています。 8 */ 9class ServiceLayerException extends RuntimeException 10{ 11 /** 12 * PHP 8 のコンストラクタプロパティプロモーションを使用したコンストラクタ。 13 * 14 * 引数にアクセス修飾子(ここでは public readonly)を付けることで、 15 * プロパティの宣言とコンストラクタ内での値の代入を同時に行います。 16 * これにより、冗長なコードを記述する必要がなくなり、クラス定義が簡潔になります。 17 * 18 * @param public readonly string $serviceName エラーが発生したサービス名 19 * @param string $message 例外メッセージ (親クラスに渡す) 20 * @param int $code 例外コード (親クラスに渡す) 21 * @param ?Throwable $previous 直前の例外 (親クラスに渡す) 22 */ 23 public function __construct( 24 public readonly string $serviceName, 25 string $message = '', 26 int $code = 0, 27 ?Throwable $previous = null 28 ) { 29 // 親クラスである RuntimeException のコンストラクタを呼び出す 30 parent::__construct($message, $code, $previous); 31 } 32} 33 34// --- 以下はサンプルコードの実行部分です --- 35 36try { 37 // カスタム例外をスローする例 38 throw new ServiceLayerException( 39 serviceName: 'UserRegistrationService', 40 message: 'ユーザーのメールアドレスが既に存在します。', 41 code: 1001 42 ); 43} catch (ServiceLayerException $e) { 44 // 補足した例外の情報を出力する 45 echo "エラーが発生しました。\n"; 46 // コンストラクタプロパティプロモーションで定義されたプロパティにアクセス 47 echo "サービス名: " . $e->serviceName . "\n"; 48 echo "メッセージ: " . $e->getMessage() . "\n"; 49 echo "エラーコード: " . $e->getCode() . "\n"; 50}
このサンプルコードは、PHPの組み込み例外クラスであるRuntimeExceptionを継承して、アプリケーション独自のServiceLayerExceptionクラスを作成する例です。
__constructは、クラスのインスタンスが生成されるときに自動的に呼び出される特別なメソッド(コンストラクタ)です。このコードでは、PHP 8の新機能である「コンストラクタプロパティプロモーション」が使われています。引数$serviceNameにpublic readonlyとアクセス修飾子を付けることで、プロパティの宣言とコンストラクタ内での値の代入を同時に行い、コードを簡潔にしています。
このコンストラクタは、エラーが発生したサービス名$serviceNameに加え、親クラスに渡すための$message(例外メッセージ)、$code(例外コード)、$previous(直前の例外)を引数として受け取ります。そして、parent::__construct()を呼び出して、これらの情報を親クラスであるRuntimeExceptionに渡しています。コンストラクタ自体に、明示的な戻り値はありません。
実行部分では、このカスタム例外をthrowで発生させ、catchブロックで補足しています。補足した例外オブジェクトから、独自に定義したプロパティ$serviceNameや、親クラスから継承したgetMessage()メソッドなどを呼び出して、例外の詳細情報を表示しています。
このコードはPHP 8の新機能「コンストラクタプロパティプロモーション」を使い、簡潔にクラスを定義しています。この構文はPHP 8.0以降の環境でのみ利用可能です。独自のコンストラクタを定義した場合、parent::__construct()を呼び出して親クラスの初期化を必ず行ってください。これを忘れると、getMessage()やgetCode()といった継承したメソッドが期待通りに動作しなくなります。また、readonly修飾子が付いたプロパティは、初期化後に値を変更しようとするとエラーになるため注意が必要です。このように例外クラスを独自に拡張することで、エラー発生時の詳細な情報を付与でき、デバッグやエラー処理がしやすくなります。