lunes, abril 09, 2007

La Función Eval

Bueno, pues no conocía esta función muy bien.. hasta que apareció en el momento que la necesitaba... pero como raro, no sabía que era para lo que queria hacer.

Tengo un pequeño ejemplo de un script en php que recibes 2 números y seleccionas en un combobox una de las operaciones (suma, resta, division, multiplicacion) + - / *.

Pues bien, la estructura de la función la hize asi:


function calcularOperacion($valor1,$valor2,$operador)

claro, donde el detalle mas importante es la variable $operador que representa en este caso si es suma, resta, multiplicacion ó división, para lo cual me interesaba mucho que interpretara el respectivo simbolo del operador (+ ,- ,* ,/ ). Pero desde luego lo intentaba en el cuerpo de la función:

function calcularOperacion($valor1,$valor2,$operador)
{
$resultado=$valor1.$operador.$valor2;
return $resultado;

}


Pero claro, esto no es tan sencillo.... ahí solo concatenaría las variables , si usara la función calcularOperacion(5,4,+); entonces como resultado me retornaría 5+4 y no efectuaría la operación como tal.

Pues bien, busqué, Googlié, y de todo busqué funciones de cadenas , conversión, etc.. sin tener éxito alguno. recurrí a la clásica y cutre solución de usar el switch :S



function calcularOperacion($valor1,$valor2,$operador)
{
switch($operador)
{
case 0:
$resultado = $valor1 + $valor2;
break;

case 1:
$resultado = $valor1 - $valor2;
break;

case 2:
$resultado = $valor1 * $valor2;
break;

case 3:
$resultado = $valor1 / $valor2;
break;


}
return $resultado;
}


Muy cutre.... pero bueno, me funcionaba de acuerdo al requerimiento, obviamente no muy óptima y pues, lógico que mas consumo de recursos, etc...

Bien, dejando unos días como solución este algoritmo, me dió por curiosear y buscar a ver si existía el código de la calculadora en php. Me topé con un codigo hecho con los mismos parametros, 2 números y un operador pero hecho en javascript. Desde luego evalué la lógica y me llamó la atención una función llamada eval();

Aja... nuevamente a Googlear, y pues claro, me da por digitar eval en el editor de php y me la reconocía :O bien... googleando me dí cuenta de que esta función esta en algunos lenguajes, php, javascript, python, y después de leer algunos ejemplos de código hasta en el mismo tutorial oficial de php , logré entenderla.

Bien, según entiendo lo que hace eval($cadena); es evaluar una cadena que le pasas y la evalúa para ver si es código ejecutable, como quien dice para que guardes código fuente en una variable.


y claro claro,,, la función se redujo a una sola línea:

function calcularOperacion($valor1,$valor2,$operador)
{
eval("echo $valor1 $operador $valor2;");
}

llamandola con parámetros:

calcularOperación(4,5,+);


fíjense que el valor de la cadena que se le pasa a eval es : echo $valor1 $operador $valor2;

donde prácticamente es una línea de código normal en php en la cual sus variables tienen un valor asignado, pero aqui si gracias a la función evalúa que esté bien codificado e interpreta la cadena como una linea normal de código. Entonces sí logré hacer lo que en un principio quería :D


Bien, eso ha sido todo.... uff, que mana de carreta

2 comentarios:

Rodrigo Carreño dijo...

Hola gabo,

Existen infinidades de operaciones aritméticas para usar la función eval de php y sirve también para hacer combinaciones de expresiones regulares.

Un grato saludo!!!!

Gabo dijo...

Hola Rodrigo,

si señor, esta función es como me dijo un Maestro: "Eso es la panacea" :p jeje, y pues si, imagínese usted que pueda guardar código php en la base de datos y lo pueda interpretar mediante las consultas y usando eval(); :)

esa es una ventaja de este tipo de lenguajes intérpretes, ya que por ejemplo, Delphi o C# no tienen esta función (hasta donde tengo entendido)

Saludos rodrigo y gracias por visitar este solitario blog :p