PHP はエラー制御演算子(@
)をサポートしています。
PHP の式の前に付けた場合、
その式により生成されたエラーメッセージは無視されます。
set_error_handler() で自作のエラーハンドラを設定した場合は エラー制御演算子があってもそのエラーハンドラがコールされます。
PHP 8.0.0 より前のバージョンでは、
エラー制御演算子(@
)でエラーが無視されている場合、
カスタムのエラーハンドラでコールされた
error_reporting() が常に 0
を返していました。
PHP 8.0.0 以降では、
E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE
を返すようになっています。
式によって生成されたあらゆるエラーメッセージは
error_get_last() 関数が返す配列要素
"message"
から取得できます。
この関数の結果はエラーごとに変わります。よって速やかに確認する必要があります。
<?php
/* 意図的なエラー */
$my_file = @file ('non_existent_file') or
die ("Failed opening file: error was '" . error_get_last()['message'] . "'");
// この演算子は関数だけでなく、全ての式で動作します。
$value = @$cache[$key];
// インデックス $key が存在しない場合でも、警告を発生しません。
?>
注意:
@
演算子は、 式 に対してのみ動作します。基本的なルールは次のようになります。 値を得ることができるものの場合、@
演算子を前に付けることが可能です。 例えば、変数、関数、いくつかの言語構造(例: include) のコールなどの前に、この演算子をつけることが可能です。 関数またはクラスの定義、if
や foreach 等のような 条件構造の前には、この演算子を付けることはできません。
PHP 8.0.0 より前のバージョンでは、
スクリプトの実行を停止させるような致命的な場合であっても
@
演算子でエラーメッセージを抑止することが可能でした。
たとえば、存在しなかったり、ミスタイプされていたり、
利用できない関数コールの前に @
演算子を付けると、
原因を示すことなく、その場所でスクリプトは終了してしまっていました。