【PHP8.x】set_error_handler関数の使い方
set_error_handler関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
set_error_handler関数は、スクリプトでエラーが発生した際に呼び出される、ユーザー定義の関数(エラーハンドラ)を設定する関数です。この関数を利用することで、PHPに組み込まれている標準のエラー処理機能を独自のものに置き換えることが可能になります。エラーハンドラとして指定したコールバック関数は、エラーが発生した際に自動的に呼び出され、その引数としてエラーの重要度を示す整数値、具体的なエラーメッセージ、エラーが発生したファイル名と行番号などの詳細情報を受け取ります。これにより、開発者はエラー情報を画面に表示するだけでなく、ログファイルへの記録、データベースへの保存、管理者へのメール通知、あるいは利用者向けにカスタマイズされたエラーページの表示といった、アプリケーションの要件に応じた柔軟なエラー処理を実装できます。なお、この関数で設定したハンドラはerror_reporting()の設定に従い、報告対象のエラーのみを捕捉します。また、スクリプトの実行を停止させる致命的なエラーは捕捉できない点に注意が必要です。
構文(syntax)
1set_error_handler(?callable $callback, int $error_levels = E_ALL): ?callable
引数(parameters)
?callable $callback, int $error_levels = E_ALL | E_STRICT
- ?callable $callback: エラー発生時に呼び出されるコールバック関数またはメソッドを指定します。NULLを指定すると、以前のエラーハンドラがリセットされます。
- int $error_levels = E_ALL | E_STRICT: 捕捉するエラーの種類を指定するビットマスクです。デフォルトはすべてのエラーとE_STRICTです。
戻り値(return)
callable|null
set_error_handler関数は、以前に設定されていたエラーハンドラ関数を返します。もしエラーハンドラが設定されていなかった場合はNULLを返します。
サンプルコード
PHP set_error_handler でカスタムエラー処理
1<?php 2 3/** 4 * カスタムエラーハンドラを提供するクラス。 5 * PHPのset_error_handler関数で使用するため、エラー処理ロジックをカプセル化します。 6 */ 7class MyErrorHandler 8{ 9 /** 10 * カスタムエラーハンドラとして使用される静的メソッド。 11 * 12 * このメソッドは、PHPの標準エラーハンドラの代わりに呼び出されます。 13 * E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING 14 * といった一部の致命的なエラーはset_error_handlerでは捕捉できません。 15 * 16 * @param int $errno エラーのレベル (例: E_WARNING, E_NOTICE, E_USER_ERROR) 17 * @param string $errstr エラーメッセージ 18 * @param string $errfile エラーが発生したファイル名 19 * @param int $errline エラーが発生した行番号 20 * @return bool エラー処理が完了し、PHPの標準エラーハンドラを実行しない場合は true を返します。 21 */ 22 public static function handleError(int $errno, string $errstr, string $errfile, int $errline): bool 23 { 24 // エラーレベルに基づいて、より分かりやすいタイプ名を設定 25 $type = match ($errno) { 26 E_WARNING => '警告', 27 E_NOTICE => '注意', 28 E_USER_ERROR => 'ユーザー定義エラー', 29 E_USER_WARNING => 'ユーザー定義警告', 30 E_USER_NOTICE => 'ユーザー定義注意', 31 E_RECOVERABLE_ERROR => '回復可能なエラー', 32 E_DEPRECATED, E_USER_DEPRECATED => '非推奨', 33 default => '不明なエラー', 34 }; 35 36 echo "--- カスタムエラー発生 ---\n"; 37 echo "タイプ: {$type} (コード: {$errno})\n"; 38 echo "メッセージ: {$errstr}\n"; 39 echo "ファイル: {$errfile}\n"; 40 echo "行: {$errline}\n"; 41 echo "--------------------------\n\n"; 42 43 // TRUEを返すことで、PHPの標準エラーハンドラが実行されないようにする。 44 // E_USER_ERROR のようなエラーでも、trueを返すとスクリプトは継続されます。 45 return true; 46 } 47} 48 49// カスタムエラーハンドラを登録し、以前のハンドラ(もしあれば)を保存します。 50// [MyErrorHandler::class, 'handleError'] は、MyErrorHandlerクラスの静的メソッド handleError を 51// set_error_handler関数にコールバックとして渡すためのPHPの記法です。 52$oldErrorHandler = set_error_handler([MyErrorHandler::class, 'handleError']); 53 54echo "--- カスタムエラーハンドラが設定されました ---\n\n"; 55 56// 意図的に様々なタイプのエラーを発生させ、カスタムハンドラの動作を確認します。 57 58// 1. ユーザー定義の警告 (E_USER_WARNING) を発生させます。 59echo "1. ユーザー定義の警告 (E_USER_WARNING) を発生させます。\n"; 60trigger_error("これはユーザー定義の警告メッセージです。", E_USER_WARNING); 61 62// 2. 注意 (E_NOTICE) を発生させます。 63// 未定義の変数を参照すると E_NOTICE が発生します。 64echo "\n2. 注意 (E_NOTICE) を発生させます。\n"; 65$undefinedVariable; // この時点ではまだエラーは発生しない 66echo $undefinedVariable ?? '未定義'; // 未定義変数の使用によりE_NOTICEが発生 67 68// 3. ユーザー定義の注意 (E_USER_NOTICE) を発生させます。 69echo "\n3. ユーザー定義の注意 (E_USER_NOTICE) を発生させます。\n"; 70trigger_error("これはユーザー定義の注意メッセージです。", E_USER_NOTICE); 71 72// 4. ユーザー定義のエラー (E_USER_ERROR) を発生させます。 73// 通常、このタイプのエラーが発生するとスクリプトは終了しますが、 74// カスタムハンドラが true を返すことで、スクリプトの実行が継続されます。 75echo "\n4. ユーザー定義のエラー (E_USER_ERROR) を発生させます。\n"; 76trigger_error("これはユーザー定義の致命的なエラーですが、カスタムハンドラが捕捉し、処理を継続します。", E_USER_ERROR); 77 78echo "\n--- エラー発生テストが終了しました ---\n\n"; 79 80// スクリプトの終了前に、エラーハンドラを元の状態に戻します。 81// これは、現在のスクリプト以降のPHPの挙動に影響を与えないために重要です。 82if ($oldErrorHandler !== null) { 83 set_error_handler($oldErrorHandler); 84 echo "--- エラーハンドラが以前の状態に戻されました ---\n"; 85} else { 86 // 以前にカスタムハンドラが設定されていなかった場合は、デフォルトのPHPエラーハンドラに戻します。 87 restore_error_handler(); 88 echo "--- エラーハンドラがデフォルトの状態に戻されました ---\n"; 89} 90 91echo "\nスクリプトは正常に終了しました。\n";
PHPのset_error_handler関数は、通常PHPがエラーを検知した際に実行される標準のエラー処理を、開発者が独自にカスタマイズするための機能です。この関数を利用することで、エラーが発生した際に特定の処理を実行させることができます。
第一引数$callbackには、エラー発生時に呼び出される関数やメソッド(コールバック)を指定します。サンプルコードでは、MyErrorHandlerクラスの静的メソッドhandleErrorをコールバックとして登録しています。このカスタムハンドラには、エラーレベル、エラーメッセージ、エラーが発生したファイル名、行番号が自動的に渡され、これらの情報に基づいてログ記録やユーザーへの表示といった独自の処理を記述できます。カスタムハンドラがtrueを返すと、PHPの標準エラーハンドラは実行されず、スクリプトの処理が継続されます。ただし、E_ERRORなどの一部の致命的なエラーは、set_error_handlerでは捕捉できない点に注意が必要です。
第二引数$error_levelsはオプションで、どの種類のエラーをカスタムハンドラで捕捉するかを指定できます。デフォルトでは全ての種類のエラーが対象となります。set_error_handlerの戻り値は、以前に設定されていたエラーハンドラ(存在する場合)です。これを保存しておくことで、スクリプトの終了時などにrestore_error_handler関数、または保存したコールバックを再度set_error_handlerに渡すことで、エラーハンドラを元の状態に戻すことが可能です。
このサンプルコードでは、MyErrorHandlerクラスでエラー内容を分かりやすく整形して表示するカスタムハンドラを定義し、それをset_error_handlerで登録しています。その後、意図的に複数のエラーを発生させ、カスタムハンドラの動作を確認しています。スクリプトの最後では、設定したカスタムハンドラを解除し、元のPHPのエラー処理に戻しています。
set_error_handlerでは、E_ERRORのような致命的なエラーの一部は捕捉できません。カスタムエラーハンドラは、エラーレベル、メッセージ、ファイル名、行番号を引数として受け取ります。ハンドラがtrueを返すと、PHPの標準エラーハンドラは実行されず、スクリプトの処理が継続されます。これにより、通常スクリプトが停止するようなエラーでも、処理を続けることが可能になりますが、意図しない挙動に繋がらないよう注意が必要です。エラーハンドラの設定は、スクリプトの終了時や不要になった際にrestore_error_handler関数や元のハンドラに戻すことで、他の処理に影響を与えないよう適切に解除することが重要です。本番環境では、エラー内容を直接表示せず、ログに記録するなどのセキュリティ対策も考慮してください。
PHP: set_error_handlerで静的メソッドをエラーハンドラにする
1<?php 2 3/** 4 * カスタムエラーハンドラとして機能するクラス。 5 * set_error_handler() に静的メソッドを登録する例を示します。 6 */ 7class CustomErrorHandler 8{ 9 /** 10 * PHPのエラーが発生した際に呼び出される静的メソッド。 11 * このメソッドがカスタムエラーハンドラとして登録されます。 12 * 13 * @param int $errno エラーの深刻度レベル (例: E_WARNING, E_NOTICE) 14 * @param string $errstr エラーメッセージ 15 * @param string $errfile エラーが発生したファイル名 16 * @param int $errline エラーが発生した行番号 17 * @return bool trueを返すと、PHPの標準エラーハンドラの処理は実行されません。 18 */ 19 public static function handleStaticError(int $errno, string $errstr, string $errfile, int $errline): bool 20 { 21 // エラータイプに応じた説明を設定します。 22 // set_error_handler() で捕捉できないタイプも教育的な目的で含めています。 23 $errorType = match ($errno) { 24 E_ERROR => '致命的な実行時エラー', 25 E_WARNING => '実行時警告', 26 E_PARSE => 'コンパイル時のパースエラー', 27 E_NOTICE => '実行時通知', 28 E_USER_ERROR => 'ユーザー生成の致命的エラー', 29 E_USER_WARNING => 'ユーザー生成の警告', 30 E_USER_NOTICE => 'ユーザー生成の通知', 31 E_STRICT => 'コード互換性に関する通知', 32 E_RECOVERABLE_ERROR => 'キャッチ可能な致命的エラー', 33 E_DEPRECATED => '非推奨機能の使用通知', 34 E_USER_DEPRECATED => 'ユーザー生成の非推奨通知', 35 default => 'その他のエラータイプ', 36 }; 37 38 // エラー情報を出力します(実際のシステムではログファイルに記録するなどします)。 39 echo "--- カスタムエラー捕捉 (静的メソッド) ---\n"; 40 echo " タイプ: {$errorType} ({$errno})\n"; 41 echo " メッセージ: {$errstr}\n"; 42 echo " ファイル: {$errfile}\n"; 43 echo " 行: {$errline}\n"; 44 echo "----------------------------------------\n"; 45 46 // true を返すことで、PHPの標準エラーハンドラが実行されるのを防ぎます。 47 // false を返すと、カスタムハンドラの後に標準ハンドラも実行されます。 48 return true; 49 } 50} 51 52// ---------------------------------------------------- 53// カスタムエラーハンドラの登録と動作確認 54// ---------------------------------------------------- 55 56echo "### カスタムエラーハンドラ登録前のPHP標準エラー (通常は抑制されるか表示されない) ###\n"; 57// @ を付けることで、set_error_handler 登録前の標準エラー出力を抑制できます。 58@$undeclaredVarBeforeHandler; 59 60echo "\n### カスタムエラーハンドラの登録 ###\n"; 61// set_error_handler() を使用して、CustomErrorHandlerクラスの静的メソッドをエラーハンドラとして登録します。 62// 第1引数: コールバックとして ['クラス名', '静的メソッド名'] の形式で指定します。 63// 第2引数: ハンドルするエラーレベル。ここでは E_ALL と E_STRICT を対象とします。 64$oldErrorHandler = set_error_handler([CustomErrorHandler::class, 'handleStaticError'], E_ALL | E_STRICT); 65 66echo "\n--- 意図的なエラー発生 --- \n"; 67 68// 1. E_NOTICE: 未定義の変数にアクセスすると発生します。 69echo "\n--- E_NOTICE のテスト ---\n"; 70echo $undefinedVariable; 71 72// 2. E_WARNING: 存在しないファイルを開こうとすると発生します。 73echo "\n--- E_WARNING のテスト ---\n"; 74fopen('non_existent_file.php', 'r'); 75 76// 3. E_USER_WARNING: 開発者が trigger_error() を使って意図的に発生させる警告です。 77echo "\n--- E_USER_WARNING のテスト ---\n"; 78trigger_error('この関数は将来的に非推奨になります。', E_USER_WARNING); 79 80// 4. E_USER_NOTICE: 開発者が trigger_error() を使って意図的に発生させる通知です。 81echo "\n--- E_USER_NOTICE のテスト ---\n"; 82trigger_error('設定ファイルが見つかりません。デフォルト値を使用します。', E_USER_NOTICE); 83 84// 5. E_USER_ERROR: 開発者が trigger_error() を使って意図的に発生させる致命的エラーです。 85echo "\n--- E_USER_ERROR のテスト ---\n"; 86echo "以下のエラーが発生すると、スクリプトの実行は通常停止します。\n"; 87trigger_error('致命的なエラーが発生しました。処理を中断します。', E_USER_ERROR); 88 89// E_USER_ERROR が発生した場合、この後の行は実行されません。 90echo "\n--- この行は E_USER_ERROR が発生した場合は表示されません ---\n"; 91 92// オプション: 元のエラーハンドラを復元する場合 93// プログラムの後半で標準のPHPエラーハンドラに戻したい場合に利用できます。 94// restore_error_handler(); 95// echo "\n### エラーハンドラ復元後 ###\n"; 96// echo $anotherUndefinedVariable; // ここではPHP標準のエラーが表示されるはずです (もし標準ハンドラが有効なら) 97
set_error_handler関数は、PHPの標準エラー処理を上書きし、独自の関数やメソッドでエラーを処理する機能を提供します。これにより、エラー発生時の動作を柔軟にカスタマイズできます。
第一引数$callbackには、エラー発生時に呼び出す関数やメソッドを指定します。サンプルでは、CustomErrorHandlerクラスの静的メソッドhandleStaticErrorを['CustomErrorHandler', 'handleStaticError']の形式で登録しています。第二引数$error_levelsは、どの種類のエラーをカスタムハンドラで捕捉するかを定義し、E_ALL | E_STRICTはすべてのエラーと厳密な標準に関する通知を対象とします。この関数は以前に設定されていたエラーハンドラを戻り値として返します。
サンプルコードのhandleStaticErrorメソッドは、発生したエラーのタイプ、メッセージ、発生ファイル、行番号を受け取り、それらの情報を画面に出力します。実際のシステムでは、ログ記録などに利用します。カスタムハンドラがtrueを返すとPHP標準のエラーハンドラは実行されず、falseを返した場合は、カスタムハンドラ処理の後に標準ハンドラも実行されます。
コードでは、未定義変数アクセスや存在しないファイル操作によるE_NOTICEやE_WARNING、さらにtrigger_error()関数を用いたE_USER_WARNING、E_USER_NOTICE、E_USER_ERRORといった多様なエラーを意図的に発生させています。E_USER_ERRORのような致命的なエラーをカスタムハンドラで捕捉した場合、通常はスクリプトの実行がその時点で停止します。これらのエラーはすべてカスタムハンドラによって捕捉され、カスタマイズされた方法で処理されます。
set_error_handler()でクラスの静的メソッドを登録する際は、['クラス名', 'メソッド名']の形式で指定します。カスタムハンドラがtrueを返すとPHP標準のエラーハンドラは実行されませんが、falseの場合は実行されるため、エラー処理の流れを制御できます。E_ERRORやE_PARSEなど一部の致命的なエラーは、この関数では捕捉できない場合があるため注意が必要です。trigger_error()でE_USER_ERRORを発生させると、スクリプトの実行は通常そこで停止します。set_error_handler()は以前のハンドラを返すので、restore_error_handler()や返された値を使って元のハンドラに復元することも可能です。本番環境では、エラー情報を画面に出力せず、ログファイルに記録するようにしてください。
PHPカスタムエラーハンドラで例外をキャッチする
1<?php 2 3declare(strict_types=1); 4 5/** 6 * すべてのPHPエラーをErrorExceptionに変換してスローするエラーハンドラ。 7 * 8 * @param int $severity エラーレベル 9 * @param string $message エラーメッセージ 10 * @param string $file エラーが発生したファイル名 11 * @param int $line エラーが発生した行番号 12 * @throws ErrorException 13 */ 14function errorHandler(int $severity, string $message, string $file, int $line): void 15{ 16 // error_reportingが0の場合はエラーを無視する(@演算子など) 17 if (!(error_reporting() & $severity)) { 18 return; 19 } 20 throw new ErrorException($message, 0, $severity, $file, $line); 21} 22 23// すべてのエラーを例外に変換するカスタムエラーハンドラを設定 24set_error_handler('errorHandler'); 25 26try { 27 // 意図的に警告(E_WARNING)を発生させる(ゼロ除算) 28 echo "エラーを発生させます...\n"; 29 $result = 10 / 0; 30 echo "この行は実行されません。\n"; 31} catch (ErrorException $e) { 32 // set_error_handlerによって変換された例外をキャッチ 33 echo "エラーをキャッチしました!\n"; 34 echo "種類: " . $e->getSeverity() . "\n"; 35 echo "メッセージ: " . $e->getMessage() . "\n"; 36 echo "ファイル: " . $e->getFile() . "\n"; 37 echo "行番号: " . $e->getLine() . "\n"; 38} finally { 39 // スクリプトの他の部分に影響を与えないよう、エラーハンドラを元に戻す 40 restore_error_handler(); 41} 42 43echo "処理が正常に継続しました。\n";
PHPのset_error_handler関数は、PHPで発生する通常の実行時エラー(警告や通知など)を、開発者が指定したカスタム関数で処理できるようにする機能です。これにより、PHPの標準的なエラー表示ではなく、独自のログ記録や例外処理を実装することが可能になります。
引数$callbackには、エラー発生時に呼び出される関数を指定します。この関数は、エラーレベル、メッセージ、ファイル名、行番号を引数として受け取ります。nullを指定すると、設定されているカスタムエラーハンドラを解除し、PHPの標準的なエラー処理に戻すことができます。$error_levelsには、どの種類のエラーをハンドラで処理するかをビットマスクで指定します。デフォルトでは、すべてのエラーが対象です。戻り値は、以前設定されていたエラーハンドラ(存在しない場合はnull)です。
このサンプルコードでは、set_error_handler関数を利用して、errorHandler関数をカスタムエラーハンドラとして登録しています。errorHandler関数は、PHPで発生したエラーを受け取り、それをErrorExceptionという例外オブジェクトに変換してスローします。これにより、通常のPHPエラーをtry-catchブロックで捕捉できるようになります。コード内のゼロ除算によって発生する警告(E_WARNING)は、このカスタムハンドラによってErrorExceptionに変換され、catchブロックでメッセージなどが表示されます。最後にrestore_error_handlerを呼び出すことで、カスタムハンドラを解除し、エラー処理を元の状態に戻しています。このようにtry-catchと組み合わせることで、エラー発生時でもスクリプトの実行を制御し、安全に処理を継続できるようになります。
set_error_handlerは、PHPの通常エラーをtry-catchで捕捉可能な例外に変換し、エラー処理を統一できます。カスタムエラーハンドラ設定後は、必ずrestore_error_handler()で元の状態に戻してください。これを怠ると、後続のコードに予期せぬ影響を与えます。finallyブロックを活用すれば、例外発生時でも確実に元のハンドラに戻せます。また、エラーハンドラ関数内ではerror_reporting()を確認し、@演算子で抑制されたエラーを誤って例外にしないよう注意しましょう。
PHPでカスタムエラーハンドラを設定する
1<?php 2 3/** 4 * カスタムエラーハンドラ関数 5 * 6 * PHPがエラーを発生させた際に呼び出されます。 7 * この関数内でエラーのログ記録、ユーザーフレンドリーなメッセージ表示などを行います。 8 * 9 * @param int $errno エラーのレベル(例: E_WARNING, E_NOTICE など) 10 * @param string $errstr エラーメッセージ 11 * @param string|null $errfile エラーが発生したファイル名 12 * @param int|null $errline エラーが発生した行番号 13 * @return bool trueを返すとPHPの標準エラーハンドラが呼ばれなくなります。 14 * falseを返すと、PHPの標準エラーハンドラも実行されます。 15 */ 16function myCustomErrorHandler(int $errno, string $errstr, ?string $errfile, ?int $errline): bool 17{ 18 // エラーの種類を分かりやすい文字列に変換(PHP 8.0+ の match 式を使用) 19 $errorType = match($errno) { 20 E_ERROR => 'E_ERROR', 21 E_WARNING => 'E_WARNING', 22 E_PARSE => 'E_PARSE', 23 E_NOTICE => 'E_NOTICE', 24 E_CORE_ERROR => 'E_CORE_ERROR', 25 E_CORE_WARNING => 'E_CORE_WARNING', 26 E_COMPILE_ERROR => 'E_COMPILE_ERROR', 27 E_COMPILE_WARNING => 'E_COMPILE_WARNING', 28 E_USER_ERROR => 'E_USER_ERROR', 29 E_USER_WARNING => 'E_USER_WARNING', 30 E_USER_NOTICE => 'E_USER_NOTICE', 31 E_STRICT => 'E_STRICT', 32 E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR', 33 E_DEPRECATED => 'E_DEPRECATED', 34 E_USER_DEPRECATED => 'E_USER_DEPRECATED', 35 default => 'Unknown Error Type' 36 }; 37 38 echo "--- カスタムエラー発生 ---" . PHP_EOL; 39 echo "種類: {$errorType} ({$errno})" . PHP_EOL; 40 echo "メッセージ: {$errstr}" . PHP_EOL; 41 echo "ファイル: " . ($errfile ?? 'N/A') . PHP_EOL; // PHP 7.0+ の null 合体演算子 42 echo "行: " . ($errline ?? 'N/A') . PHP_EOL; 43 echo "------------------------" . PHP_EOL . PHP_EOL; 44 45 // true を返すと、このエラーはカスタムハンドラで処理済みとみなされ、 46 // PHPの標準エラーハンドラは実行されません。 47 return true; 48} 49 50// set_error_handler() を使ってカスタムエラーハンドラを登録します。 51// 第一引数にカスタムエラーハンドラの関数名を文字列で渡します。 52// 第二引数は省略すると `E_ALL | E_STRICT` となり、ほとんどのタイプのエラーを捕捉します。 53set_error_handler('myCustomErrorHandler'); 54 55echo "カスタムエラーハンドラが有効になりました。" . PHP_EOL . PHP_EOL; 56 57// --- 以下、エラーを意図的に発生させて、カスタムハンドラの動作を確認します --- 58 59// 1. 存在しないファイルを読み込もうとする(E_WARNINGを発生) 60echo "1. 存在しないファイルを読み込もうとします..." . PHP_EOL; 61// `file_get_contents()` はファイルが存在しない場合、E_WARNING を発生させます。 62file_get_contents('non_existent_file.txt'); 63echo " ファイル読み込み試行後。" . PHP_EOL . PHP_EOL; 64 65// 2. 未定義の変数を使用する(E_WARNINGを発生) 66echo "2. 未定義の変数を使用しようとします..." . PHP_EOL; 67// 未定義の変数を直接使用すると E_WARNING を発生させます。 68echo $undefinedVariable; 69echo " 未定義変数使用試行後。" . PHP_EOL . PHP_EOL; 70 71// 3. trigger_error() を使用してカスタムエラーを発生させる(E_USER_WARNING) 72echo "3. trigger_error() を使ってカスタムユーザー警告を発生させます..." . PHP_EOL; 73// 開発者が意図的にエラーを発生させる際に使用します。 74trigger_error("これは trigger_error() によって発生したカスタム警告です。", E_USER_WARNING); 75echo " カスタムユーザー警告発生後。" . PHP_EOL . PHP_EOL; 76 77// スクリプトの終了時に、可能であれば元のエラーハンドラに戻します。 78// アプリケーションの一部で一時的にエラーハンドラを変更した場合などに重要です。 79restore_error_handler(); 80echo "元のエラーハンドラに戻しました。" . PHP_EOL; 81 82echo "スクリプトが終了しました。" . PHP_EOL; 83 84?>
set_error_handler関数は、PHPがエラーを発生させた際の標準的な処理をカスタマイズするための重要な機能です。この関数を利用することで、エラーのログ記録、ユーザーフレンドリーなメッセージ表示、特定のタイプのエラー無視など、より柔軟なエラー処理が可能になります。
第一引数には、エラーが発生したときに呼び出される関数(コールバック関数)を指定します。このコールバック関数は、エラーの種類、エラーメッセージ、発生ファイル、行番号といった情報を引数として受け取ります。コールバック関数がtrueを返すと、PHPの標準エラーハンドラは実行されず、エラー処理が完了したとみなされます。nullを指定すると、現在設定されているカスタムエラーハンドラを解除し、PHPの標準エラー処理に戻ります。
第二引数では、どの種類のエラーをこのカスタムハンドラで捕捉するかを整数値で指定します。この引数を省略した場合、デフォルトでE_ALL | E_STRICTが適用され、ほとんどのエラータイプが捕捉されます。
戻り値は、set_error_handlerを呼び出す前に設定されていたエラーハンドラを返します。これにより、必要に応じて元のハンドラに戻すことが可能です。
サンプルコードでは、myCustomErrorHandlerという関数を定義し、これをset_error_handlerで登録しています。これにより、存在しないファイルの読み込み失敗や未定義変数の使用といったPHPが通常発生させる警告、あるいはtrigger_error関数で開発者が意図的に発生させたカスタム警告が、このmyCustomErrorHandlerによって捕捉・処理されます。エラーの種類や詳細情報を整形してコンソールに表示し、trueを返すことでPHPの標準エラー表示を抑制しています。スクリプトの最後にはrestore_error_handler関数が呼び出されており、これにより元のエラーハンドラに戻しています。これはアプリケーション全体ではなく、一時的にエラー処理を変更したい場合に特に役立ちます。
set_error_handlerで登録した関数は、PHPが通常出力するエラーメッセージの代わりに呼び出されます。カスタムエラーハンドラ関数の戻り値がtrueの場合、PHPの標準エラーハンドラは実行されませんが、falseの場合は標準ハンドラも引き続き呼び出されますので、挙動の違いに注意してください。
致命的なエラー(例: E_ERRORやE_PARSE)はset_error_handlerでは捕捉できない場合があり、スクリプトの停止を防ぐことはできません。本番環境では、エラー内容を直接画面に表示するのではなく、ログファイルに記録するなどのセキュリティ対策を講じることが重要です。処理後はrestore_error_handler()で元のハンドラに戻すことで、他のコードへの予期せぬ影響を防げます。