エラー制御演算子

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) のコールなどの前に、この演算子をつけることが可能です。 関数またはクラスの定義、 ifforeach 等のような 条件構造の前には、この演算子を付けることはできません。

警告

PHP 8.0.0 より前のバージョンでは、 スクリプトの実行を停止させるような致命的な場合であっても @ 演算子でエラーメッセージを抑止することが可能でした。 たとえば、存在しなかったり、ミスタイプされていたり、 利用できない関数コールの前に @ 演算子を付けると、 原因を示すことなく、その場所でスクリプトは終了してしまっていました。

関連キーワード:  エラー, 制御, 関数, コール, ハンドラ, エラーメッセージ, スクリプト, reporting, バージョン, 警告