はじめに
PHPでは、独自のエラーハンドラを定義して、システム標準のエラー処理を自分でコントロールすることができます。
この記事では、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でのポイント整理
項目 | 内容 |
---|---|
$errcontext | PHP8で削除。指定するとエラー。 |
返り値 | true を返すと「PHP標準のエラーハンドラを無効化」できる。 |
$errno | エラー種別(E_NOTICE, E_WARNINGなど)。 |
$errstr | エラーメッセージ文字列。 |
$errfile / $errline | 発生箇所の情報。 |
🧭 処理の流れをASCIIアートで視覚化!
┌──────────────┐
│ PHPスクリプト │
└──────┬──────┘
│
▼
┌────────────────────┐
│ set_error_handler 登録 │
└────────────────────┘
│
▼
┌─────────────┐
│ エラー発生 │
│ (Undefined…)│
└──────┬──────┘
│
▼
┌────────────────────┐
│ カスタムハンドラ起動 │
│ errno, errstrなど受取 │
└────────────────────┘
│
▼
┌──────────────┐
│ 独自処理を実行 │
│ (ログ出力など)│
└──────────────┘
🧾 まとめ
✅ set_error_handler()
で自作ハンドラを登録できる
✅ PHP8では $errcontext
は完全削除
✅ 返り値 true
で標準エラーハンドラの出力を抑制できる
✅ 未定義変数アクセスなどもキャッチ可能