【PHP8.x】ErrorException::severityプロパティの使い方
severityプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
severityプロパティは、ErrorExceptionオブジェクトが表すエラーの深刻度(エラーレベル)を整数値として保持するプロパティです。このプロパティは、PHPの標準的なエラー処理機構において発生する警告(E_WARNING)、通知(E_NOTICE)、ユーザー定義エラー(E_USER_ERROR)といった、様々な種類のエラーのレベルを識別するために使用されます。
ErrorExceptionクラスは、PHPが通常発生させるエラーや警告を、例外(Exception)として捕捉し、統一的に処理できるようにするために存在します。開発者はこのErrorExceptionを利用することで、従来のC言語スタイルで扱われていたエラーを、オブジェクト指向の例外処理の枠組みで管理できるようになります。
このseverityプロパティに格納される整数値は、error_reporting関数などで指定するPHPのエラーレベル定数に対応しており、例えばE_WARNINGであれば2、E_NOTICEであれば8といった値が設定されます。これにより、捕捉したErrorExceptionオブジェクトがどのような種類のエラーを表しているのかをプログラム上で簡単に判別できます。例えば、特定の警告レベルのエラーだけをログに出力し、より深刻なエラーの場合にはユーザーに通知するといった、柔軟なエラーハンドリングロジックを実装する際に、このseverityプロパティが重要な役割を果たします。開発者はこの値を確認することで、エラーの種類に応じた適切な対応を決定し、システムの安定性と信頼性を高めることができます。
構文(syntax)
1<?php 2// ErrorExceptionのインスタンスを生成(または既存のものを取得) 3$errorException = new ErrorException('エラーメッセージ', 0, E_WARNING, __FILE__, __LINE__); 4 5// severityプロパティにアクセスして、エラーの深刻度を取得 6$errorSeverity = $errorException->severity; 7?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このプロパティは、例外が発生した際の深刻度を示す整数値を返します。
サンプルコード
PHP ErrorException severity 8192 を取得する
1<?php 2 3// ErrorException クラスの severity プロパティの例 4try { 5 // E_USER_NOTICE を発生させる 6 trigger_error("これはユーザー定義の通知です。", E_USER_NOTICE); 7} catch (ErrorException $e) { 8 // ErrorException がキャッチされた場合、severity プロパティの値を出力する 9 echo "エラーの重要度: " . $e->severity . PHP_EOL; 10 11 // severity プロパティの値が 8192 (E_USER_NOTICE) であるか確認 12 if ($e->severity === E_USER_NOTICE) { 13 echo "エラーの重要度は E_USER_NOTICE (8192) です。" . PHP_EOL; 14 } 15} 16 17?>
このサンプルコードは、PHP 8における ErrorException クラスの severity プロパティの使い方を示しています。ErrorException は、PHPのエラーを例外として扱うためのクラスです。
まず、trigger_error() 関数を使用して、E_USER_NOTICE レベルのユーザー定義のエラーを発生させています。このエラーは try-catch ブロックで ErrorException としてキャッチされます。
ErrorException オブジェクトの severity プロパティは、発生したエラーの重要度を表す整数値です。この例では、E_USER_NOTICE が発生しているため、$e->severity は E_USER_NOTICE に対応する値、つまり 8192 を持ちます。
サンプルコードでは、echo "エラーの重要度: " . $e->severity . PHP_EOL; によって、この重要度を出力しています。
さらに、if ($e->severity === E_USER_NOTICE) という条件分岐によって、severity プロパティの値が E_USER_NOTICE (8192) であるかどうかを確認し、その結果に応じてメッセージを出力しています。
このように、severity プロパティを参照することで、発生したエラーの種類をプログラム内で判別し、適切な処理を行うことができます。システムエンジニアを目指す上で、エラーの種類に応じた処理を記述することは重要です。
ErrorExceptionオブジェクトのseverityプロパティは、発生したエラーの種類を示す整数値です。trigger_error()関数で発生させたエラーの種類(例えばE_USER_NOTICE)が格納されます。
サンプルコードでは、$e->severityでエラーの種類を取得し、E_USER_NOTICE定数と比較しています。数値8192を直接比較しても同じ結果が得られますが、可読性のために定数を使用する方が推奨されます。
trigger_error()を使用する際は、エラーハンドラが設定されているか確認してください。設定されていない場合、エラーは表示されるだけで、ErrorExceptionはスローされません。また、error_reporting設定で、E_USER_NOTICEのようなユーザー定義のエラーが表示されるように設定されているか確認が必要です。
PHP ErrorExceptionのseverityを取得する
1<?php 2 3// エラーハンドラ関数を定義します。 4function errorHandler(int $severity, string $message, string $file, int $line): bool 5{ 6 if (error_reporting() & $severity) { 7 // ErrorException をスローします。 8 throw new ErrorException($message, 0, $severity, $file, $line); 9 } 10 11 // PHP の組み込みエラーハンドラを実行しません。 12 return true; 13} 14 15// エラーハンドラを設定します。 16set_error_handler('errorHandler'); 17 18try { 19 // 意図的に警告を発生させます。 20 $result = 10 / 0; // Warning: Division by zero 21 22} catch (ErrorException $e) { 23 // ErrorException をキャッチし、severity プロパティの値を取得します。 24 echo "Caught ErrorException: " . $e->getMessage() . PHP_EOL; 25 echo "Severity: " . $e->severity . PHP_EOL; 26} finally { 27 // エラーハンドラをリセットします。 28 restore_error_handler(); 29} 30 31?>
このPHPのサンプルコードは、ErrorExceptionクラスのseverityプロパティの役割を示すものです。 ErrorExceptionは、PHPのエラーを例外として扱うためのクラスです。
まず、set_error_handler()関数を使って、独自のエラーハンドラ関数errorHandler()を登録します。この関数は、PHPがエラーを検出した際に呼び出されます。 errorHandler()内では、エラーの種類($severity)に基づいてErrorExceptionをスローしています。$severity引数には、発生したエラーの種類を表す整数値が渡されます。(例:E_WARNING, E_NOTICE)
try...catchブロックの中で、意図的にゼロ除算を行い警告を発生させます。この警告は、設定したエラーハンドラによってErrorExceptionとしてキャッチされます。
catchブロック内では、キャッチしたErrorExceptionオブジェクトのseverityプロパティにアクセスしています。$e->severityとすることで、例外が発生した際のエラーレベル(severity)の値を取得できます。severityプロパティは整数値を返し、発生したエラーの種類(警告、通知など)を示します。
最後に、restore_error_handler()関数を使って、エラーハンドラをデフォルトの状態に戻します。これは、スクリプトの他の部分に影響を与えないようにするためです。 このサンプルコードは、エラーハンドリングの基本的な流れと、ErrorExceptionオブジェクトが保持するエラーレベル情報をseverityプロパティを通じて取得する方法を示しています。
ErrorExceptionのseverityプロパティは、発生したエラーの種類(警告、注意、エラーなど)を示す整数値です。この値は、error_reporting()関数で設定されたエラーレベルと組み合わせて、特定のエラーを処理するかどうかを判断するために使用されます。
サンプルコードでは、カスタムエラーハンドラ内でErrorExceptionがスローされ、severityプロパティの値が出力されています。ErrorExceptionをキャッチする際には、このseverityプロパティを参考に、エラーの種類に応じた適切な処理を実装できます。
restore_error_handler()は、スクリプトの最後にエラーハンドラをリセットするために重要です。リセットしない場合、以降の処理に影響を与える可能性があります。
PHP ErrorExceptionのseverityを取得する
1<?php 2 3/** 4 * PHPの標準エラーをErrorExceptionとして捕捉するためのカスタムエラーハンドラ。 5 * 6 * この関数はset_error_handler()に登録され、 7 * PHPが通常のエラー(警告や通知など)を発生させた際に呼び出されます。 8 * 発生したエラーをErrorExceptionオブジェクトに変換してスローします。 9 * 10 * @param int $errno エラーレベル(例: E_WARNING, E_USER_WARNINGなど) 11 * @param string $errstr エラーメッセージ 12 * @param string $errfile エラーが発生したファイル名 13 * @param int $errline エラーが発生した行番号 14 * @throws ErrorException 発生したエラー情報をErrorExcetpionとしてスローします。 15 * @return bool エラーが処理されたことを示します。 16 */ 17function handlePhpError( 18 int $errno, 19 string $errstr, 20 string $errfile, 21 int $errline 22): bool { 23 // エラーレポートレベルに含まれないエラーや、@演算子で抑制されたエラーは無視する 24 if (!(error_reporting() & $errno)) { 25 return true; 26 } 27 28 // PHPエラーをErrorExceptionとしてスローします。 29 // 第3引数として渡される$errnoがErrorExceptionのseverityプロパティに設定されます。 30 throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 31} 32 33// カスタムエラーハンドラを設定 34// これにより、PHPが警告などを発生させた際に、handlePhpError 関数が呼び出されます。 35set_error_handler('handlePhpError'); 36 37try { 38 echo "--- 意図的に警告を発生させ、その深刻度(severity)を捕捉します ---" . PHP_EOL . PHP_EOL; 39 40 // E_USER_WARNINGタイプの警告を意図的に発生させます。 41 // この警告はカスタムエラーハンドラによって捕捉され、ErrorExceptionとしてスローされます。 42 trigger_error("これはユーザー定義の警告メッセージです。", E_USER_WARNING); 43 44 // 上記のtrigger_error()でErrorExceptionがスローされるため、この行は実行されません。 45 echo "この行は実行されません(警告がErrorExceptionとしてスローされたため)。" . PHP_EOL; 46 47} catch (ErrorException $e) { 48 // trigger_error()によってスローされたErrorExceptionをここで捕捉します。 49 echo "ErrorException が捕捉されました。" . PHP_EOL; 50 echo "メッセージ: " . $e->getMessage() . PHP_EOL; 51 echo "ファイル: " . $e->getFile() . PHP_EOL; 52 echo "行: " . $e->getLine() . PHP_EOL; 53 54 // ErrorExceptionオブジェクトのseverityプロパティにアクセスし、 55 // 捕捉されたエラーの深刻度(整数値)を取得します。 56 echo "深刻度 (severity): " . $e->severity . PHP_EOL; 57 58 // 比較のために、今回発生させたE_USER_WARNINGの定数値を表示します。 59 // E_USER_WARNINGの定数値は通常「8」です。 60 echo "E_USER_WARNING の定数値: " . E_USER_WARNING . PHP_EOL; 61 62 // プロパティの値と定数の値が一致することを確認します。 63 if ($e->severity === E_USER_WARNING) { 64 echo "-> 捕捉された深刻度は E_USER_WARNING と一致します。" . PHP_EOL; 65 } 66 67} finally { 68 // スクリプトの他の部分に影響を与えないよう、 69 // 設定したカスタムエラーハンドラを元の状態に戻します。 70 restore_error_handler(); 71 echo PHP_EOL . "--- エラーハンドラの処理が完了しました ---" . PHP_EOL; 72}
このサンプルコードは、PHPのErrorExceptionクラスが持つseverityプロパティの使用方法を示しています。severityプロパティは、発生したエラーの深刻度を整数値で示し、PHPの標準エラーレベル定数(E_WARNINGなど)に対応します。戻り値はint型です。
コードでは、set_error_handler()関数を使い、PHPの標準的な警告や通知などのエラーをErrorExceptionとして捕捉するためのカスタムエラーハンドラhandlePhpErrorを設定しています。これにより、エラー発生時にhandlePhpErrorが呼び出され、エラー情報がErrorExceptionに変換されてスローされます。この際、元のエラーの深刻度がErrorExceptionのseverityプロパティに格納されます。
tryブロック内でtrigger_error()によって意図的に警告(E_USER_WARNING)を発生させると、カスタムハンドラがこれをErrorExceptionとして捕捉し、スローします。
catchブロックでは、このErrorExceptionを捕捉し、$e->severityにアクセスすることで、そのエラーがどの程度の深刻さだったか(例えば警告レベル)を正確な整数値で取得して表示しています。これにより、エラーの深刻度に応じてプログラム内で処理を分岐させることが可能になります。処理後はrestore_error_handler()でカスタムハンドラの登録を解除しています。
このサンプルコードは、PHPの標準的な警告や通知などをErrorExceptionとして捕捉し、try-catch構文で例外的に処理する方法を示しています。ErrorException::severityプロパティは、捕捉されたエラーの元々の深刻度を示すPHPの定数(例: E_WARNING)の整数値が格納されます。カスタムエラーハンドラを設定した場合は、必ずrestore_error_handler()で元のハンドラに戻すようにしてください。これを忘れると、後続のコードやライブラリの動作に予期せぬ影響を与える可能性があります。また、error_reporting()の設定によって、どのエラーがカスタムハンドラに渡されるかが制御される点も理解しておきましょう。
PHP ErrorException severity 取得
1<?php 2 3/** 4 * ErrorException::getSeverity() のデモンストレーションを行います。 5 * PHPの警告や通知などのエラーをキャッチ可能な例外 (ErrorException) に変換し、 6 * その元のエラーの重要度 (Severity) を取得する方法を示します。 7 */ 8function demonstrateErrorExceptionSeverity(): void 9{ 10 echo "--- ErrorException::getSeverity() のデモンストレーション ---\n\n"; 11 12 // PHPのエラーをErrorExceptionに変換するためのカスタムエラーハンドラを設定します。 13 // 元々のエラーハンドラを保存し、処理の終わりに復元します。 14 $originalErrorHandler = set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline) { 15 // error_reportingの設定により、無視されるべきエラーは変換しません。 16 if (!(error_reporting() & $errno)) { 17 return false; // PHPのデフォルトエラー処理に任せる 18 } 19 // PHPエラーをErrorExceptionとしてスローします。 20 throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 21 }); 22 23 try { 24 echo "未定義の変数にアクセスし、E_NOTICEを発生させます...\n"; 25 // 未定義の変数にアクセスすることで E_NOTICE エラーを発生させます。 26 // このエラーは、上記で設定したエラーハンドラによってErrorExceptionに変換されます。 27 echo $undefinedVariable; // ここで E_NOTICE が発生 28 29 } catch (ErrorException $e) { 30 echo "\nErrorException をキャッチしました!\n"; 31 echo "メッセージ: " . $e->getMessage() . "\n"; 32 33 // キャッチしたErrorExceptionから、元のPHPエラーの重要度を取得します。 34 $severity = $e->getSeverity(); 35 echo "Severity (数値): " . $severity . "\n"; 36 37 // 数値の重要度を、対応するPHPの定数名にマッピングして表示します。 38 // PHP 8 の `match` 式を使用しています。 39 $severityName = match ($severity) { 40 E_ERROR => 'E_ERROR', 41 E_WARNING => 'E_WARNING', 42 E_PARSE => 'E_PARSE', 43 E_NOTICE => 'E_NOTICE', 44 E_CORE_ERROR => 'E_CORE_ERROR', 45 E_CORE_WARNING => 'E_CORE_WARNING', 46 E_COMPILE_ERROR => 'E_COMPILE_ERROR', 47 E_COMPILE_WARNING => 'E_COMPILE_WARNING', 48 E_USER_ERROR => 'E_USER_ERROR', 49 E_USER_WARNING => 'E_USER_WARNING', 50 E_USER_NOTICE => 'E_USER_NOTICE', 51 E_STRICT => 'E_STRICT', 52 E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR', 53 E_DEPRECATED => 'E_DEPRECATED', 54 E_USER_DEPRECATED => 'E_USER_DEPRECATED', 55 default => 'UNKNOWN_SEVERITY', 56 }; 57 echo "Severity (定数名): " . $severityName . "\n"; 58 59 } finally { 60 // 設定したエラーハンドラを解除し、元のハンドラを復元します。 61 // これは、このデモンストレーションが他のコードに影響を与えないようにするために重要です。 62 restore_error_handler(); 63 echo "\n元のエラーハンドラが復元されました。\n"; 64 } 65 66 echo "\n--- デモンストレーション終了 ---\n"; 67} 68 69// 関数を実行してデモンストレーションを開始 70demonstrateErrorExceptionSeverity(); 71
ErrorException::getSeverity()は、PHPの標準的なエラー(警告や通知など、通常は例外として扱われないもの)がErrorExceptionという例外オブジェクトに変換された際に、その元のエラーがどの程度の重要度を持っていたかを示す数値を取得するためのメソッドです。
このメソッドには引数がなく、戻り値としてint型の数値が返されます。この数値は、E_NOTICEやE_WARNINGといったPHPのエラー定数に対応しています。
提供されたサンプルコードでは、まずカスタムエラーハンドラを設定し、PHPで発生するエラーをErrorExceptionとして捕捉できるようにしています。例えば、未定義の変数にアクセスすると通常はE_NOTICEという通知エラーが発生しますが、このカスタムハンドラによってErrorExceptionに変換されます。
try-catchブロック内でこのErrorExceptionをキャッチした後、$e->getSeverity()を呼び出すことで、発生したエラーの重要度(この場合はE_NOTICEに対応する数値)を取得しています。取得した数値は、PHP 8のmatch式を利用して対応するエラー定数名(例: "E_NOTICE")として表示され、エラーの種類を分かりやすく識別できるようになります。
このように、getSeverity()メソッドは、PHPのエラーを例外として一元的に処理する際に、元のエラーの種類や重要度に応じて適切な対応を取るために役立ちます。
このサンプルコードは、PHPの警告や通知などのエラーをErrorExceptionに変換し、try-catchで捕捉する方法を示しています。重要な注意点は、set_error_handlerでカスタムエラーハンドラを設定したら、必ずfinallyブロックでrestore_error_handlerを使って元のハンドラに戻すことです。これを忘れると、プログラム全体の他のエラー処理に影響を与え、予期せぬ動作を引き起こす可能性があります。また、カスタムエラーハンドラ内でerror_reporting()をチェックし、現在の設定で無視されるべきエラーをErrorExceptionに変換しないように工夫されています。ErrorException::getSeverity()メソッドは、元のPHPエラーの重要度を数値で返すため、その数値を使ってエラーの種類に応じた処理を行うことが可能です。