ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP8, エラー制御演算子(@)でErrorは関係なく出力される

イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

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() を使うことはありません。

絶対に使わないとは言いませんが稀な方法になっています。

前の投稿
PHP8, アトリビュート(属性)とは何か?インターフェイスともちょっとちがう。
PHP8, create_function()の廃止。無名関数を使おう!
次の投稿

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください