PHP8では、ログ出力を抑制するエラー制御演算子で、最高レベルのエラーは抑制されません。@をつけても出力されます。
これまで致命的なエラーのログを出力させなかったところからするといい修正。
それでも個人的にはこの機能は使うべきでないと思っています。
PHP8でログ出力がどう変わるのか、サンプルコードを実行して見てみましょう。まずは、PHP7.4で実行します。
サンプルコード
<?php
trigger_error('1', E_USER_DEPRECATED);
@trigger_error('2', E_USER_DEPRECATED);
trigger_error('1', E_USER_NOTICE);
@trigger_error('2', E_USER_NOTICE);
trigger_error('1', E_USER_WARNING);
@trigger_error('2', E_USER_WARNING);
@trigger_error('1', E_USER_ERROR);
PHP7の実行結果
php error-control-operator-trigger-error.php
PHP Deprecated: 1 in /home/.../error-control-operator-trigger-error.php on line 3
PHP Notice: 1 in /home/.../error-control-operator-trigger-error.php on line 6
PHP Warning: 1 in /home/.../error-control-operator-trigger-error.php on line 9
まったく同じコードをPHP8.0で実行します。
PHP8の実行結果
php80 error-control-operator-trigger-error.php
PHP Deprecated: 1 in /home/.../error-control-operator-trigger-error.php on line 3
PHP Notice: 1 in /home/.../error-control-operator-trigger-error.php on line 6
PHP Warning: 1 in /home/.../error-control-operator-trigger-error.php on line 9
PHP Fatal error: 1 in /home/.../error-control-operator-trigger-error.php on line 12
PHP7では致命的な Fatal error が出ているのにログ抑制ができます。もちろん処理は途中で異常終了しています。
これが問題でした。PHP8では、エラー演算子の@をつけても Fatal error は出力されます。
当然の修正ですね?
ちなみに、オブジェクト指向のエラー例外はPHP7のころから出力されてたので変更はありません。
もうひとつ言えば、PHPもオブジェクト指向でプログラミングするのが主流になっています。エラーは例外でスローするのが常識なので、Fatal error を trigger_error() を使うことはありません。
絶対に使わないとは言いませんが稀な方法になっています。