2012-05-25 6 views
10

Obsługa interpolacji podpory PHP w ciągach podwójnie cytowanych, np.Łańcuch interpolujący PHP dla funkcji wyjściowej

$s = "foo $bar"; 

Ale czy to możliwe, aby interpolować wyniki wywołania funkcji w podwójnym cudzysłowie?

np.

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

Coś w tym stylu? Wydaje się niemożliwe, prawda?

+2

tak nie jest to możliwe. Możesz uzyskać odpowiedź po prostu próbując – Ibu

+0

Czy chodziło Ci o * interpolację * lub * tłumaczenie *? – hakre

Odpowiedz

2

Funkcja podwójnego cytowania w PHP nie ocenia kodu PHP, po prostu zastępuje zmienne ich wartościami. Jeśli chcesz faktycznie ocenić kod PHP dynamicznie (bardzo niebezpieczny), należy użyć eval:

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

Lub jeśli po prostu chcesz utworzyć funkcję:

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

tego używać, jeśli nie ma to nie ma innej opcji.

+1

Jeśli funkcja znajdowała się wewnątrz klasy, możesz odesłać ją wewnątrz napisu, np .: '$ s =" foo {$ this-> bar()} ";' – nawfal

14

Jest to absolutnie możliwe przy użyciu techniki wywołania ciągu znaków do nazwy funkcji, jak wskazuje odpowiedź Overv. W wielu przypadkach trywialne podmiany to brzmi o wiele lepiej niż alternatywnych składni takich jak

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

Potrzebny jest zmienna, ponieważ parser oczekuje $ tam być. To tutaj transformacja tożsamości działa dobrze jako syntaktyczny hack. Wystarczy zadeklarować funkcję tożsamości i przypisać nazwę do zmiennej w zakresie:

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

Następnie można przekazać dowolne poprawne wyrażenie PHP jako argument funkcji:

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

Plusem jest to, że można wyeliminować wiele trywialnych zmiennych lokalnych i instrukcji echo.

Wadą jest to, że zmienna $ interpolate wypada poza zakres, więc musiałbyś wielokrotnie deklarować ją jako globalną wewnątrz funkcji i metod.

Powiązane problemy