PHP 8.5.0 Alpha 1 available for testing

eval

(PHP 4, PHP 5, PHP 7, PHP 8)

evalEjecuta una cadena como un script PHP

Descripción

eval(string $code): mixed

Evalúa el code proporcionado como código PHP.

El código en evaluación hereda el ámbito de las variables de la línea en la que se realiza la llamada a eval(). Todas las variables disponibles en esa línea serán accesibles en lectura y modificación en el código evaluado. Sin embargo, todas las funciones y clases definidas se definirán en el espacio de nombres global. En otras palabras, el compilador considera el código evaluado como si se tratara de un archivo incluido separado.

Precaución

La construcción de lenguaje eval() es muy peligrosa ya que permite la ejecución de código PHP arbitrario. Su uso se desaconseja encarecidamente. Si se ha verificado cuidadosamente que no hay otras opciones que utilizarla, se debe prestar una atención especial a no pasar datos provenientes de un usuario sin haberlos validado previamente de manera minuciosa.

Parámetros

code

Código PHP válido a evaluar.

El código no debe estar rodeado de etiquetas PHP de apertura y cierre, es decir, 'echo "Hi!";' debe ser pasado en lugar de '<?php echo "Hi!"; >'. Siempre es posible salir y volver al modo PHP utilizando las etiquetas PHP apropiadas, es decir, 'echo "En modo PHP !"; ?>En modo HTML !<?php echo "Retorno al modo PHP !";'.

Además de esto, el código PHP pasado debe ser válido. Esto incluye que todas las instrucciones deben terminar con un punto y coma. 'echo "Hi!"' por ejemplo resultará en un error fatal, mientras que 'echo "Hi!";' funcionará.

Una instrucción return terminará inmediatamente la evaluación del código.

El código se ejecutará en el ámbito del código que llama a la función eval(). Por lo tanto, todas las variables definidas o modificadas en la llamada a la función eval() seguirán siendo visibles después de la finalización de la ejecución de la función.

Valores devueltos

eval() devuelve null a menos que return sea llamado en el código evaluado, en cuyo caso el valor pasado a return es devuelto. A partir de PHP 7, si hay un error de sintaxis en el código evaluado, eval() lanza una excepción ParseError. Antes de PHP 7, en este caso eval() devuelve false y la ejecución del código siguiente continúa normalmente. No es posible capturar el error de análisis de la función eval() utilizando la función set_error_handler().

Ejemplos

Ejemplo #1 Ejemplo con eval() - concatenación de texto

<?php
$string
= 'taza';
$name = 'café';
$str = 'Esto es un $string con mi $name dentro.<br />';
echo
$str;
eval(
"\$str = \"$str\";" );
echo
$str;
?>

El resultado del ejemplo sería:

Esto es un $string con mi $name dentro.
Esto es una taza con mi café dentro.

Notas

Nota: Puesto que esto es una construcción del lenguaje y no una función, no puede ser llamada usando funciones variables.

Sugerencia

Como con todo lo que genera un resultado directamente en el navegador, se pueden utilizar las funciones de control de salida para capturar el resultado de esta función y guardarlo, por ejemplo, en un string.

Nota:

En caso de un error fatal en el código evaluado, todo el script se terminará.

Ver también

  • call_user_func() - Llama a una función de retorno proporcionada por el primer argumento

add a note

User Contributed Notes 8 notes

up
479
Anonymous
20 years ago
Kepp the following Quote in mind:

If eval() is the answer, you're almost certainly asking the
wrong question. -- Rasmus Lerdorf, BDFL of PHP
up
43
lord dot dracon at gmail dot com
9 years ago
Inception with eval()

<pre>
Inception Start:
<?php
eval("echo 'Inception lvl 1...\n'; eval('echo \"Inception lvl 2...\n\"; eval(\"echo \'Inception lvl 3...\n\'; eval(\'echo \\\"Limbo!\\\";\');\");');");
?>
up
21
Jeremie LEGRAND
8 years ago
At least in PHP 7.1+, eval() terminates the script if the evaluated code generate a fatal error. For example:
<?php
@eval('$content = (100 - );');
?>

(Even if it is in the man, I'm note sure it acted like this in 5.6, but whatever)
To catch it, I had to do:
<?php
try {
eval(
'$content = (100 - );');
} catch (
Throwable $t) {
$content = null;
}
?>

This is the only way I found to catch the error and hide the fact there was one.
up
28
bohwaz
13 years ago
If you want to allow math input and make sure that the input is proper mathematics and not some hacking code, you can try this:

<?php

$test
= '2+3*pi';

// Remove whitespaces
$test = preg_replace('/\s+/', '', $test);

$number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
$functions = '(?:sinh?|cosh?|tanh?|abs|acosh?|asinh?|atanh?|exp|log10|deg2rad|rad2deg|sqrt|ceil|floor|round)'; // Allowed PHP functions
$operators = '[+\/*\^%-]'; // Allowed math operators
$regexp = '/^(('.$number.'|'.$functions.'\s*\((?1)+\)|\((?1)+\))(?:'.$operators.'(?2))?)+$/'; // Final regexp, heavily using recursive patterns

if (preg_match($regexp, $q))
{
$test = preg_replace('!pi|π!', 'pi()', $test); // Replace pi with pi function
eval('$result = '.$test.';');
}
else
{
$result = false;
}

?>

I can't guarantee you absolutely that this will block every possible malicious code nor that it will block malformed code, but that's better than the matheval function below which will allow malformed code like '2+2+' which will throw an error.
up
8
catgirl at charuru dot moe
7 years ago
It should be noted that imported namespaces are not available in eval.
up
7
darkhogg (foo) gmail (bar) com
15 years ago
The following code

<?php
eval( '?> foo <?php' );
?>

does not throw any error, but prints the opening tag.
Adding a space after the open tag fixes it:

<?php
eval( '?> foo <?php ' );
?>
up
4
divinity76 at gmail dot com
8 years ago
imo, this is a better eval replacement:

<?php
function betterEval($code) {
$tmp = tmpfile ();
$tmpf = stream_get_meta_data ( $tmp );
$tmpf = $tmpf ['uri'];
fwrite ( $tmp, $code );
$ret = include ($tmpf);
fclose ( $tmp );
return
$ret;
}
?>

- why? betterEval follows normal php opening and closing tag conventions, there's no need to strip `<?php?>` from the source. and it always throws a ParseError if there was a parse error, instead of returning false (note: this was fixed for normal eval() in php 7.0). - and there's also something about exception backtraces
up
1
online dot cloudmeetings dot marco at gmail dot com
11 days ago
Pls note that 'eval' is not a function but a 'language construct', hence it CANNOT be disablled using 'disable_functions', either in php.ini or in a phpfpm pool etc.
To Top