用于函数输出的PHP插值字符串

Rya*_*yan 15 php string string-interpolation

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

$s = "foo $bar";
Run Code Online (Sandbox Code Playgroud)

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

例如

$s = "foo {bar()}";
Run Code Online (Sandbox Code Playgroud)

那样的东西?似乎不可能吧?

jer*_*boy 20

绝对可以使用字符串到函数名称调用技术,如Overv的答案所示.在许多琐碎的替换案例中,它的读取远远好于替代语法,例如

"<input value='<?php echo 1 + 1 + foo() / bar(); ?>' />"
Run Code Online (Sandbox Code Playgroud)

你需要一个变量,因为解析器期望$在那里.这就是身份转换作为语法黑客行为的好地方.只需声明一个标识函数,并将名称赋给范围内的变量:

function identity($arg){return $arg;}  
$interpolate="identity";
Run Code Online (Sandbox Code Playgroud)

然后,您可以传递任何有效的PHP表达式作为函数参数:

"<input value='{$interpolate(1 + 1 + foo() / bar() )}' />"
Run Code Online (Sandbox Code Playgroud)

好处是你可以消除很多琐碎的局部变量和echo语句.

缺点是$ interpolate变量超出了范围,因此您必须在函数和方法中重复声明它是全局的.

  • 另外,我们希望这能够成功:https://wiki.php.net/rfc/任意_表达式_插值 (3认同)

Ove*_*erv 6

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

eval( "function foo() { bar() }" );
Run Code Online (Sandbox Code Playgroud)

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

$foo = create_function( "", "bar()" );
$foo();
Run Code Online (Sandbox Code Playgroud)

仅当确实没有其他选择时才使用此选项。

  • 如果该函数位于类内部,那么您可以在字符串内部引用它,例如: `$s = "foo {$this-&gt;bar()}";` (5认同)