Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】UnexpectedValueException::__construct()メソッドの使い方

__constructメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

__constructメソッドは、UnexpectedValueExceptionクラスの新しいインスタンスを生成する際に呼び出される、特別な初期化処理を実行するメソッドです。UnexpectedValueExceptionは、変数の値が期待していた値の組に含まれない、つまり予期しない値であった場合にスローされる例外です。例えば、特定の定数しか受け付けない関数に、それ以外の値が渡された場合などに使用されます。このコンストラクタは、例外オブジェクトを生成するにあたり、エラーに関する詳細な情報を設定する役割を持ちます。第一引数には、なぜこの例外が発生したのかを説明する文字列のエラーメッセージを渡します。第二引数には、例外の種類をプログラムで区別するための整数値である例外コードを指定できます。また、第三引数には、この例外がスローされる直前に発生した別の例外オブジェクトを指定することで、例外の連鎖を表現できます。開発者は、throw new UnexpectedValueException()のようにこのコンストラクタを用いて例外オブジェクトを作成し、プログラムの異常な状態を通知するために使用します。

構文(syntax)

1public __construct(string $message = "", int $code = 0, ?Throwable $previous = null)

引数(parameters)

string $message = "", int $code = 0, ?Throwable $previous = null

  • string $message: 例外発生時の詳細なメッセージを指定する文字列
  • int $code: 例外に付与するエラーコードを指定する整数
  • ?Throwable $previous: この例外をラップする、以前の例外オブジェクトを指定

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP UnexpectedValueException コンストラクタを継承する

1<?php
2
3/**
4 * ユーザー入力が期待しない値だった場合にスローされる、独自の例外クラスを定義します。
5 * PHPに組み込まれている UnexpectedValueException を継承しています。
6 */
7class InvalidUserInputException extends UnexpectedValueException
8{
9    /**
10     * このクラスのコンストラクタです。
11     * オブジェクトが `new` キーワードで生成される際に自動的に呼び出されます。
12     *
13     * @param string $message エラーメッセージ
14     * @param int $code エラーコード
15     * @param ?Throwable $previous 直前の例外(例外チェーン用)
16     */
17    public function __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
18    {
19        // 親クラスである UnexpectedValueException のコンストラクタを呼び出し、
20        // 例外の基本的な情報を設定します。
21        parent::__construct($message, $code, $previous);
22    }
23}
24
25/**
26 * ユーザーIDを検証する関数。
27 *
28 * @param mixed $userId 検証するユーザーID
29 * @return void
30 * @throws InvalidUserInputException ユーザーIDが正の整数でない場合にスローされる
31 */
32function validateUserId(mixed $userId): void
33{
34    // is_int()で整数かどうか、かつ正の数であるかを確認します。
35    if (!is_int($userId) || $userId <= 0) {
36        // 条件を満たさない場合、InvalidUserInputException のコンストラクタを呼び出して
37        // 例外オブジェクトを生成し、`throw`キーワードでスロー(送出)します。
38        throw new InvalidUserInputException("ユーザーIDは正の整数である必要があります。");
39    }
40
41    echo "ユーザーID '{$userId}' は有効です。" . PHP_EOL;
42}
43
44// try-catchブロックを使用して、例外が発生する可能性のある処理を実行します。
45try {
46    // 正常なケース
47    validateUserId(123);
48
49    // 意図的に例外を発生させるケース
50    validateUserId('user-abc');
51
52} catch (InvalidUserInputException $e) {
53    // InvalidUserInputException 型の例外がスローされた場合に、このブロックが実行されます。
54    // getMessage() メソッドでコンストラクタに渡したエラーメッセージを取得できます。
55    echo 'エラー: ' . $e->getMessage() . PHP_EOL;
56}

PHPのUnexpectedValueException::__constructは、UnexpectedValueExceptionクラスの新しいインスタンス(オブジェクト)を生成するためのコンストラクタです。コンストラクタは、newキーワードを使ってオブジェクトが生成される際に自動的に呼び出される特別なメソッドです。

このメソッドには3つの引数があります。第一引数の$messageは、例外が発生した理由を示すエラーメッセージの文字列です。第二引数の$codeは、エラーの種類を識別するための整数値(エラーコード)です。第三引数の$previousは、ある例外が別の例外を引き起こした場合に、元の例外オブジェクトを関連付ける「例外チェーン」のために使用します。これらの引数はすべて任意です。コンストラクタ自体に戻り値はありません。

