是否可以在PHP字符串中扩展函数调用?

Is that possible to expand function call in PHP string?

我试着在这样的字符串中调用foo()

1
2
3
4
5
echo"This is a ${foo()} car";

function foo() {
    return"blue";
}

但是,它最终会出现语法错误。

我在这里发现了一些类似的东西,但并不完全是我需要的:

1
echo"This is the value of the var named by the return value of getName(): {${getName()}}";

可以这样做吗?


有可能吗?不。

Functions, method calls, static class variables, and class constants inside {$} work since
PHP 5. However, the value accessed will be interpreted as the name of a variable in the
scope in which the string is defined. Using single curly braces ({}) will not work for
accessing the return values of functions or methods or the values of class constants or
static class variables.

这是http://www.php.net/manual/en/language.types.string.php language.types.string.parsing.complex上关于卷曲语法的第一个注释。


不是那样的,不是…你可以:

1
echo"$(" . foo() .");";


不,据我所知,你只能做到:

1
2
3
4
5
echo"hello".foo();

function foo() {
    return"world";
}

在您的示例中,这将起作用:

1
2
3
4
5
6
7
8
9
10
$name ="captaintokyo";
echo"This is the value of the var named by the return value of getName(): {${getName()}}";

function getName()
{
    return"name";
}

// Output:
// This is the value of the var named by the return value of getName(): captaintokyo


是的,这是可能的。

1
2
3
4
5
6
7
$func = function($param) { return $param; };
function foo($color) { return"$color car"; }

echo"This is a {$func(foo('blue'))}<br/>";

$title = 'blue car';
echo"This is a {$func(str_replace('blue', 'red', $title))}<br/>";

$func()将作为函数调用,括号中的表达式将作为任何其他PHP代码进行计算。这样就可以直接调用字符串中的几乎任何函数。


您给出的示例:

1
2
function foo() {return"hello";}
echo"${foo()}";

这个例子不起作用,因为使用php的{$}格式的函数只允许您以变量名访问结果,然后显示该变量的内容。

在您的示例中,echo语句将尝试回显名为$hello的变量的内容。

要了解它为什么不起作用,我们需要修改示例:

1
2
3
function foo() {return"hello";}
$hello="world";
echo"${foo()}";

此程序将打印world。这似乎就是你在第二个例子中发现的。

如果您希望获得一个程序来打印您的示例中的hello,那么您将无法使用此技术来完成它。然而,好消息是,有很多更简单的方法可以做到这一点。只需返回函数返回值。


$用单引号括起来,这样它就不会是Me文字,并使用串联来附加foo的值

1
2
3
4
5
echo '$' . foo();

function foo() {
    return"hello";
}

印刷品:$hello


你也可以这样做:

echo foo();


$语法类似于shell命令替换,对于php,您可以使用eval,http://php.net/eval

但请注意,Eval是邪恶的…你必须确定你知道你把什么传给埃瓦尔。

这样称呼它:

1
<?php echo eval("foo();");