2012-05-25 69 views
10

PHP支持双引号字符串中的变量插值,例如,功能输出的PHP插值字符串

$s = "foo $bar"; 

但是有可能插入函数调用结果在双引号字符串?

例如

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

这样的事情?似乎不可能的权利?

+2

是的,它是不可能的。您只需尝试 – Ibu

+0

即可得到答案您的意思是*内插*还是*解释*? – hakre

回答

2

PHP中的双引号功能不评估PHP代码,它只是用它们的值替换变量。如果你想实际动态(很危险)评估的PHP代码,你应该使用eval

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

或者,如果你只是想创建一个函数:

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

只使用这个,如果真的有没有其他选择。

+1

如果函数是在一个类中,那么你可以在字符串内引用它,例如:'$ s =“foo {$ this-> bar()}”;' – nawfal

14

Overv的答案指出,使用字符串到函数名称调用技术是绝对有可能的。在许多琐碎的替代情况下,它读取远远大于替代语法如

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

你需要一个变量更好,因为解析器预计$在那里。 这就是身份变换适用于句法破解的地方。 只需要声明的身份功能,以及名称的范围分配给一个变量:

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

那么你可以传递任何有效的PHP表达式作为函数参数:

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

的好处是,你可以消除许多微不足道的本地变量和回声语句。

缺点是$ interpolate变量超出范围,所以你将不得不在函数和方法中重复声明它是全局的。