¿Qué hace el prefijo ‘@’ en PHP?

¿Qué hace el símbolo ‘@’ en el siguiente código?

@mkdir(ROOT. "cache/"); 

    Suprime los errores de visualización :

    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 ser generado por esa expresión será ignorado.

    Si la función 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 una razón para usar realmente esta funcionalidad: escriba un código que trate de manera apropiada los estados / condiciones de error.

    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 deberían fallar silenciosamente.

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

    En el ejemplo específico …

     @mkdir(ROOT. "cache/"); 

    … ignora cualquier error de mkdir() . Los documentos dicen que devuelve FALSE en caso de error, por lo que deberías estar haciendo …

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

    La gente parece olvidar que PHP era un lenguaje rápido y sucio para hacer las cosas, solo recientemente ha intentado ser maduro y sofisticado.

    La supresión de errores es una forma rápida y sucia de hacer que las funciones se comporten de la manera que usted las necesita, porque en el desarrollo web no puede predecir qué le lanzarán, ¡y algunas 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!

    solo haz esto:

     if( !($a = @getimagesize( $_FILE['file']['tmp_name'] ))) { unlink( $_FILE['file']['tmp_name'] ); //politely tell user that you rejected their image! } 

    sí, podría usar declaraciones try y catch que son más elegantes, pero al final, ha captado el error y ha suprimido el mensaje de error, que es lo que quería sin usar la tecla de tabulación.

    Al contrario de 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.