Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@lvn-shigaki

【PHP8】エラー制御演算子の動作に変更が入っている話

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;
0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What is going on with this article?