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

2022-08-30 17:13:25

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

$s = "foo $bar";

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

例如

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

类似的东西?这似乎是不可能的,对吧?


答案 1

使用字符串到函数名称调用技术是绝对可能的,正如Overv的答案所指示的那样。在许多琐碎的替换情况下,它的读取效果远远优于替代语法,例如

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

你需要一个变量,因为解析器期望 $ 在那里。

这就是身份转换作为语法黑客工作得很好的地方。只需声明一个标识函数,并将名称分配给作用域中的变量:

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

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

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

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

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


答案 2

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

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

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

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

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


推荐