《PHP8上級試験対策》自作エラーハンドラを使ってエラーをキャッチする:set_error_handler()の動作を理解しよう

  • URLをコピーしました!

はじめに

PHPでは、独自のエラーハンドラを定義して、システム標準のエラー処理を自分でコントロールすることができます。
この記事では、set_error_handler() 関数の動作と、PHP8での変更点(特に $errcontext の削除)を中心にわかりやすく解説します。

キーワード: set_error_handler / エラーハンドラ / カスタムエラー処理 / PHP8変更点 / $errcontext削除

目次

🧩 set_error_handler() の基本

PHPの標準エラー処理は、通常「Warning」や「Notice」が出るだけでスクリプトは続行します。
しかし、開発中にそれらをログに残したり、独自フォーマットで表示したい場合は
set_error_handler() で自作ハンドラを登録できます。

set_error_handler(?callable $callback, int $error_levels = E_ALL): ?callable

この $callback には、次のようなシグネチャを持つ関数(またはクロージャ)を渡します。

handler(
    int $errno,
    string $errstr,
    string $errfile,
    int $errline
): bool

💡 $errcontext 引数は PHP7.2で非推奨PHP8.0で削除 されました。
PHP8では指定すると逆に "Too few arguments" エラーが出るため注意!

⚙️ 実例:未定義変数アクセス時の挙動

以下のコードでは $arr を定義せずに $arr[0] にアクセスしてみます。
エラーを set_error_handler() で捕まえてみましょう。

<?php
declare(strict_types=1);
error_reporting(-1);

set_error_handler(function(int $errno, string $errstr, string $errfile, int $errline): bool {
    echo __FUNCTION__, "\n";
    var_dump($errno, $errstr, $errfile, $errline);
    return true;
});

$arr[0];

🧠 実行結果

{closure}
int(2)
string(23) "Undefined variable $arr"
string(27) "/var/www/html/part2/p91.php"
int(11)
{closure}
int(2)
string(51) "Trying to access array offset on value of type null"
string(27) "/var/www/html/part2/p91.php"
int(11)

🔍 何が起こっているのか?

  • $arr が未定義 → E_NOTICE:「Undefined variable $arr」
  • その $arr を配列アクセス → E_WARNING:「Trying to access array offset on value of type null」
  • 両方のエラーが カスタムハンドラ によって捕捉・出力されている

つまり、set_error_handler()が正しく動作しているということです。

📘 PHP8でのポイント整理

項目内容
$errcontextPHP8で削除。指定するとエラー。
返り値true を返すと「PHP標準のエラーハンドラを無効化」できる。
$errnoエラー種別(E_NOTICE, E_WARNINGなど)。
$errstrエラーメッセージ文字列。
$errfile / $errline発生箇所の情報。

🧭 処理の流れをASCIIアートで視覚化!

┌──────────────┐
│ PHPスクリプト │
└──────┬──────┘
       │
       ▼
┌────────────────────┐
│ set_error_handler 登録 │
└────────────────────┘
       │
       ▼
┌─────────────┐
│ エラー発生    │
│ (Undefined…)│
└──────┬──────┘
       │
       ▼
┌────────────────────┐
│ カスタムハンドラ起動  │
│ errno, errstrなど受取 │
└────────────────────┘
       │
       ▼
┌──────────────┐
│ 独自処理を実行 │
│ (ログ出力など)│
└──────────────┘

🧾 まとめ

set_error_handler() で自作ハンドラを登録できる
✅ PHP8では $errcontext は完全削除
✅ 返り値 true で標準エラーハンドラの出力を抑制できる
✅ 未定義変数アクセスなどもキャッチ可能

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次