2009-06-23 19 views
469

he visto usos de @ frente a determinadas funciones, como las siguientes:¿Cuál es el uso del símbolo @ en PHP?

$fileHandle = @fopen($fileName, $writeAttributes); 

¿Cuál es el uso de este símbolo?

+3

Tanto RichieHindle y Aiden campana dio la respuesta correcta, pero ya que sólo se puede establecer una respuesta como aceptada, Elegiré el primero. Lo siento Aiden –

+1

La supresión de errores (aunque agradable) podría causar errores en el camino al mantener la base de código ... http://stackoverflow.com/a/7116175/282343 – dennismonsewicz

Respuesta

531

Suprime los mensajes de error - consulte Error Control Operators en el manual de PHP.

+31

¡Fue un sorteo rápido! –

+4

Sí; ¡hasta el segundo! Tuve que verificar el ID de la respuesta para ver quién entró primero :) – Sampson

+6

@Aiden: Ambos muertos en el polvo. 8-) – RichieHindle

383

Suprime los errores.

Ver Error Control Operators en el manual:

PHP soporta un operador de control de errores: la 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 ha establecido una función de controlador de error personalizado con set_error_handler() entonces será todavía llamará, pero esto manipulador personalizado puede (y debe) llamar error_reporting() que devolverá 0 cuando la llamada que provocó el error fue precedido por una @ ...

+126

upvoted sólo porque la otra respuesta está recibiendo todo el amor. – ajacian81

+5

@ ajacian81 - ¡Salud! –

+7

19 detrás ... vamos gente vamos a vencer a RichieHindle: P –

52

También tenga en cuenta que, a pesar de los errores que se ocultan, ¡se seguirá ejecutando cualquier controlador de error personalizado (establecido con set_error_handler)!

180

El símbolo @ es error control operator (también conocido como el operador "silenciar" o "silenciar"). 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é ocurre exactamente si se utiliza un controlador de errores personalizado en lugar del controlador de errores estándar de PHP:

Si ha establecido una función de controlador de error personalizado con set_error_handler() luego seguirá recibiendo llamadas, pero este controlador de errores personalizado puede (y debe) llamar a error_reporting() que dará devolver 0 cuando la llamada que activó el error fue precedida por un @.

Esto se ilustra en el ejemplo de código siguiente:

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" 

manejador El error no comprobó si @ símbolo era 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; 
} 
+28

La respuesta más detallada e informativa aquí. – rvighne

+3

Muy informativo. – Mark

+0

Vamos a enviar esto a la parte superior:/mejor respuesta detallada. – rafamds

5

Si falla la apertura, se genera un error del nivel E_WARNING. Puede usar @ para suprimir esta advertencia.

5

Supongamos que no han utilizado el operador "@", entonces nuestro código sería el siguiente:

$fileHandle = fopen($fileName, $writeAttributes); 

¿Y si el archivo que estamos tratando de abrir no se encuentra? Mostrará un mensaje de error.

para suprimir el mensaje de error que estamos usando el operador "@" como:

$fileHandle = @fopen($fileName, $writeAttributes); 
2

"@" suprime los mensajes de error.

Se utiliza en fragmentos de código como:

@file_get_contents('http://www.exaple.com'); 

Si dominio "http://www.exaple.com" no es accesible, se mostrará un error, pero con '@' nada que no se mostró.

1

PHP admite un operador de control de error: el signo (@). Cuando se antepone a una expresión en PHP, cualquier mensaje de error que pueda ser generado por esa expresión será ignorado.

Si ha establecido una función de controlador de error personalizado con set_error_handler() entonces será todavía llamará, pero esto manipulador personalizado puede (y debe) llamar error_reporting() que devolverá 0 cuando la llamada que provocó el error fue precedida por un @ .

<?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 @ trabaja sólo en expresiones.

2) Una simple regla general es: si puede tomar el valor de algo, puede anteponer el operador @ a él. Por ejemplo, puede anteponerlo a variables, función e incluir llamadas, constantes, etc. No se puede anteponer a definiciones de funciones o clases, o estructuras condicionales como if y foreach, etc.

Advertencia: -

Actualmente, el prefijo del operador de control de errores "@", incluso inhabilitará informe de errores para los errores críticos que terminarán guión ejecución. Entre otras cosas, esto significa que si utiliza "@" en suprime los errores de una función determinada y o bien no está disponible o ha sido mal escrita, la secuencia de comandos morirá allí sin ninguna indicación de por qué.

23

Como ya hemos respondido antes: El operador @ suprime todos los errores en PHP, incluidos avisos, advertencias e incluso errores críticos.

PERO:Por favor, realmente no utilizan el operador @ en absoluto.

¿Por qué?

Bueno, porque cuando utiliza el operador @ para la supresión de error, no tiene ni idea de dónde comenzar cuando se produce un error. Ya tuve algo de "diversión" 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 a veces está fuera del alcance cuando se produce un error aquí (por ejemplo, una API de terceros podría ser inalcanzable, etc.).

Pero, ¿qué sentido tiene todavía no usarlo? Vamos a echar un vistazo desde dos perspectivas:

Como desarrollador: Cuando se utiliza @, 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 everyhwere. No es posible una depuración razonable en este caso. E incluso si solo es un error de terceros, entonces está bien y terminaste rápido. ;-) Además, es mejor agregar suficientes detalles al registro de errores, por lo que los desarrolladores pueden decidir fácilmente si una entrada de registro es algo que debe verificarse más a fondo o si se trata de una falla de terceros que está fuera del alcance del desarrollador.

Como usuario: usuarios no les importa en absoluto lo que la razón de un error o no. El software está ahí para que funcionen, para terminar una tarea específica, etc. No les importa si es culpa del desarrollador o un problema de terceros. Especialmente para los usuarios, recomiendo registrar todos los errores, incluso si están fuera del alcance. Tal vez notará que una API específica está fuera de línea con frecuencia. ¿Qué puedes hacer? Puede hablar con su asociado API y, si no pueden mantenerlo estable, probablemente debería buscar otro socio.

En resumen: Usted debe saber que existe algo así como @ (el conocimiento es siempre bueno), pero sólo no usarlo. Muchos desarrolladores (especialmente aquellos que depuran código de otros) estarán muy agradecidos.

+1

Algunas advertencias solo se pueden suprimir de manera confiable usando @ (por ejemplo, fopen(), donde cualquier intento de predecir el resultado está sujeto a una condición de carrera). Si tiene código para manejar la condición de error de una manera más ordenada, use '@' Lo correcto es que esto sea especialmente útil, especialmente si no devuelve 'text/html' (o similar) al cliente. (tal vez devolviendo 'image/png' o" json ") – Jasen

+0

No debería suprimir las advertencias, están indicando que ha hecho algo mal. No hay una condición de carrera en la que no pueda verificar o manejar correctamente el estado. –

1

Podría valer la pena añadir que aquí hay algunos consejos cuando se usa el @ se debe tener en cuenta, por una carrera completa abajo ver este mensaje: http://mstd.eu/index.php/2016/06/30/php-rapid-fire-what-is-the-symbol-used-for-in-php/

  1. El gestor de errores todavía se dispara incluso con el símbolo @ antepuesto, solo significa que se ha configurado un nivel de error de 0, esto tendrá que manejarse adecuadamente en un controlador de error personalizado.

  2. Anteponer un incluyen con @ para poner todos los errores en el archivo de inclusión a un nivel de error de 0

Cuestiones relacionadas