【PHP8.x】codeプロパティの使い方

codeプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

codeプロパティは、UnhandledMatchErrorオブジェクトがスローされた際のエラーコードを保持するプロパティです。

UnhandledMatchErrorは、PHP 8で導入された新しいエラークラスであり、match式を使用する際に発生します。match式は、複数の条件を簡潔に記述できる強力な制御構造ですが、与えられた値がどのcaseにも一致せず、かつdefaultケースが定義されていない場合に、このUnhandledMatchErrorがスローされます。

このcodeプロパティは、PHPのすべてのエラーや例外が共通して持つThrowableインターフェースの一部であり、エラーの種類を数値で識別するために使用されます。UnhandledMatchErrorの場合、このプロパティには通常0という値が設定されています。これは、特定のカスタムエラーコードが割り当てられていない一般的なエラーであることを示します。

プログラマがエラーハンドリングを行う際、try-catchブロックでUnhandledMatchErrorを捕捉し、このcodeプロパティの値を確認することで、エラーの種類や発生状況をプログラム的に判断できます。たとえば、エラーログに詳細を記録したり、ユーザーに対して状況に応じた適切なエラーメッセージを表示したりする際に、このコードを利用して処理を分岐させることが可能です。このように、codeプロパティは、システムのデバッグや堅牢なエラーハンドリングを実装するために役立つ重要な情報を提供します。

構文(syntax)

1<?php
2
3try {
4    $value = 1;
5    match ($value) {
6        2 => 'two',
7    };
8} catch (UnhandledMatchError $e) {
9    echo $e->code;
10}

引数(parameters)

戻り値(return)

int

このプロパティは、未処理の match 式のエラーコードを表す整数値を返します。

サンプルコード

PHP UnhandledMatchErrorの捕捉とコード取得

1<?php
2
3/**
4 * `match` 式が未処理の値に遭遇した場合に発生する UnhandledMatchError を捕捉し、
5 * そのエラーコードを表示するサンプルです。
6 *
7 * CodeIgniterなどのフレームワークで構築されたアプリケーションにおいて、
8 * ユーザー入力の処理やAPIエンドポイントのルーティングロジックなどで
9 * このようなエラーが発生する可能性があります。
10 * システムエンジニアの初心者向けに、エラーの捕捉と情報取得の基本を示します。
11 *
12 * @param string $statusIdentifier 処理識別子
13 * @return string 処理結果またはエラーメッセージ
14 */
15function processApplicationStatus(string $statusIdentifier): string
16{
17    try {
18        // `match` 式を使用し、特定のステータス識別子を処理します。
19        // ここでは 'success' と 'failure' のみが定義されており、
20        // それ以外の値は UnhandledMatchError を引き起こします。
21        // (例: CodeIgniterのコントローラで、リクエストパラメータに応じて処理を分岐する場面など)
22        $message = match ($statusIdentifier) {
23            'success' => '処理が正常に完了しました。',
24            'failure' => '処理が失敗しました。',
25            // `default` ケースがないため、'success' または 'failure' 以外の値は UnhandledMatchError を発生させます。
26        };
27        return $message;
28    } catch (UnhandledMatchError $e) {
29        // UnhandledMatchError を捕捉し、エラーメッセージとエラーコードを取得します。
30        // このエラーコード (getCode()) は、UnhandledMatchError の場合、PHPの内部実装により通常 0 を返します。
31        // エラーを捕捉し、その詳細情報(メッセージとコード)を利用できることが重要です。
32        // CodeIgniterアプリケーションでは、この情報をログに記録したり、
33        // クライアントに適切なHTTPステータスコードと共にエラーレスポンスを返したりすることが考えられます。
34        return "エラーが発生しました: " . $e->getMessage() . " (エラーコード: " . $e->getCode() . ")";
35    }
36}
37
38// --- サンプル実行 ---
39
40// 正常に処理されるケース
41echo "ケース1 (正常): " . processApplicationStatus('success') . PHP_EOL;
42
43// UnhandledMatchError が発生し、捕捉されるケース
44echo "ケース2 (エラー): " . processApplicationStatus('pending') . PHP_EOL;
45

このサンプルコードは、PHP 8で導入されたmatch式が未処理の値に遭遇した場合に発生するUnhandledMatchErrorを捕捉し、そのエラーコードを取得する方法を示しています。processApplicationStatus関数は、$statusIdentifierという文字列の引数を受け取り、match式を使って特定のステータスに応じてメッセージを生成します。しかし、'success'と'failure'以外の値が渡された場合、match式に該当するケースがないためUnhandledMatchErrorが発生します。

このエラーはtry-catchブロックによって捕捉されます。catch (UnhandledMatchError $e)でエラーオブジェクト$eを受け取り、そこから$e->getMessage()でエラーの詳細な説明を、$e->getCode()でエラーコードを取得しています。UnhandledMatchErrorにおけるcodeプロパティ(getCode()の戻り値)は、PHPの内部実装により通常0を返しますが、エラーが発生したことをプログラマが特定し、適切な処理を行うための重要な情報源となります。

システムエンジニアを目指す初心者の方にとって、このようにエラーを捕捉し、その詳細情報(メッセージやコード)を利用して問題解決や適切なユーザーフィードバックを行う基本は非常に重要です。CodeIgniterなどのフレームワークで構築されたアプリケーションでは、ユーザーからの不正な入力や予期せぬAPIリクエストに対して、このエラー捕捉の仕組みを利用してエラーログを記録したり、ユーザーに分かりやすいエラーメッセージを返すことで、システムの堅牢性を高めることができます。関数は最終的に、処理が成功した場合は結果メッセージを、エラーが発生した場合はエラー情報を含む文字列を返します。

