2012-05-25 4 views
10

PHP unterstützt variable Interpolation in doppelt zitierten Strings, z.PHP-Interpolationszeichenfolge für die Funktionsausgabe

$s = "foo $bar"; 

Aber ist es möglich, Funktionsaufruf Ergebnisse in der doppelten inverse Zeichenfolge interpolieren?

z.B.

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

So ähnlich? Scheint nicht möglich, oder?

+2

ja, es ist nicht möglich. Sie können Ihre Antwort erhalten, indem Sie einfach versuchen – Ibu

+0

Meinten Sie * interpolieren * oder * interpretieren *? – hakre

Antwort

2

Die Double-Quote-Funktion in PHP bewertet PHP-Code nicht, er ersetzt Variablen einfach durch ihre Werte. Wenn Sie möchten, um tatsächlich PHP-Code dynamisch (sehr gefährlich) zu bewerten, sollten Sie eval verwenden:

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

Oder wenn Sie nur eine Funktion erstellen möchten:

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

diese nur verwenden, wenn wirklich da ist keine andere Möglichkeit.

+1

Wenn die Funktion innerhalb einer Klasse war, dann können Sie sie innerhalb einer Zeichenkette referenzieren, zB: '$ s =" foo {$ this-> bar()} ";' – nawfal

14

Es ist absolut möglich, die Methode zum Aufrufen von String-to-Function-Namen zu verwenden, wie die Antwort von Overv zeigt. In vielen trivialen Substitution Fällen liest es weit besser als die alternative Syntaxen wie

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

Sie eine Variable benötigen, da der Parser die $, dort zu sein erwartet. Hier funktioniert die Identitätstransformation gut als syntaktischer Hack. einfach eine Identitätsfunktion deklarieren und den Namen einer Variablen in Umfang zuweisen:

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

Dann Sie eine gültige PHP-Ausdruck als Funktion Argument übergeben können:

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

Der Vorteil ist, dass man eliminiere eine Menge trivialer lokaler Variablen und Echo-Anweisungen.

Der Nachteil ist, dass die $ interpolate-Variable außerhalb des Gültigkeitsbereichs liegt, also müssten Sie sie innerhalb von Funktionen und Methoden wiederholt global deklarieren.