Operador @ en PHP: qué es y cómo evitar errores comunes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué se esconde detrás del símbolo @ en PHP? Explicación para principiantes

\n\n

Si alguna vez has revisado código PHP de otros o has buscado en Stack Overflow, seguro te has topado con una sintaxis extraña: @file_get_contents() o @mysql_connect(). ¿Qué es esa mágica «arroba» delante de la función? ¿Para qué sirve y por qué los desarrolladores experimentados recomiendan evitarla?

\n\n

En este artículo analizaremos a fondo el operador de supresión de errores en PHP: el símbolo @. Aprenderás cómo funciona, en qué situaciones se puede usar y, sobre todo, cuáles son las mejores alternativas a @ en PHP. ¡Vamos allá!

\n\n

¿Qué hace el operador @ en PHP?

\n\n

En PHP, el símbolo @ es el operador de control de errores (error control operator). Su única función es suprimir la visualización de errores que ocurren al ejecutar una expresión específica.

\n\n

Cuando PHP encuentra un @ antes de una función o expresión, establece temporalmente el nivel de reporte de errores a cero para esa llamada concreta. Cualquier advertencia (warning), notificación (notice) o error fatal no se mostrará al usuario.

\n\n

Ejemplo sencillo

\n\n
<?php\n// Intento de abrir un archivo inexistente\n$file = @file_get_contents('archivo_inexistente.txt');\nif ($file === false) {\n    echo "¡Archivo no encontrado, pero el error está oculto!";\n}\n?>
\n\n

Sin el @, PHP mostraría:

\n\n
Warning: file_get_contents(archivo_inexistente.txt): failed to open stream: No such file or directory
\n\n

Con el @, silencio total. El programa continúa su ejecución y simplemente obtenemos false.

\n\n

¿Cómo funciona el mecanismo de supresión de errores?

\n\n

Internamente, el operador @ cambia el valor de error_reporting a 0 para la expresión actual. Una vez ejecutada, el nivel se restaura a su valor original.

\n\n

Es importante entender que el error sigue ocurriendo. Simplemente no se muestra. Más aún, si se trata de un error fatal (por ejemplo, llamar a una función inexistente), el script igualmente terminará, pero sin ningún mensaje de error, y te quedarás preguntándote qué salió mal.

\n\n
<?php\n// Error fatal: @ no salva esto\n@funcion_inexistente(); // Llamada a una función que no existe\necho "Este código no se ejecutará";\n?>
\n\n

Resultado: pantalla en blanco (white screen of death). Sin información para depurar.

\n\n

¿Dónde se encuentra más a menudo el @?

\n\n

El símbolo @ se usa frecuentemente en código antiguo y proyectos heredados (legacy). Los escenarios típicos son:

\n\n
    \n
  • Trabajo con archivos — @fopen(), @unlink()
  • \n
  • Conexión a bases de datos — @mysql_connect() (función obsoleta)
  • \n
  • Peticiones HTTP — @file_get_contents($url)
  • \n
  • Manejo de sesiones — @session_start()
  • \n
\n\n

Los principiantes suelen usar @ como un «parche» para no tener que investigar las verdaderas causas de los errores. Esto es una mala práctica, y te explicamos por qué.

\n\n

¿Por qué @ es malo? 3 razones principales

\n\n

1. Pierdes el control sobre los errores

\n

Al suprimir un error, te privas de la oportunidad de corregirlo. En lugar de entender por qué una función devolvió false, simplemente ignoras el problema. Con el tiempo, estos errores «silenciosos» se acumulan y provocan fallos inesperados.

\n\n

2. Dificultad para depurar

\n

Imagina que tu script muestra una página en blanco. Revisas todos los lugares posibles, pero no hay mensajes de error. La causa es que @ ocultó un error fatal. Pasarás horas buscando ese lugar exacto donde está la «arroba».

\n\n

3. Rendimiento

\n

El operador @ ralentiza la ejecución del código. PHP tiene que cambiar los modos de reporte de errores y además manejar

Blogs

Book Recommendations