【PHP8.x】ErrorException::codeプロパティの使い方
codeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
codeプロパティは、ErrorExceptionクラスにおいて、発生したエラーの種類を示す数値コードを保持するプロパティです。
ErrorExceptionクラスは、PHPの通常の警告や通知といった標準エラーを、プログラム内で例外として捕捉し処理するための特殊な例外クラスです。PHPは通常、エラーが発生してもスクリプトの実行を停止せず、警告や通知を発するに留まりますが、set_error_handler関数を用いて設定することにより、これらのPHPエラーをErrorExceptionのインスタンスとしてスローし、try-catchブロックで例外として扱うことが可能になります。
このcodeプロパティには、E_WARNINGやE_NOTICE、E_USER_ERRORなどのPHPのエラー定数に対応する整数値が格納されます。これにより、開発者はtry-catchブロックでErrorExceptionを捕捉した際に、どの種類のエラーが発生したのかをcodeプロパティの値で正確に判別することができます。この情報を用いることで、アプリケーション内でエラーの種類に応じた具体的なエラー処理(例えば、エラーメッセージの表示、ログへの記録、特定の処理の中止など)を柔軟に実装することが可能となり、より堅牢なプログラム開発に役立ちます。
構文(syntax)
1<?php 2$errorException = new ErrorException("エラーメッセージの例", 500); 3$errorCode = $errorException->code; 4?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このプロパティは、例外の原因となったエラーコードを表す整数値を返します。
サンプルコード
PHP ErrorExceptionのcodeプロパティとCodeIgniterでのエラー表示
1<?php 2 3namespace App\Libraries; 4 5use CodeIgniter\Exceptions\PageNotFoundException; 6 7class ErrorHandler 8{ 9 /** 10 * エラーコードに基づいて、カスタムエラーページを表示します。 11 * 12 * @param int $code HTTPステータスコード 13 * 14 * @return string HTMLコンテンツ 15 */ 16 public function displayErrorPage(int $code): string 17 { 18 switch ($code) { 19 case 404: 20 // 404エラーページのパスを設定します。 21 $viewPath = 'errors/404_error'; 22 break; 23 case 500: 24 // 500エラーページのパスを設定します。 25 $viewPath = 'errors/500_error'; 26 break; 27 default: 28 // デフォルトのエラーページのパスを設定します。 29 $viewPath = 'errors/default_error'; 30 break; 31 } 32 33 // CodeIgniterビューローダーを使用してエラーページを読み込みます。 34 $view = \Config\Services::renderer(); 35 36 try { 37 return $view->render($viewPath, ['code' => $code]); 38 } catch (\Exception $e) { 39 // ビューファイルが存在しない場合、例外をキャッチし、デフォルトメッセージを表示します。 40 return "<h1>エラーが発生しました。</h1><p>エラーコード: {$code}</p>"; 41 } 42 } 43 44 /** 45 * PageNotFoundException を throw するサンプル 46 * 47 * @throws PageNotFoundException 48 */ 49 public function throwNotFoundException(): void 50 { 51 throw new PageNotFoundException("指定されたページが見つかりません。"); 52 } 53} 54 55// 使用例: 56// $errorHandler = new ErrorHandler(); 57// echo $errorHandler->displayErrorPage(404); // 404エラーページを表示 58// try { 59// $errorHandler->throwNotFoundException(); 60// } catch (PageNotFoundException $e) { 61// echo "例外がキャッチされました: " . $e->getMessage(); 62// }
このサンプルコードは、PHPとCodeIgniterフレームワークを使用して、カスタムエラーページを表示するためのErrorHandlerクラスを定義しています。ErrorHandlerクラスは、HTTPステータスコードを受け取り、それに基づいて適切なエラーページをレンダリングするdisplayErrorPageメソッドを持っています。
displayErrorPageメソッドは、引数として整数型の$code(HTTPステータスコード)を受け取ります。この$codeの値に応じて、異なるエラーページのビューファイルが選択されます。例えば、$codeが404の場合、errors/404_errorというビューファイルが読み込まれます。CodeIgniterのビューローダーを利用して、指定されたビューファイルをレンダリングし、HTMLコンテンツを文字列として返します。もしビューファイルが存在しないなどの理由で例外が発生した場合は、エラーメッセージを表示します。
また、throwNotFoundExceptionメソッドは、PageNotFoundExceptionをスローする例を示しています。これは、指定されたページが見つからない場合に例外を発生させるために使用されます。try-catchブロックを使用することで、この例外を捕捉し、エラーメッセージを表示できます。
このコードは、Webアプリケーションにおけるエラーハンドリングの基本的な方法を示しており、システムエンジニアを目指す初心者にとって、エラー処理の概念を理解するための良い出発点となります。特に、CodeIgniterフレームワークにおけるビューのレンダリングや例外処理の方法を学ぶことができます。
このサンプルコードは、CodeIgniter4フレームワークにおけるカスタムエラーハンドリングの例です。ErrorExceptionクラスのcodeプロパティ(エラーコード)をdisplayErrorPageメソッド内で利用し、HTTPステータスコードに基づいて適切なエラーページを表示しています。
注意点として、viewPath変数の設定は、実際のビューファイルパスと一致させる必要があります。また、try-catchブロックでビューのレンダリングエラーを捕捉し、代替メッセージを表示することで、ビューファイルが存在しない場合でもエラーを適切に処理しています。throwNotFoundExceptionメソッドは、PageNotFoundExceptionをスローする例を示しており、例外処理の基本を理解するのに役立ちます。例外処理を適切に行うことで、予期せぬエラー発生時にもプログラムが停止せず、安定性を高めることができます。
ErrorExceptionのcodeプロパティを取得する
1<?php 2 3/** 4 * ErrorException の code プロパティの例 5 * 6 * PHP_CodeSniffer を使用してコーディング規約を確認することを推奨します。 7 */ 8try { 9 // 意図的にエラーを発生させる 10 trigger_error("This is a test error.", E_USER_WARNING); 11} catch (ErrorException $e) { 12 // ErrorException オブジェクトからエラーコードを取得 13 $errorCode = $e->getCode(); 14 15 // エラーコードを表示 16 echo "Error Code: " . $errorCode . PHP_EOL; 17 18 // エラーメッセージを表示 19 echo "Error Message: " . $e->getMessage() . PHP_EOL; 20}
ErrorExceptionクラスのcodeプロパティは、発生したエラーのエラーコード(整数値)を保持します。このプロパティは、例外オブジェクトを通じてエラーの種類を識別するために使用されます。サンプルコードでは、trigger_error()関数を使用して意図的にE_USER_WARNINGレベルのエラーを発生させています。このエラーはErrorExceptionとしてキャッチされ、キャッチされた例外オブジェクトのgetCode()メソッドを呼び出すことで、エラーコードを取得しています。getCode()メソッドは引数を取らず、エラーコードの整数値を返します。取得したエラーコードは、echoステートメントによってコンソールに出力されます。このようにcodeプロパティを利用することで、発生したエラーの種類をプログラム上で判別し、適切なエラーハンドリングを行うことが可能になります。
なお、サンプルコード内には、PHP_CodeSnifferの使用を推奨するコメントが含まれています。PHP_CodeSnifferは、PHPのコーディング規約をチェックするためのツールであり、一貫性のあるコードスタイルを維持するために役立ちます。ErrorExceptionのcodeプロパティの利用と合わせて、PHP_CodeSnifferなどのツールを活用することで、より質の高いコードを作成できます。
ErrorExceptionのcodeプロパティは、発生したエラーの種類を示す整数値を返します。この値は、trigger_errorなどで指定したエラーレベル(E_USER_WARNINGなど)とは異なる点に注意が必要です。getErrorメソッドで取得できるエラーメッセージと合わせて、エラーの原因特定に役立てることができます。
サンプルコードでは、trigger_error関数で意図的にエラーを発生させていますが、実際のエラー処理では、より複雑な状況に対応する必要があるかもしれません。また、PHP_CodeSnifferを使用することで、コーディング規約に沿ったコードを記述し、可読性や保守性を向上させることができます。エラー処理とコーディング規約を意識することで、より安全で安定したプログラムを作成できます。
PHP ErrorException::code でエラーレベルを取得する
1<?php 2 3/** 4 * PHPのエラーをErrorExceptionとして捕捉可能にするためのエラーハンドラーを設定します。 5 * 通常、PHPのWarningやNoticeは例外ではないためtry-catchでは捕捉できませんが、 6 * このハンドラーを使用することでErrorExceptionに変換され、捕捉可能になります。 7 * 8 * @param int $severity PHPのエラーレベル (例: E_WARNING, E_NOTICE)。 9 * @param string $message エラーメッセージ。 10 * @param string $file エラーが発生したファイル名。 11 * @param int $line エラーが発生した行番号。 12 * @return bool 13 * @throws ErrorException エラーレベルがerror_reporting設定に含まれる場合にスローされます。 14 */ 15set_error_handler(function (int $severity, string $message, string $file, int $line): bool { 16 // 現在のerror_reporting設定に含まれないエラーレベルは、PHPの標準エラーハンドラーに任せる 17 if (!(error_reporting() & $severity)) { 18 return false; 19 } 20 // PHPのエラーレベル($severity)をErrorExceptionのコード($code)として渡す 21 // これにより、$e->getCode()でPHPのエラーレベルを取得できます 22 throw new ErrorException($message, $severity, $severity, $file, $line); 23}); 24 25/** 26 * ErrorExceptionの発生と、そのcodeプロパティの利用方法をデモンストレーションします。 27 * システムエンジニアを目指す初心者向けに、具体的なエラーシナリオと捕捉方法を示します。 28 */ 29function demonstrateErrorExceptionCode(): void 30{ 31 echo "--- ErrorException::code デモンストレーション開始 ---\n\n"; 32 33 // シナリオ1: ゼロ除算によるE_WARNINGの発生 34 try { 35 echo "■ シナリオ1: ゼロ除算 (E_WARNINGをトリガー)\n"; 36 $numerator = 10; 37 $denominator = 0; 38 39 // この行で E_WARNING (Division by zero) が発生し、ErrorExceptionに変換される 40 $result = $numerator / $denominator; 41 echo "結果: " . $result . "\n"; // この行は例外発生のため実行されない 42 } catch (ErrorException $e) { 43 echo " ErrorExceptionを捕捉しました!\n"; 44 echo " メッセージ: " . $e->getMessage() . "\n"; 45 // ErrorException::code は、エラー発生時のPHPのエラーレベル(数値)を保持します。 46 // E_WARNING の場合、通常は「2」です。 47 echo " エラーコード (PHPエラーレベル): " . $e->getCode() . " (E_WARNINGは通常2)\n"; 48 echo " ファイル: " . $e->getFile() . "\n"; 49 echo " 行: " . $e->getLine() . "\n"; 50 } finally { 51 echo " シナリオ1完了。\n\n"; 52 } 53 54 // シナリオ2: 未定義変数へのアクセスによるE_NOTICEの発生 55 try { 56 echo "■ シナリオ2: 未定義変数へのアクセス (E_NOTICEをトリガー)\n"; 57 // この行で E_NOTICE (Undefined variable) が発生し、ErrorExceptionに変換される 58 $value = $undefinedVariable + 5; 59 echo "値: " . $value . "\n"; // この行は例外発生のため実行されない 60 } catch (ErrorException $e) { 61 echo " ErrorExceptionを捕捉しました!\n"; 62 echo " メッセージ: " . $e->getMessage() . "\n"; 63 // E_NOTICE の場合、通常は「8」です。 64 echo " エラーコード (PHPエラーレベル): " . $e->getCode() . " (E_NOTICEは通常8)\n"; 65 echo " ファイル: " . $e->getFile() . "\n"; 66 echo " 行: " . $e->getLine() . "\n"; 67 } finally { 68 echo " シナリオ2完了。\n\n"; 69 } 70 71 echo "--- ErrorException::code デモンストレーション終了 ---\n"; 72} 73 74// デモンストレーション関数を実行 75demonstrateErrorExceptionCode(); 76 77// カスタムエラーハンドラーを元のPHPのハンドラーに戻します。 78// スクリプトの他の部分や、ライブラリとして組み込む際に影響を与えないようにするために重要です。 79restore_error_handler();
PHPのErrorExceptionクラスに属するcodeプロパティは、エラーの種類を識別するための整数値を保持します。このプロパティは引数を取らず、エラーレベルを示すint型の値を返します。
通常、PHPのWarningやNoticeといったエラーは、プログラムの実行を中断させる例外とは異なり、try-catchブロックでは直接捕捉できません。しかし、set_error_handler関数を用いてカスタムエラーハンドラーを設定することで、これらのPHPエラーをErrorExceptionとして変換し、捕捉可能にすることができます。
サンプルコードでは、このカスタムエラーハンドラー内でPHPのエラーレベル($severity)をErrorExceptionのcodeプロパティに設定しています。これにより、ゼロ除算(E_WARNING)や未定義変数へのアクセス(E_NOTICE)によって発生したErrorExceptionをtry-catchブロックで捕捉した際、$e->getCode()を呼び出すことで、元々のPHPのエラーレベルを数値として取得できます。例えば、E_WARNINGは通常2、E_NOTICEは通常8という値に対応します。このcodeプロパティを活用することで、捕捉したエラーの種類に応じて、より詳細なエラー処理を行うことが可能になります。
このサンプルコードで設定しているset_error_handlerは、PHPの標準エラーをErrorExceptionとして捕捉するための強力な機能ですが、乱用は避け、必要な範囲で利用してください。ErrorException::codeプロパティは、発生したPHPエラーのレベル(E_WARNINGやE_NOTICEなどの数値)を表し、アプリケーションが独自に定義するエラーコードとは異なる点に注意が必要です。カスタムエラーハンドラーを設定する際は、error_reporting()の設定を考慮し、不要なエラーまで捕捉しないように制御することが重要です。また、グローバルな設定を変更するため、スクリプトの最後には必ずrestore_error_handler()を呼び出し、元のエラーハンドラーに戻すようにしましょう。これにより、他のコードやライブラリへの予期せぬ影響を防ぎます。開発段階ではphp codesnifferやVS Codeなどのツールを活用し、早期にエラーや警告を発見・修正することが、このような例外捕捉に頼るよりも望ましい実践です。
PHPコードのエラーコードをチェックする
1<?php 2 3/** 4 * カスタムエラーハンドラ関数。 5 * PHPの警告や通知をErrorExceptionとしてスローします。 6 * これにより、try-catchブロックでPHPのエラーを捕捉できるようになります。 7 * 8 * @param int $severity エラーの深刻度 (E_WARNING, E_NOTICEなど) 9 * @param string $message エラーメッセージ 10 * @param string $file エラーが発生したファイル名 11 * @param int $line エラーが発生した行番号 12 * @throws ErrorException 13 * @return void 14 */ 15function customErrorHandler(int $severity, string $message, string $file, int $line): void 16{ 17 // 現在のerror_reporting設定で無視されるエラーは処理しない 18 // 例えば、エラーレポートがE_ALL & ~E_NOTICEの場合、E_NOTICEはここで変換されない 19 if (!(error_reporting() & $severity)) { 20 return; 21 } 22 23 // ErrorExceptionとしてスローし、通常の例外処理フローに乗せる 24 // 第2引数は通常、例外コードですが、ここではPHPのエラーレベルを直接渡します。 25 // ErrorException::code プロパティに格納されるのはこの $severity です。 26 throw new ErrorException($message, 0, $severity, $file, $line); 27} 28 29/** 30 * PHPコードのエラーレベルをチェックするサンプル関数。 31 * 意図的にPHPの警告や通知を発生させ、ErrorExceptionとして捕捉し、 32 * そのエラーコード (ErrorException::code) を表示します。 33 * これは、実行時のコードの問題を特定する「php code checker」の一種と見なせます。 34 * 35 * @return void 36 */ 37function checkPhpCodeErrorLevel(): void 38{ 39 echo "PHPコードのエラーレベルチェックを開始します。\n"; 40 41 // 最初にカスタムエラーハンドラを設定 42 // これにより、E_WARNINGやE_NOTICEがErrorExceptionとして捕捉できるようになります。 43 set_error_handler('customErrorHandler'); 44 45 // --- 例1: E_NOTICE (通知) の発生と捕捉 --- 46 echo "\n--- 例1: 未定義変数へのアクセスによる E_NOTICE の捕捉 ---\n"; 47 echo "意図的に未定義変数にアクセスし、E_NOTICEを発生させます。\n"; 48 try { 49 // 未定義変数にアクセスすることでE_NOTICEが発生します 50 $undefinedVariable = $thisVariableDoesNotExist; // ここで E_NOTICE が発生 51 52 // この行は通常実行されません(E_NOTICEがErrorExceptionとしてスローされるため) 53 echo "この行は実行されません。\n"; 54 } catch (ErrorException $e) { 55 echo "ErrorExceptionを捕捉しました。\n"; 56 echo " エラーメッセージ: " . $e->getMessage() . "\n"; 57 echo " 発生ファイル: " . $e->getFile() . "\n"; 58 echo " 発生行: " . $e->getLine() . "\n"; 59 echo " エラーコード (ErrorException::code): " . $e->getCode() . "\n"; // ここでコードを取得 60 61 // 取得したエラーコードがPHPのE_NOTICE定数と一致するか確認 62 if ($e->getCode() === E_NOTICE) { 63 echo " このエラーコードはPHPのE_NOTICE (" . E_NOTICE . ") と一致します。\n"; 64 } else { 65 echo " エラーコードはE_NOTICEと一致しません。捕捉されたエラーレベル: " . $e->getCode() . "\n"; 66 } 67 } 68 69 // --- 例2: E_WARNING (警告) の発生と捕捉 --- 70 echo "\n--- 例2: 不適切な引数による E_WARNING の捕捉 ---\n"; 71 echo "意図的に無効な引数で関数を呼び出し、E_WARNINGを発生させます。\n"; 72 try { 73 // count() 関数は配列やCountableオブジェクトを期待しますが、整数を渡します 74 count(123); // ここで E_WARNING が発生 75 76 echo "この行は実行されません。\n"; 77 } catch (ErrorException $e) { 78 echo "ErrorExceptionを捕捉しました。\n"; 79 echo " エラーメッセージ: " . $e->getMessage() . "\n"; 80 echo " 発生ファイル: " . $e->getFile() . "\n"; 81 echo " 発生行: " . $e->getLine() . "\n"; 82 echo " エラーコード (ErrorException::code): " . $e->getCode() . "\n"; // ここでコードを取得 83 84 // 取得したエラーコードがPHPのE_WARNING定数と一致するか確認 85 if ($e->getCode() === E_WARNING) { 86 echo " このエラーコードはPHPのE_WARNING (" . E_WARNING . ") と一致します。\n"; 87 } else { 88 echo " エラーコードはE_WARNINGと一致しません。捕捉されたエラーレベル: " . $e->getCode() . "\n"; 89 } 90 } finally { 91 // スクリプトの他の部分に影響を与えないよう、カスタムエラーハンドラを元に戻す 92 restore_error_handler(); 93 echo "\nエラーレベルチェックを終了しました。\n"; 94 } 95} 96 97// サンプル関数を実行 98checkPhpCodeErrorLevel(); 99 100?>
PHPのErrorException::codeプロパティは、エラーの「種類」や「深刻度」を示す整数値を格納します。このプロパティは引数を取らず、常に整数値を返します。特にPHPの標準エラー(警告や通知など)がErrorExceptionとして捕捉された際に、そのPHPエラーのレベル(例えばE_WARNINGやE_NOTICEといったPHP定数)がこのcodeプロパティに設定されます。
提示されたサンプルコードでは、set_error_handler関数を用いて、通常のPHPエラー発生時にErrorExceptionをスローするカスタムエラーハンドラを設定しています。これにより、try-catchブロックでPHPの警告や通知といった実行時エラーを捕捉できるようになります。
コード内では、意図的に未定義変数へのアクセス(E_NOTICE)や、count()関数への不適切な引数渡し(E_WARNING)を発生させています。これらのエラーがカスタムハンドラによってErrorExceptionに変換され、catchブロックで捕捉されます。捕捉されたErrorExceptionオブジェクトに対してgetCode()メソッドを呼び出すことで、ErrorException::codeプロパティに格納されているPHPのエラーレベル(E_NOTICEやE_WARNINGの具体的な数値)を取得し、表示しています。
このように、ErrorException::codeプロパティを利用することで、プログラム実行中に発生したPHPのエラーの種類を正確に特定し、それに応じた処理を行うことが可能になります。これは、開発中のコード品質をチェックし、実行時の問題を特定する「php code checker」のような用途で非常に有効な仕組みです。
このサンプルコードは、set_error_handler関数を用いて、PHPの実行時に発生する警告や通知(E_NOTICE、E_WARNINGなど)をErrorExceptionとして捕捉する方法を示しています。これにより、try-catchブロックで通常のエラーも例外として処理できるようになります。ErrorException::codeプロパティには、捕捉したPHPエラーのレベル(E_NOTICEやE_WARNING定数の値)が数値として格納されるため、発生したエラーの種類を特定する際に役立ちます。特に重要なのは、set_error_handlerでカスタムハンドラを設定したら、必ずfinallyブロックなどでrestore_error_handlerを呼び出し、元のエラーハンドラに戻すことです。これは、スクリプトの他の部分や読み込まれる他のライブラリへの予期せぬ影響を防ぐために不可欠です。また、カスタムエラーハンドラはerror_reportingの設定に従って動作し、現在の設定でレポート対象外となっているエラーは処理しない点も理解しておきましょう。この方法は、実行時のコードの問題を検出する用途で大変有用です。