2011-03-31 13 views
5

He estado yendo a través del código de un plugin para Wordpress y encontró lo siguiente:¿Cuándo (si alguna vez lo haría) haría esto en PHP?

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

Tengo curiosidad por si hay alguna situación específica Soy consciente de que esta sería la manera correcta para generar la variable $foo. ¿Es este solo el caso del autor del complemento siendo loco o hay algo que debería saber? Me hubiera utilizado solo echo ...

ACTUALIZACIÓN:

Gracias por todo el gran respuesta. Estoy mirando fijamente ahora que no pensé en el escenario de la plantilla. Específicamente, esto sucede en el complemento WP Super Cache. Creo que tendré que echarle un vistazo más de cerca para ver si es necesario. Pensé que Super Caché almacenaba en caché la salida html de Wordpress después de que todo el PHP ya se había procesado ...

+4

Eso es sólo horroristic. – vbence

+0

Esa línea de código me va a dar pesadillas O.o –

Respuesta

6

En este caso, $foo es una cadena que (presumiblemente) puede contener código PHP alineado. Como tal, para ejecutar este código PHP, la cadena necesita ser eval 'ed.

Dicho esto, el uso de eval es generalmente mal visto, además de en un muy estrecho conjunto de circunstancias, ya que puede conducir a la ejecución de código malicioso. (Es decir .: Si hay alguna posibilidad de que $foo es una cadena proporcionada por el usuario, entonces el uso de eval podría llevar a consecuencias desastrosas.)

Ver las preguntas/respuestas When is eval evil in php? existentes para obtener más información.

+0

Pero no sería código PHP, ¿o sí? Porque también estás 'evaluando esas etiquetas cercanas y abiertas. '$ foo' debería contener HTML o algo así, ¿no? (Pero en una cadena, obviamente.) – sdleihssirhc

+0

@sdleihssirhc: Bingo. Esto se usa con frecuencia para ejecutar código de plantilla que es principalmente PHP o es PHP que necesita alguna variedad de manipulación de nivel de cadena para funcionar. – Charles

+0

@sdleihssirhc Es necesario agregar las etiquetas de inicio y final a menos que la cadena sea * solo * código PHP, en oposición a una cadena que contenga etiquetas PHP incrustadas. –

2

Eso no está generando la variable. $foo muy probablemente contiene una plantilla, con otros <?=$code();?> fragmentos embebidos.

El marcador PHP de cierre y apertura se usa en esta evaluación para cambiar de código en línea, volver al modo HTML. Este eval() más o menos cantidades a:

include("data:,$foo"); // treat $foo string as if it was include script 
+0

Simplemente sucede que el método 'include' requiere' allow_url_include' estar habilitado, mientras que el método eval no. Deprimiendo ... – Charles

+0

Sip. La otra solución sería guardarlo en un archivo temporal. (Pero consideraría * que * incluso peor-peor.) – mario

+0

Eso sería una pérdida de la mente. ¡Adivina cómo funciona Smarty! – Charles

-1

Permítanme repetir una vez más: c.r.a.p

Si eval() es la respuesta, ya casi sin duda haciendo la pregunta equivocada.

Rasmus Lerdorf

+1

-1 ¿Y cómo su "respuesta" ayuda al OP? –

+0

FYI, note que no estoy haciendo esto. Lo encontré en un complemento. – Endophage

+0

Vamos, me gustó 2112 con mi nombre de usuario. El autor del complemento es loco, y Endophage simplemente usa 'echo'. @Endophage, nunca dijiste que lo hicieras, y no deberías. –

Cuestiones relacionadas