为什么在字符串中嵌入函数与变量不同

时间:2011-06-02 20:26:00

标签: php php-parser

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

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

$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";

提前致谢。

2 个答案:

答案 0 :(得分:4)

From the documentation

  

注意:

     

函数,方法调用,静态类   变量和里面的类常量   {$}自PHP 5以来的工作。但是,   访问的值将被解释为   范围中变量的名称   哪个字符串是定义的。运用   单花括号({})不起作用   用于访问的返回值   功能或方法或的价值   类常量或静态类   变量

虽然这是一个黑客攻击:

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

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

答案 1 :(得分:2)

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

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