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

29

PHP支持在双引号字符串中进行变量插值,例如:

$s = "foo $bar";

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

例如:

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

这样行吗?似乎不可能的,对吧?


2
是的,这是不可能的。你可以通过尝试来得到你的答案。 - Ibu
你是指 插值 还是 解释 - hakre
2
插值是这里正确的词。 - michasaurus
3个回答

28

正如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
另外,让我们希望这个通过:https://wiki.php.net/rfc/arbitrary_expression_interpolation - aross

6

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

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

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

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

只有在真正没有其他选择时才使用此选项。

5
如果该函数位于一个类中,你可以在字符串内部引用它,例如:$s = "foo {$this->bar()}"; - nawfal
@nawfal和{}是必需的。否则,PHP将寻找bar属性。 - Fahmi

0

11
好的,但实际上这并没有回答问题;-) - Blackbam
不是,但它确实提供了解决基本问题的正确方法,即构造一个由文字部分和表达式组成的字符串。 - michasaurus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接