13
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-05-26

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;
13
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?