Оператор управления ошибками

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.

Любое сообщение об ошибке, сгенерированное выражением, доступно в элементе массива с ключом «message», возвращаемого функцией error_get_last(). Результат этой функции будет меняться при каждой ошибке, поэтому его необходимо проверить заранее.

<?php

/* Преднамеренная ошибка при работе с файлами */
$my_file = @file ('non_existent_file') or
die (
"Ошибка при открытии файла: сообщение об ошибке было таким: '" . error_get_last()['message'] . "'");

// работает для любых выражений, а не только для функций
$value = @$cache[$key];
// В случае если ключа $key нет, сообщение об ошибке (notice) не будет отображено

Замечание: Оператор @ работает только с выражениями. Есть простое правило: если что-то возвращает значение, значит, можно указать перед ним оператор @. Например, можно указать оператор @ перед именем переменной, произвольной функцией, вызовом выражения include и т. д. При этом нельзя указывать этот оператор перед определением функции или класса, условными конструкциями, например: if, foreach и т. д.

Внимание

До PHP 8.0.0 оператор @ мог подавлять критические ошибки, которые прерывали выполнение скрипта. Например, добавление оператора @ к вызову несуществующей функции, когда она недоступна или вызвана с опечаткой, приведёт к прерыванию выполнения скрипта без указания причины.