## エラー制御演算子

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"` から取得できます。 この関数の結果はエラーごとに変わります。よって速やかに確認する必要があります。

例1 意図的なエラー

    <?php
    $my_file = @file ('non_existent_file') or
        die ("Failed opening file: error was '" . error_get_last()['message'] . "'");
    ?>

例2 式でのエラー抑制

    <?php
    // この演算子は関数だけでなく、全ての式で動作します。
    $value = @$cache[$key];
    // インデックス $key が存在しない場合でも、警告を発生しません。
    ?>

> 注意: `@` 演算子は、 式 に対してのみ動作します。基本的なルールは次のようになります。 値を得ることができるものの場合、 `@` 演算子を前に付けることが可能です。 例えば、変数、関数、いくつかの言語構造(例: include) のコールなどの前に、この演算子をつけることが可能です。 関数またはクラスの定義、 `if` や `foreach` 等のような 条件構造の前には、この演算子を付けることはできません。

警告

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

### 参考

- error_reporting()
- エラーハンドリングとロギング関数

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open