2011-01-11 12 views
22

¿Qué hace el símbolo '@' en el siguiente código?¿Qué hace el prefijo '@' en PHP?

@mkdir(ROOT. "cache/"); 
+3

El manual de PHP es en realidad muy fácil de buscar ... [php.net/@](http://php.net/@);) – netcoder

+12

Claro. Intenta buscar en el sitio PHP "@" o "@ prefix", te lleva un largo camino. NO. –

+3

"[Este operador es conocido cariñosamente por los bupers veteranos como el operador de stfu.] (Http://php.net/manual/en/language.operators.errorcontrol.php#112900)" ;-) –

Respuesta

36

It suppresses errors from displaying:

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 la característica track_errors está habilitada, cualquier mensaje de error generado por la expresión se guardará en la variable $ php_errormsg. Esta variable se sobrescribirá en cada error, por lo tanto, verifique con anticipación si desea usarla.

Como se señala en los comentarios, tampoco puedo imaginar un motivo para utilizar realmente esta funcionalidad: escribir un código que se relacione adecuadamente con los estados/condiciones de error.

+11

También agregaría: "Casi no hay ningún caso cuando el uso de @ está justificado" – zerkms

+0

@zerkms: de hecho, estoy de acuerdo. Entonces agregado. –

+1

Me gusta referirme a él como el mal puro. – GWW

8

Como se señaló, es el operador de supresión de errores.

Pero lo que no se ha señalado, es que es una práctica muy mala de usar, los errores no deben fallar en silencio.

Compruebe la existencia de devoluciones de errores y utilice los bloques try/catch donde se usan excepciones.

En el ejemplo específico ...

@mkdir(ROOT. "cache/"); 

... No tiene en cuenta los errores de mkdir(). El docs dice que vuelve FALSE en caso de fallo, por lo que debería estar haciendo ...

if (! mkdir(ROOT. "cache/")) { 
    // Handle error. 
} 
3

gente parece olvidar que PHP era una lengua sucia rápida para hacer las cosas, sólo recientemente se trató de ser maduro y sofisticado .

La supresión de errores es una forma rápida y sucia de hacer que las funciones se comporten como usted las necesita, porque en el desarrollo web no puede predecir qué se lanzará sobre usted y ¡a veces no vale la pena preocuparse!

Un ejemplo clásico es la útil función getimagesize, que le permite obtener información sobre una imagen que alguien ha subido. Esta función tira un tambaleante si el archivo de imagen no es un archivo de imagen estándar. No es realmente la función de los desarrolladores inspeccionar un archivo, determinar si se puede cargar en getimagesize. Puede haber formas elegantes de hacerlo, ¡pero en serio, no me importa!

a hacer esto:

if(!($a = @getimagesize( $_FILE['file']['tmp_name']))) 
{ 
    unlink($_FILE['file']['tmp_name']); 

    //politely tell user that you rejected their image! 
} 

sí, se puede utilizar tratar de atrapar declaraciones que son más elegantes, pero al final, usted ha cogido el error y suprimido el mensaje de error, que es lo que quería sin desgastar la tecla de tabulación!

Contrariamente a lo que dicen las respuestas anteriores, el prefijo @ utilizado con cuidado no da como resultado un accidente de tren fuera de control. Solo permite al desarrollador acomodar los errores de la manera que prefiera.

+0

Con los avisos de PHP activados, creo que @ supresor se vuelve muy útil, es decir: if (@ $ _ POST ['submit'] == 'send') {} –