3

我以前问过这样的问题,但这个问题不同,这更多是关于解析逻辑。

我之前的问题是关于如何在字符串中嵌入函数(双引号),我收到了这个答案:

$date = "date";
echo "This page is under construction<br/><br/>Current Date: {$date('l jS \of F Y')}";

在那之后,我开始想知道为什么下面的这个不工作而上面的工作正常:

echo "This page is under construction<br/><br/>Current Date: {date('l jS \of F Y')}";

即使变量在字符串内部工作得很好,解析过程背后的逻辑如何。

我读到在 PHP 解析器$签名之后,它会尝试找到合适的变量来解析和运行,并且还使用花括号来分隔变量名{},这也是我相当理解的。

但是为什么在开发函数解析器引擎时似乎需要这种语法,因为起初它对我没有任何意义。

基本上,为什么我需要定义一个变量来保存函数名称的字符串表示,如下所示:

$date = "date";

提前致谢。

4

2 回答 2

4

从文档中

笔记:

{$} 中的函数、方法调用、静态类变量和类常量从 PHP 5 开始工作。但是,访问的值将被解释为定义字符串的范围内的变量的名称。使用单个花括号 ({}) 将无法访问函数或方法的返回值或类常量或静态类变量的值。

不过,这里有一个 hack:

function _expression($x) { return $x; }
$e = '_expression';

echo "This page is under construction<br/><br/>Current Date: {$e(date('l jS \of F Y'))}";
于 2011-06-02T20:54:33.477 回答
2

原因很简单。发生在双引号中的任何复杂解析的语法是{$. 在 PHP 中没有其他字节序列会触发此行为。该语法标记被称为T_CURLY_OPEN.

并且您可以使用函数,这只是PHP 支持对象和数组表达式的副产品

于 2011-06-02T20:36:27.400 回答