remove - ¿Cuál es el uso del símbolo @ en PHP?
strip_tags php ejemplo (11)
Al igual que algunas respuestas anteriores: el operador @
suprime todos los errores en PHP, incluidos avisos, advertencias e incluso errores críticos.
PERO: Por favor, realmente no use el operador @
en absoluto.
¿Por qué?
Bueno, porque cuando usa el operador @
para la supresión de errores, no tiene idea de dónde comenzar cuando ocurre un error. Ya me divertí un poco con el código heredado donde algunos desarrolladores usaban el operador @
con bastante frecuencia. Especialmente en casos como operaciones de archivos, llamadas de red, etc. Todos estos son casos en los que muchos desarrolladores recomiendan el uso del operador @
, ya que a veces esto está fuera de alcance cuando se produce un error aquí (por ejemplo, una API de terceros puede ser inaccesible, etc.) .).
¿Pero de qué sirve todavía no usarlo? Echemos un vistazo desde dos perspectivas:
Como desarrollador: cuando se usa @
, no tengo la menor idea de por dónde empezar. Si hay cientos o incluso miles de llamadas a funciones con @
el error podría ser como todos. No es posible una depuración razonable en este caso. E incluso si es solo un error de la tercera parte, entonces está bien y ya está listo. ;-) Además, es mejor agregar suficientes detalles al registro de errores, de modo que los desarrolladores puedan decidir fácilmente si una entrada de registro es algo que debe verificarse más o si es solo una falla de la tercera parte que está fuera del alcance del desarrollador.
Como usuario: a los usuarios no les importa en absoluto cuál es el motivo de un error o no. El software está ahí para que trabajen, para terminar una tarea específica, etc. No les importa si es culpa del desarrollador o un problema de la tercera parte. Especialmente para los usuarios, recomiendo encarecidamente registrar todos los errores, incluso si están fuera de alcance. Tal vez te darás cuenta de que una API específica está desconectada con frecuencia. ¿Qué puedes hacer? Puede hablar con su socio API y si no pueden mantenerlo estable, probablemente debería buscar otro socio.
En resumen: debe saber que existe algo como @
(el conocimiento siempre es bueno), pero simplemente no lo use . Muchos desarrolladores (especialmente aquellos que están depurando el código de otros) estarán muy agradecidos.
He visto usos de @
delante de ciertas funciones, como las siguientes:
$fileHandle = @fopen($fileName, $writeAttributes);
¿Para qué sirve este símbolo?
El símbolo @
es el operador de control de errores (también conocido como operador de "silencio" o "apagado"). Hace que PHP suprima cualquier mensaje de error (aviso, advertencia, fatal, etc.) generado por la expresión asociada. Funciona igual que un operador unario, por ejemplo, tiene precedencia y asociatividad. A continuación se presentan algunos ejemplos:
@echo 1 / 0;
// generates "Parse error: syntax error, unexpected T_ECHO" since
// echo is not an expression
echo @(1 / 0);
// suppressed "Warning: Division by zero"
@$i / 0;
// suppressed "Notice: Undefined variable: i"
// displayed "Warning: Division by zero"
@($i / 0);
// suppressed "Notice: Undefined variable: i"
// suppressed "Warning: Division by zero"
$c = @$_POST["a"] + @$_POST["b"];
// suppressed "Notice: Undefined index: a"
// suppressed "Notice: Undefined index: b"
$c = @foobar();
echo "Script was not terminated";
// suppressed "Fatal error: Call to undefined function foobar()"
// however, PHP did not "ignore" the error and terminated the
// script because the error was "fatal"
¿Qué sucede exactamente si utiliza un controlador de errores personalizado en lugar del controlador de errores estándar de PHP?
Si ha configurado una función de controlador de errores personalizado con set_error_handler (), entonces se seguirá llamando, pero este controlador de errores personalizado puede (y debería) llamar a error_reporting () que devolverá 0 cuando la llamada que activó el error fue precedida por una @ .
Esto se ilustra en el siguiente ejemplo de código:
function bad_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
echo "[bad_error_handler]: $errstr";
return true;
}
set_error_handler("bad_error_handler");
echo @(1 / 0);
// prints "[bad_error_handler]: Division by zero"
El controlador de errores no verificó si el símbolo @
estaba en efecto. El manual sugiere lo siguiente:
function better_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
if(error_reporting() !== 0) {
echo "[better_error_handler]: $errstr";
}
// take appropriate action
return true;
}
PHP es compatible con un operador de control de errores: el signo at (@)
. Cuando se añade a una expresión en PHP, cualquier mensaje de error que pueda generar esa expresión será ignorado.
Si ha configurado una función de controlador de errores personalizado con set_error_handler()
entonces se seguirá llamando, pero este controlador de errores personalizado puede (y debería) llamar a error_reporting()
que devolverá 0
cuando la llamada que activó el error fue precedida por una @
.
<?php
/* Intentional file error */
$my_file = @file (''non_existent_file'') or
die ("Failed opening file: error was ''$php_errormsg''");
// this works for any expression, not just functions:
$value = @$cache[$key];
// will not issue a notice if the index $key doesn''t exist.
?>
Nota:-
1) El operador @ solo funciona con expresiones.
2) Una simple regla de oro es: si puede tomar el valor de algo, puede anteponerle al operador @. Por ejemplo, puede anteponerlo a variables, funcionar e incluir llamadas, constantes, etc. No puede añadirlo a las definiciones de funciones o clases, o estructuras condicionales como if y foreach, etc.
Advertencia:-
Actualmente, el prefijo del operador de control de errores "@" incluso deshabilitará el informe de errores para los errores críticos que terminarán la ejecución del script. Entre otras cosas, esto significa que si usa "@" para suprimir los errores de una función determinada y no está disponible o se ha escrito de forma incorrecta, el script morirá allí mismo sin ninguna indicación de por qué.
Puede que valga la pena agregar que aquí hay algunos consejos al usar la @ que debe tener en cuenta, para obtener un resumen completo de esta publicación: http://mstd.eu/index.php/2016/06/30/php-rapid-fire-what-is-the-symbol-used-for-in-php/
El controlador de errores aún se dispara incluso con el símbolo @ prefijado, solo significa que se establece un nivel de error de 0, esto tendrá que ser manejado adecuadamente en un controlador de errores personalizado.
La anticipación de una inclusión con @ establecerá todos los errores en el archivo de inclusión a un nivel de error de 0
Si la apertura falla, se genera un error de nivel E_WARNING. Puede usar @ para suprimir esta advertencia.
Supongamos que no hemos utilizado el operador "@", nuestro código se vería así:
$fileHandle = fopen($fileName, $writeAttributes);
¿Y si no se encuentra el archivo que estamos intentando abrir? Se mostrará un mensaje de error.
Para suprimir el mensaje de error, estamos utilizando el operador "@" como:
$fileHandle = @fopen($fileName, $writeAttributes);
Suprime los errores.
Ver Operadores de Control de Errores en el manual:
PHP es compatible con un operador de control de errores: el signo at (@). Cuando se añade a una expresión en PHP, cualquier mensaje de error que pueda generar esa expresión será ignorado.
Si ha configurado una función de controlador de errores personalizado con set_error_handler() entonces se seguirá llamando, pero este controlador de errores personalizado puede (y debería) llamar a error_reporting() que devolverá 0 cuando la llamada que activó el error fue precedida por una @ ...
Suprime los mensajes de error: consulte Operadores de control de errores en el manual de PHP.
También tenga en cuenta que a pesar de que se ocultan los errores, ¡se seguirá ejecutando cualquier controlador de errores personalizado (establecido con set_error_handler
)!
@
suprime el mensaje de error generado por la función. fopen
lanza un error cuando el archivo no se cierra. @
símbolo @
hace que la ejecución se mueva a la línea siguiente, incluso si el archivo no existe. Mi sugerencia sería no utilizar esto en su entorno local cuando desarrolle un código PHP.
@
suprime los mensajes de error.
Se utiliza en fragmentos de código como:
@file_get_contents(''http://www.exaple.com'');
Si el dominio " http://www.exaple.com " no es accesible, se mostrará un error, pero con @
no se muestra nada.