为什么在双引号字符串中使用一个数组符号而不是在使用另一个时抛出解析错误?

Why the parse error is being thrown upon using one array notation inside double-quoted string and and not upon using the other?

考虑以下代码:

<?php
   $arr = array('fruit' => 'apple', 'veggie' => 'carrot');

   define('fruit', 'veggie');

   print "Hello {$arr['fruit']}"; //This works

   print "Hello $arr['fruit']"; //This doesn't work
 ?>

我无法理解为什么第二个无法正常工作并给出如下解析错误:

**Parse error:** syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING)

另外,如果我把上面的程序写成下面的样子,那就是如果我加死;在第一个执行行之后然后放置非工作行仍然出现相同的错误。

 <?php
   $arr = array('fruit' => 'apple', 'veggie' => 'carrot');

   define('fruit', 'veggie');

   print "Hello {$arr['fruit']}";
   die;
   print "Hello $arr['fruit']";
 ?>

我完全没听懂。它应该打印第一行,因为我正在死掉它之后的代码,编译时不应考虑 die 之后的行,但它正在考虑并禁止执行第一行。

为什么会这样?

解析错误是由于在双引号字符串中解析变量的方式造成的。 你应该读一读 here.

在第二个示例中,PHP 将 $arr 解释为一个字符串,括号对其执行子字符串类型的操作。在那种情况下,单引号不应该存在,导致解析错误。

这引出了您的第二个问题: PHP 尝试解析您的 PHP 文件时发生解析错误。由于 PHP 还不知道 die 语句之后会发生什么(例如那里可能有一个函数,您将从脚本的另一部分调用),它必须解析每一行。所以解析错误还不关心执行逻辑。