eval()
La función eval() en PHP evalúa una cadena como código PHP en tiempo de ejecución. Aprende su sintaxis, casos de uso, riesgos de seguridad y alternativas más seguras.
Introducción a la función eval()
La función eval() evalúa una string como código PHP y lo ejecuta en tiempo de ejecución — en el momento en que el script llega a la llamada eval(). En lugar de escribir código que el parser de PHP compila de antemano, le pasas a eval() una string que se compila y ejecuta sobre la marcha.
Esto convierte a eval() en uno de los constructos más poderosos — y más peligrosos — del lenguaje. Esta página cubre su sintaxis, qué devuelve, los escasos casos en los que resulta genuinamente útil, los riesgos de seguridad que lo convierten en último recurso, y las alternativas más seguras a las que deberías recurrir primero.
eval()es un constructo del lenguaje, no una función regular. No puedes llamarlo indirectamente mediante el nombre de una función variable ni pasarlo a funciones de callback.
Sintaxis
eval(string $code): mixedEl único argumento es una string de código PHP. Hay algunas reglas importantes:
- No incluyas la etiqueta de apertura
<?php. La string ya se trata como fuente PHP, por lo que añadir<?phpte devolvería al "modo HTML". - El código debe ser sintácticamente válido y estar terminado. Un punto y coma faltante o una llave sin cerrar produce un error de análisis. Desde PHP 7, un error de análisis dentro de
eval()lanza una excepciónParseErrorque puedes capturar — las versiones anteriores devolvíanfalse.
Valor de retorno
La forma en que eval() devuelve un valor depende de lo que hace el código evaluado:
- Si el código ejecuta una sentencia
return,eval()devuelve ese valor. - De lo contrario, devuelve
null.
<?php
$result = eval('return 2 + 3;');
echo $result; // 5Por eso un return dentro de eval() termina la string evaluada, no todo tu script — el control vuelve a la línea después de eval(). Consulta la sentencia return para ver cómo se comporta return en funciones regulares.
Ejemplo básico
Aquí está el uso más sencillo posible — construir una string de código y ejecutarla:
La variable $code contiene PHP válido que imprime Hello, world!. eval() compila y ejecuta esa string en tiempo de ejecución, por lo que se muestra el mensaje. Observa que no hay etiqueta <?php dentro de la string.
Captura de errores de forma segura
Dado que el código inválido lanza un ParseError, envuelve el código no confiable o generado en un bloque try/catch para que una string incorrecta no bloquee toda la solicitud:
<?php
try {
eval('echo "missing semicolon"'); // no terminating ;
} catch (ParseError $e) {
echo "Could not evaluate: " . $e->getMessage();
}Esto imprime un mensaje "Could not evaluate" en lugar de un error fatal, permitiendo que tu script continúe.
¿Cuándo usaría eval()?
En PHP moderno, casi nunca — y esa es la respuesta honesta. Los casos de uso legítimos y acotados incluyen:
- Motores de plantillas/expresiones que compilan un mini-lenguaje personalizado en PHP (Twig y Blade hacen algo conceptualmente similar, pero con un sandboxing intenso).
- Caché de configuración compilada como PHP que se evalúa después con
eval, aunque escribir un archivo.phpreal y usarincludees más rápido y seguro. - Herramientas educativas o de depuración como REPLs donde la entrada es completamente confiable.
Si el valor que necesitas calcular es un dato (números, JSON, una lista de opciones), casi con certeza no necesitas eval().
Riesgos de seguridad
eval() ejecuta cualquier cosa que se le pase. Si cualquier parte de la string puede estar influenciada por la entrada del usuario, un atacante puede ejecutar código arbitrario — leer archivos, eliminar datos o tomar el control del servidor. Esta es una vulnerabilidad clásica de ejecución remota de código (RCE).
<?php
// NEVER do this:
$expr = $_GET['expr']; // attacker-controlled
eval("\$answer = $expr;"); // attacker can inject any PHPUna solicitud como ?expr=1; system('rm -rf /') ejecutaría el comando inyectado. Trata cada eval() sobre entrada de usuario como un exploit garantizado.
Alternativas más seguras
Antes de recurrir a eval(), comprueba si alguna de estas opciones cubre tu necesidad:
| Objetivo | Usa en lugar de eval() |
|---|---|
| Analizar datos estructurados | json_decode() |
| Llamar a una función elegida en tiempo de ejecución | Callback / funciones variables |
| Ejecutar código almacenado en un archivo | include / require |
| Mapear una string a un comportamiento | Un match/switch o un array de closures |
| Evaluar expresiones matemáticas | Una librería dedicada al análisis de expresiones |
Conclusión
eval() evalúa una string como código PHP en tiempo de ejecución, devolviendo el resultado de una sentencia return dentro de ella o null en caso contrario. Es genuinamente poderoso, pero también es una fuente principal de vulnerabilidades de seguridad — cualquier entrada controlada por el usuario que se le pase constituye un bug de ejecución remota de código. Úsalo solo cuando la entrada sea completamente confiable y ningún constructo integrado sea adecuado, envuélvelo en un bloque try/catch para ParseError, y prefiere las alternativas más seguras mencionadas anteriormente siempre que sea posible.