PHP поддерживает один оператор контроля ошибок: знак at ( @). При добавлении к выражению в 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
/* Intentional file error */
$my_file = @file ('non_existent_file') or
    die ("Failed opening file: error was '" . error_get_last()['message'] . "'");

// this works for any expression, not just functions:
$value = @$cache[$key];
// will not issue a notice if the index $key doesn't exist.

?>

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

Предупреждение

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