【PHP8.x】InvalidArgumentException::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『__constructメソッドは、InvalidArgumentExceptionオブジェクトを新しく作成する際に、その初期化を実行するメソッドです』
このメソッドは、new InvalidArgumentException()のようにインスタンスが生成されるときに自動的に呼び出されます。InvalidArgumentExceptionは、関数やメソッドに渡された引数の型が期待されるものと一致しない、あるいは値が不正であるといった、引数に関する論理的なエラーが発生した場合にスローされる例外です。このコンストラクタは、例外オブジェクトに詳細な情報を設定するために、最大3つの引数を取ります。第一引数のmessageには、なぜ例外が発生したのかを説明するエラーメッセージを文字列で指定します。第二引数のcodeには、例外の種類を識別するための整数コードを指定できます。これは、エラーの種類に応じて処理を分岐させる際に役立ちます。第三引数のpreviousには、この例外がスローされる原因となった、先行する例外オブジェクトを指定します。これにより、例外の連鎖を追跡することが可能になります。これらの引数を通じて例外オブジェクトを適切に初期化することで、エラー発生時の状況を正確に記録し、デバッグやログ分析を効率的に行うことができます。
構文(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)
戻り値なし
戻り値はありません
サンプルコード
PHP8コンストラクタと例外処理
1<?php 2declare(strict_types=1); 3 4/** 5 * ユーザー情報を表現するクラス 6 * コンストラクタで引数の妥当性を検証します。 7 */ 8class User 9{ 10 /** 11 * Userクラスのコンストラクタ 12 * 13 * PHP 8のコンストラクタプロパティプロモーション機能を使用しています。 14 * 15 * @param string $name ユーザー名 16 * @param int $age 年齢 17 * @throws InvalidArgumentException 年齢が0以下の場合にスローされます。 18 */ 19 public function __construct( 20 public readonly string $name, 21 public readonly int $age 22 ) { 23 // コンストラクタに渡された引数の値を検証します。 24 if ($this->age <= 0) { 25 // 年齢が0以下という不正な値の場合、InvalidArgumentExceptionを生成してスローします。 26 // これが InvalidArgumentException::__construct の呼び出しに該当します。 27 throw new InvalidArgumentException( 28 "年齢には正の整数を指定してください。", // 第1引数: $message 29 1001 // 第2引数: $code 30 ); 31 } 32 } 33} 34 35try { 36 // 不正な引数(年齢に負の値)を渡してインスタンス化を試みます。 37 echo "不正な値(年齢: -5)でユーザーを作成しようとします...\n"; 38 $user = new User('テストユーザー', -5); 39 echo "ユーザーの作成に成功しました。\n"; // この行は実行されません。 40 41} catch (InvalidArgumentException $e) { 42 // スローされたInvalidArgumentExceptionをキャッチして情報を表示します。 43 echo "エラーをキャッチしました。\n"; 44 echo "例外メッセージ: " . $e->getMessage() . "\n"; 45 echo "例外コード: " . $e->getCode() . "\n"; 46} 47 48echo "\n---\n\n"; 49 50try { 51 // 正しい引数でインスタンス化します。 52 echo "正しい値(年齢: 30)でユーザーを作成します...\n"; 53 $validUser = new User('正規ユーザー', 30); 54 echo "ユーザーの作成に成功しました。\n"; 55 echo "名前: {$validUser->name}, 年齢: {$validUser->age}\n"; 56 57} catch (InvalidArgumentException $e) { 58 // こちらは例外がスローされないため、このブロックは実行されません。 59 echo "エラー: " . $e->getMessage() . "\n"; 60}
InvalidArgumentException::__constructは、メソッドや関数に渡された引数の値が、期待されるデータ型ではあるものの、その内容が不正である場合にスローする例外オブジェクトを生成するためのコンストラクタです。new InvalidArgumentException()のように、インスタンスを生成する際に自動的に呼び出されます。
このコンストラクタは3つの引数を取ります。第1引数$messageには、エラーの内容を説明する文字列を指定します。第2引数$codeには、エラーの種類を識別するための整数値を任意で設定できます。第3引数$previousは、他の例外が原因でこの例外が発生した場合に、その元の例外を格納するために使用します。コンストラクタはオブジェクトを初期化する役割のため、戻り値はありません。
サンプルコードでは、Userクラスのコンストラクタで年齢が0以下の場合、不正な引数と判断しています。その際、new InvalidArgumentException()を呼び出して例外オブジェクトを生成し、throwしています。第1引数にエラーメッセージ「年齢には正の整数を指定してください。」、第2引数にエラーコード1001を設定しています。このスローされた例外はcatchブロックで捕捉され、getMessage()やgetCode()メソッドを通じて、コンストラクタで設定した情報を取得できます。
InvalidArgumentExceptionは、メソッドに渡された引数の「値」が不正な場合に使うための例外です。サンプルコードでは、new InvalidArgumentException(...)のように、newで例外オブジェクトを生成し、throwキーワードでプログラムにエラーの発生を通知しています。このとき、コンストラクタ(__construct)が呼び出され、第1引数にエラーメッセージ、第2引数にエラーの種類を識別するための数値コードを設定できます。throwされた例外は、try...catch構文で捕捉しないとプログラムが停止してしまうため注意が必要です。コンストラクタで引数を検証し、不正な値を持つオブジェクトが作られるのを防ぐことは、安全なプログラムを設計するための重要な手法です。
PHP InvalidArgumentException コンストラクタで例外を発生させる
1<?php 2 3declare(strict_types=1); 4 5/** 6 * ユーザーの年齢を検証するクラス 7 */ 8class UserValidator 9{ 10 /** 11 * 年齢が有効な範囲(0歳以上)であるかを確認します。 12 * 無効な場合は InvalidArgumentException をスローします。 13 * 14 * @param int $age 検証する年齢 15 * @throws InvalidArgumentException 年齢が負の値の場合 16 */ 17 public function validateAge(int $age): void 18 { 19 if ($age < 0) { 20 // InvalidArgumentExceptionのコンストラクタを呼び出して例外オブジェクトを生成し、スローします。 21 // __construct(string $message, int $code) の形式で引数を渡しています。 22 throw new InvalidArgumentException( 23 '年齢には負の値を指定できません。', // 第1引数: エラーメッセージ 24 400 // 第2引数: エラーコード (例: HTTPステータスコード) 25 ); 26 } 27 28 echo "年齢 '{$age}' は有効です。" . PHP_EOL; 29 } 30} 31 32$validator = new UserValidator(); 33 34try { 35 // 正常な値を渡してメソッドを呼び出す 36 $validator->validateAge(25); 37 38 // 例外がスローされる値を渡す 39 $validator->validateAge(-10); 40 41} catch (InvalidArgumentException $e) { 42 // スローされた例外をキャッチし、コンストラクタで設定した情報を表示します。 43 echo "エラーが発生しました。" . PHP_EOL; 44 echo "メッセージ: " . $e->getMessage() . PHP_EOL; 45 echo "コード: " . $e->getCode() . PHP_EOL; 46}
InvalidArgumentException::__constructは、InvalidArgumentExceptionクラスの新しいインスタンス(オブジェクト)を生成するためのコンストラクタです。この例外は、関数やメソッドに渡された引数の値が期待される型や範囲ではない、つまり不正な場合にそのことをプログラムに知らせるために使用されます。
コンストラクタには3つの引数を指定できます。第1引数 $message は、エラーの内容を説明する文字列です。このメッセージは、例外がキャッチされた際に getMessage() メソッドで取得できます。第2引数 $code は、エラーを識別するための整数値(エラーコード)で、getCode() メソッドで取得可能です。第3引数 $previous は、例外が連鎖する場合に直前の例外オブジェクトを格納するためのもので、省略できます。コンストラクタはオブジェクトを初期化する役割のため、戻り値はありません。
サンプルコードでは、validateAgeメソッドに負の値が渡されると、new InvalidArgumentException()でコンストラクタが呼び出されます。ここでエラーメッセージとコードが設定された例外オブジェクトが生成され、throwキーワードによってスロー(送出)されます。catchブロックでは、このスローされた例外を捕捉し、getMessage()とgetCode()を使ってコンストラクタで設定した情報を表示しています。
このコードは、関数の引数が不正な場合にInvalidArgumentExceptionを発生させる例です。__constructは、newキーワードで例外オブジェクトを生成する際に自動で呼ばれるメソッドです。注意点として、例外オブジェクトはnewで作成しただけでは意味がなく、throwキーワードで「投げる」ことで初めてプログラムの実行が中断され、catchブロックに処理が移ります。コンストラクタの第1引数に渡したエラーメッセージはgetMessage()で、第2引数のエラーコードはgetCode()で取得できます。これらの引数は省略可能ですが、エラーの原因を明確にするため、特にメッセージは具体的に指定することが推奨されます。この例外は、期待しない型の値や範囲外の値が関数の引数に渡された場合に用いるのが適切な使い方です。