PHP7からPHP8に移行する際の小ネタになります。
set_error_handlerで定義したエラーハンドラ関数でエラー処理を行うために、
PHP7で以下のようなコード書いてました。
error_reporting(E_ALL);
set_error_handler(function($errno, $errstr, $errfile, $errline) {
// ... 処理
// エラー制御演算子『@』付きの場合
if (error_reporting() === 0) {
// エラーが E_WARNING もしくは E_NOTICE の場合
if ($errno === E_WARNING || $errno === E_NOTICE) {
return;
}
}
// ... 処理
});
PHP7系以下では、エラー制御演算子が使われている場合のerror_reporting()の返り値は常に0なので、上記コードは期待通りの動きをしていました。
そのままPHP8に移行したのですが、移行後にエラー制御演算子の制御が効かなくなっている事に気が付きました。error_reporting()の返り値を確認してみたところ、
『4437』!!!
PHP8でエラー制御演算子の動作の変更が入っていたようです。
というわけで、以下のように書き換えて、めでたしめでたし。
(PHP7でも問題なく動きます、最初からこうしとけばよかった…)
// PHP8ではデフォルトでE_ALLなので書かなくてもいい
error_reporting(E_ALL);
set_error_handler(function($errno, $errstr, $errfile, $errline) {
// ... 処理
if (!(error_reporting() & $errno)) {
return;
}
// ... 処理
});
- エラー制御演算子付きの場合のerror_reporting()の返り値は4437
- 4437 = E_ERROR + E_PARSE + E_CORE_ERROR + E_COMPILE_ERROR + E_USER_ERROR + E_RECOVERABLE_ERROR
- エラー制御演算子なしの場合のerror_reporting()の返り値は22527
- 22527 = 4437 + E_WARNING + E_NOTICE + E_CORE_WARNING + E_CORE_WARNING + E_COMPILE_WARNING + E_USER_WARNING + E_USER_NOTICE + E_USER_DEPRECATED;