W3docs

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): mixed

El ú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 <?php te 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ón ParseError que puedes capturar — las versiones anteriores devolvían false.

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; // 5

Por 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:

php— editable, runs on the server

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 .php real y usar include es 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 PHP

Una 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:

ObjetivoUsa en lugar de eval()
Analizar datos estructuradosjson_decode()
Llamar a una función elegida en tiempo de ejecuciónCallback / funciones variables
Ejecutar código almacenado en un archivoinclude / require
Mapear una string a un comportamientoUn match/switch o un array de closures
Evaluar expresiones matemáticasUna 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.

Práctica

Práctica
¿Cuál es el propósito de la función eval() en PHP?
¿Cuál es el propósito de la función eval() en PHP?
Was this page helpful?