Cadena de interpolación de PHP para salida de función

2 minutos de lectura

avatar de usuario
Ryan

Soporte PHP interpolación de variables en cadenas entre comillas dobles, por ejemplo,

$s = "foo $bar";

Pero, ¿es posible interpolar los resultados de la llamada de función en la cadena entre comillas dobles?

Por ejemplo,

$s = "foo {bar()}";

¿Algo como eso? No parece imposible, ¿verdad?

  • si no es posible Puede obtener su respuesta simplemente intentando

    – Ibú

    25 de mayo de 2012 a las 17:03

  • Querías decir interpolando o interpretando?

    – hakré

    31 de mayo de 2012 a las 13:09

  • Interpolar es la palabra correcta aquí.

    – michasaurio

    8 de enero de 2020 a las 2:05

avatar de usuario
jerseyboy

Es absolutamente posible usar la técnica de llamada de cadena a nombre de función como indica la respuesta de Overv. En muchos casos de sustitución triviales, se lee mucho mejor que las sintaxis alternativas como

"<input value="<?php echo 1 + 1 + foo() / bar(); ?>" />"

Necesita una variable, porque el analizador espera que $ esté allí.

Aquí es donde la transformación de identidad funciona bien como truco sintáctico. Simplemente declare una función de identidad y asigne el nombre a una variable en el alcance:

function identity($arg){return $arg;}
$interpolate = "identity";

Luego puede pasar cualquier expresión PHP válida como argumento de la función:

"<input value="{$interpolate(1 + 1 + foo() / bar() )}" />"

La ventaja es que puede eliminar una lote de variables locales triviales y eco declaraciones.

La desventaja es que la variable $interpolate queda fuera del alcance, por lo que tendría que declararla global repetidamente dentro de funciones y métodos.

avatar de usuario
Overv

La función de comillas dobles en PHP no evalúa el código PHP, simplemente reemplaza las variables con sus valores. Si desea evaluar el código PHP dinámicamente (muy peligroso), debe usar eval:

eval( "function foo() { bar() }" );

O si solo quieres crear una función:

$foo = create_function( "", "bar()" );
$foo();

Solo use esto si realmente no hay otra opción.

  • Si la función estaba dentro de una clase, puede referirse a ella dentro de una cadena, por ejemplo: $s = "foo {$this->bar()}";

    – nawfal

    9 de noviembre de 2015 a las 10:53

  • @nawfal y el {} son requeridos. De lo contrario, php buscará bar propiedad.

    – Fahmi

    26 de agosto de 2020 a las 15:35

avatar de usuario
Manju

A menos que la interpolación sea absolutamente necesaria (comente y hágame saber por qué), concatene la salida de la función con la cadena.

$s =  "foo " . bar();

Fuente: 1.8. Interpolación de funciones y expresiones dentro de cadenas

  • Ok, pero en realidad esto no responde la pregunta 😉

    – Blackbam

    2 de febrero de 2017 a las 22:06

  • No, pero da la solución correcta al problema subyacente, que es construir una cadena que consta de partes literales y expresiones.

    – michasaurio

    8 de enero de 2020 a las 2:05

¿Ha sido útil esta solución?