He visto usos de @
ciertas funciones, como las siguientes:
$fileHandle = @fopen($fileName, $writeAttributes);
¿Para qué sirve este símbolo?
php
operators
error-suppression
sv_in
fuente
fuente
Respuestas:
Suprime los mensajes de error; consulte Operadores de control de errores en el manual de PHP.
fuente
isset()
innecesario el uso de 's para evitarundefined offset
errores.Suprime errores.
Ver Operadores de control de errores en el manual:
fuente
El
@
símbolo es el operador de control de errores (también conocido como el operador "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 prioridad y asociatividad. A continuación hay algunos ejemplos:Qué sucede exactamente si usa un controlador de errores personalizado en lugar del controlador de errores estándar de PHP:
Esto se ilustra en el siguiente ejemplo de código:
El controlador de errores no verificó si el
@
símbolo estaba vigente. El manual sugiere lo siguiente:fuente
También tenga en cuenta que a pesar de que los errores están ocultos, ¡cualquier controlador de errores personalizado (configurado con
set_error_handler
) aún se ejecutará!fuente
Como ya algunos respondieron antes: 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 se produce 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. Esos son todos los casos en que muchos desarrolladores recomiendan el uso del@
operador, ya que esto a veces está fuera de alcance cuando ocurre un error aquí (por ejemplo, una API de terceros podría ser inalcanzable, etc. )¿Pero cuál es el punto de no usarlo? Echemos un vistazo desde dos perspectivas:
Como desarrollador: cuando
@
se usa, no tengo ni idea de por dónde empezar. Si hay cientos o incluso miles de llamadas a funciones con@
el error, podría ser como todo el mundo. No es posible una depuración razonable en este caso. E incluso si es solo un error de un tercero, entonces está bien y has terminado rápido. ;-) Además, es mejor agregar suficientes detalles al registro de errores, para que los desarrolladores puedan decidir fácilmente si una entrada de registro es algo que debe verificarse más a fondo o si es solo una falla de terceros 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 finalizar una tarea específica, etc. No les importa si es culpa del desarrollador o un problema de un tercero. Especialmente para los usuarios, recomiendo registrar todos los errores, incluso si están fuera de alcance. Tal vez notará que una API específica está fuera de línea 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 depuran el código de otros) estarán muy agradecidos.fuente
@
es lo correcto. hacer, esto es especialmente útil, especialmente si no está volviendotext/html
(o similar) al cliente. (tal vez regresandoimage/png
o "json")if( session_status() == PHP_SESSION_NONE ) session_start();
Es una aplicación heredada que heredé, y hay lugares donde el script de configuración se llama varias veces, por lo que tengo que probarlo. ¿Qué problema, si lo hay, habría en simplemente usar@session_start();
?@$this->stats['device_os'][$date][$creative_id][$device_id][$operating_system]['clicks']++;
es mucho mejor que la alternativa de tener controles de activos en cada nivel y completarlo cuando no lo es.Supongamos que no hemos usado el operador "@", entonces nuestro código se vería así:
¿Y si no se encuentra el archivo que estamos intentando abrir? Mostrará un mensaje de error.
Para suprimir el mensaje de error, estamos utilizando el operador "@" como:
fuente
@
solución en primer lugar. Otros lenguajes de programación tienen un manejo uniforme de excepciones para lidiar con este tipo de escenario stackoverflow.com/questions/1087365Si falla la apertura, se genera un error de nivel E_WARNING. Puede usar @ para suprimir esta advertencia.
fuente
@
suprime los mensajes de error.Se usa en fragmentos de código como:
Si el dominio " http://www.exaple.com " no es accesible, se mostrará un error, pero
@
no se mostrará nada.fuente
PHP admite un operador de control de errores: el signo at
(@)
. Cuando se antepone 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 personalizada,
set_error_handler()
entonces todavía se llamará, pero este controlador de errores personalizado puede (y debería) llamar,error_reporting()
lo que regresará0
cuando la llamada que activó el error fue precedida por un@
.Nota:-
1) El @ -operator solo funciona en expresiones.
2) Una regla general simple es: si puede tomar el valor de algo, puede anteponerle el operador @. Por ejemplo, puede anteponerlo a variables, funciones e incluir llamadas, constantes, etc. No puede anteponerlo a definiciones de funciones o clases, o estructuras condicionales como if y foreach, etc.
Advertencia:-
fuente
Puede valer la pena agregar aquí que hay algunos consejos al usar la @ que debe tener en cuenta, para ver 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 todavía se activa incluso con el símbolo @ antepuesto, solo significa que se establece un nivel de error de 0, esto tendrá que manejarse adecuadamente en un controlador de errores personalizado.
Anteponer una inclusión con @ establecerá todos los errores en el archivo de inclusión a un nivel de error de 0
fuente
@
suprime el mensaje de error lanzado por la función.fopen
arroja un error cuando el archivo no sale.@
El símbolo hace que la ejecución se mueva a la siguiente línea, incluso si el archivo no existe. Mi sugerencia sería no usar esto en su entorno local cuando desarrolle un código PHP.fuente