match式では、すべての可能性を網羅するdefault句がない場合、どのケースにも合致しない値が渡されるとUnhandledMatchErrorが発生します。これをtry-catchで捕捉しないと、アプリケーションが予期せず停止してしまいますので、必ずエラー捕捉の仕組みを導入してください。UnhandledMatchErrorgetCode()メソッドは、特別な設定がない限り0を返します。これは他の例外のように独自のエラーコードで種類を区別する用途には適さないため、エラーメッセージや型で判断することが一般的です。CodeIgniterなどのフレームワークを利用する場合も、同様にtry-catchでエラーを捕捉し、ユーザーへの適切な情報提供やログ記録、HTTPステータスコードの返却を行うことで、堅牢なアプリケーションを構築できます。

PHP 8 UnhandledMatchError コード取得

1<?php
2
3/**
4 * PHP 8 で導入された UnhandledMatchError のエラーコード取得方法を示すサンプル。
5 *
6 * この関数は、match 式がすべての可能な値を網羅していない場合に発生する
7 * UnhandledMatchError を意図的に発生させ、そのエラーオブジェクトから
8 * エラーコード(通常は 0)を取得する方法を実演します。
9 *
10 * @param string $value match 式の評価に使用する値。
11 * @return int 捕捉された UnhandledMatchError のエラーコード、またはエラーが発生しなかった場合は 0。
12 *             リファレンスの「名前: code, 引数: なし, 戻り値: int」は、
13 *             実際には `Throwable` インターフェースが提供する `getCode()` メソッドを指します。
14 */
15function demonstrateUnhandledMatchErrorCode(string $value): int
16{
17    try {
18        // match 式を使用し、意図的に UnhandledMatchError を発生させるケースを作成。
19        // 'handled_case' 以外の値が渡された場合、対応するアームがないため
20        // UnhandledMatchError がスローされます。
21        $result = match ($value) {
22            'handled_case' => 'この値は処理されました。',
23            // 'default' や他のケースがないため、網羅されない値はエラーになります。
24        };
25        echo "マッチ結果: " . $result . PHP_EOL;
26        return 0; // エラーが発生しなかった場合のコード
27    } catch (UnhandledMatchError $e) {
28        // UnhandledMatchError を捕捉します。
29        echo "UnhandledMatchError を捕捉しました: " . $e->getMessage() . PHP_EOL;
30        // エラーオブジェクトからエラーコードを取得します。
31        // UnhandledMatchError のコードは通常 0 です。
32        return $e->getCode();
33    } catch (Throwable $e) {
34        // UnhandledMatchError 以外の予期しないエラーを捕捉します。
35        echo "予期せぬエラーを捕捉しました: " . $e->getMessage() . PHP_EOL;
36        return $e->getCode();
37    }
38}
39
40// --- サンプル実行 ---
41
42// 1. UnhandledMatchError を発生させるケース
43echo "--- シナリオ1: UnhandledMatchError の発生 ---" . PHP_EOL;
44$errorCode = demonstrateUnhandledMatchErrorCode('unhandled_case');
45echo "捕捉された UnhandledMatchError のエラーコード: " . $errorCode . PHP_EOL;
46echo PHP_EOL;
47
48// 2. UnhandledMatchError が発生しないケース
49echo "--- シナリオ2: UnhandledMatchError が発生しない場合 ---" . PHP_EOL;
50$errorCode = demonstrateUnhandledMatchErrorCode('handled_case');
51echo "UnhandledMatchError は発生しませんでした。返されたコード: " . $errorCode . PHP_EOL;
52

このPHPコードは、PHP 8で導入されたUnhandledMatchErrorというエラーの捕捉方法と、そのエラーコードの取得方法を示しています。UnhandledMatchErrorは、match式で処理対象となる値に対応するケースが一つも定義されていない場合に発生します。

demonstrateUnhandledMatchErrorCode関数は、$valueという文字列型の引数を取り、この値を用いてmatch式を評価します。関数は、UnhandledMatchErrorを捕捉した場合にそのエラーコード(通常は0)を整数型で返します。エラーが発生しなかった場合は0を返します。

この関数では、try-catchブロックを用いてmatch式がスローするUnhandledMatchErrorを捕捉しています。捕捉したエラーオブジェクトから$e->getCode()を呼び出すことでエラーコードを取得します。リファレンスにあるUnhandledMatchErrorcodeは、実際には基底となるThrowableインターフェースが提供するgetCode()メソッドで取得されることを意味しています。このコードは、UnhandledMatchErrorが発生するシナリオと発生しないシナリオの両方を通じて、具体的なエラーハンドリングの挙動を分かりやすく説明しています。

リファレンスのUnhandledMatchError::codeは、Throwableインターフェースが提供するgetCode()メソッドで取得するエラーコードを指します。UnhandledMatchErrorのエラーコードは、通常0となることに注意が必要です。このエラーは、PHP 8で導入されたmatch式が、与えられたすべての入力値を網羅していない場合に発生します。実際のアプリケーションでは、match式にdefaultアームを設定するなどして、網羅性を確保し、予期せぬUnhandledMatchErrorの発生を防ぐことが重要です。また、例外を捕捉する際は、具体的なUnhandledMatchErrorを先に、その後に汎用的なThrowableを捕捉する順序が推奨されます。これにより、意図したエラー処理を適切に行うことができます。

【PHP8.x】codeプロパティの使い方 | いっしー@Webエンジニア