PHP soporta un operador de control de errores: el signo de arroba (@). Cuando se antepone a una expresión en PHP, cualquier mensaje de error que pueda ser generado por esa expresión será ignorado.
Si se ha establecido una función controladora de errores personalizada con set_error_handler(), esta todavía se seguirá llamando aunque se haya suprimido el diagnóstico.
Antes de PHP 8.0.0, la llamada a error_reporting() dentro del manejador de errores personalizado
siempre devolvía 0
, si el error era suprimido por el operador @
.
Desde PHP 8.0.0, devuelve el valor de esta expresión (bit a bit):
E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE
.
Cualquier mensaje de error generado por la expresión está disponible en el elemento "message"
del array devuelto por error_get_last().
El resultado de dicha función cambiará con cara error, por lo que necesita se comprobado lo antes posible.
<?php
/* Error intencionado en file */
$my_file = @file ('non_existent_file') or
die ("Error al abrir el archivo: se produjo un error '" . error_get_last()['message'] . "'");
// Esto funciona para cualquier expresión, no solo funciones:
value = @$cache[$key];
// No emitirá ningún aviso si el índice $key no existe.
?>
Nota: El operador
@
trabaja sólo sobre expresiones. Una simple regla de oro es: si se puede tomar el valor de algo, entonces se le puede anteponer el operador@
. Por ejemplo, puede anteponerse a variables, a llamadas a funciones, a llamadas a ciertas constructores del lenguaje (p.ej. includes) y así sucesivamente. No puede anteponerse a definiciones de función o clase, ni a estructuras condicionales comoif
y foreach, y así sucesivamente.
Antes de PHP 8.0.0, era posible mediante el operador @
deshabilitar errores críticos los cuales terminan la ejecución del script.
Por ejemplo, anteponiendo @
a una llamada a una función
la cual no existe, al no estar disponible o estar mal escrito, el script
terminaría sin ninguna indicación de por qué.