サンプルコードでは、まずUnexpectedValueExceptionを継承したInvalidUserInputExceptionという独自の例外クラスを定義しています。validateUserId関数の中で、ユーザーIDが不正な値(正の整数でない)の場合にnew InvalidUserInputException("ユーザーIDは正の整数である必要があります。")という形でコンストラクタを呼び出しています。これにより、$messageに指定した文字列がセットされた例外オブジェクトが生成され、throwキーワードで送出されます。最終的にcatchブロックでこの例外オブジェクトが捕捉され、getMessage()メソッドを通じてコンストラクタに渡されたメッセージが表示されます。このように、コンストラクタは例外オブジェクトに具体的なエラー情報を設定する役割を担います。

このコードは、独自の例外クラスを定義してエラー処理を行う良い例です。__constructは、newキーワードでオブジェクトが作られる際に自動で実行される特殊なメソッドです。子クラスでコンストラクタを定義する場合、parent::__construct()を呼び出して親クラスの初期化処理を行うことが重要です。これを忘れると、例外オブジェクトが正しく機能しない可能性があります。throwで送出された例外は、必ずtry-catch構文で捕捉して処理します。コンストラクタに渡したエラーメッセージは、catchブロック内でgetMessage()メソッドを使って取得できます。独自の例外クラスを作ることで、エラーの種類に応じた的確な処理が可能になります。

PHP UnexpectedValueException コンストラクタで例外をスローする

1<?php
2
3declare(strict_types=1);
4
5/**
6 * ユーザーIDを検証し、数値でなければUnexpectedValueExceptionをスローする関数
7 *
8 * @param mixed $userId 検証するユーザーID
9 * @return void
10 * @throws UnexpectedValueException ユーザーIDが数値でない場合
11 */
12function validateUserId(mixed $userId): void
13{
14    if (!is_numeric($userId)) {
15        // UnexpectedValueExceptionのコンストラクタを呼び出し、例外オブジェクトを生成してスローする
16        // 第1引数: エラーメッセージ
17        // 第2引数: エラーコード
18        throw new UnexpectedValueException('ユーザーIDは数値である必要があります。', 1001);
19    }
20
21    echo "ユーザーID '{$userId}' は有効です。" . PHP_EOL;
22}
23
24// 例外処理のブロック
25try {
26    // 正常なケース
27    validateUserId(123);
28
29    // 例外が発生するケース
30    validateUserId('abc');
31} catch (UnexpectedValueException $e) {
32    // catchブロックでスローされた例外を捕捉する
33    echo 'エラーが発生しました。' . PHP_EOL;
34    // getMessage() でコンストラクタに渡したメッセージを取得
35    echo 'メッセージ: ' . $e->getMessage() . PHP_EOL;
36    // getCode() でコンストラクタに渡したコードを取得
37    echo 'エラーコード: ' . $e->getCode() . PHP_EOL;
38}

このサンプルコードは、UnexpectedValueExceptionクラスのコンストラクタ__constructメソッドの使用方法を示しています。コンストラクタは、newキーワードを使ってクラスの新しいインスタンス(オブジェクト)を生成する際に自動的に呼び出され、そのオブジェクトを初期化する役割を持ちます。

コード内のvalidateUserId関数では、引数が数値でない場合にthrow new UnexpectedValueException(...)として例外を発生させています。このnewが使われる部分で、__constructが実行されます。

__constructメソッドは、最大3つの引数を取ります。第1引数の$messageには、エラーの具体的な内容を示す文字列(この例では「ユーザーIDは数値である必要があります。」)を設定します。第2引数の$codeには、エラーの種類を識別するための整数値(この例では1001)を設定します。第3引数の$previousは、例外が連鎖した場合に、直前の例外オブジェクトを指定するために使いますが、この例では省略されています。

スローされた例外はcatchブロックで捕捉され、$e->getMessage()$e->getCode()といったメソッドを通じて、コンストラクタで設定したエラーメッセージやエラーコードを取得できます。このように、__constructは、発生したエラーの詳細情報を例外オブジェクトに格納するために不可欠なメソッドです。

UnexpectedValueExceptionのコンストラクタは、newキーワードを使って例外オブジェクトを生成する際に呼び出されます。例外を発生させるには、生成したオブジェクトを必ずthrowキーワードで投げる必要があります。newだけでは例外は発生しない点に注意してください。コンストラクタの第1引数に渡したエラーメッセージと第2引数のエラーコードは、catchブロックでそれぞれgetMessage()getCode()メソッドを使って取得できます。エラーの原因が具体的にわかるメッセージや、プログラムでエラーの種類を識別できる一意のコードを設定すると、デバッグやエラー処理が容易になります。この例外は、値が期待した型や形式ではなかった場合に使用するのが適切です。投げられた例外は必ずtry...catch構文で捕捉しないと、プログラムが致命的なエラーとして停止してしまいます。

関連コンテンツ