为什么空白会在PHP中导致致命错误


Why would whitespace cause a fatal error in PHP?

我有一个关联数组,无论出于何种目的,看起来都没有理由发出警告。整个源代码如下:

<?php
$entries = array(
  array('date' => '2012-08-12', 'change' => '-19'),
  array('date' => '2012-08-13', 'change' => '-21'),  
  array('date' => '2012-08-14', 'change' => '-19'),
  array('date' => '2012-08-15', 'change' => '-17'),
);
foreach ($entries as $entry) {
  print $entry['date'] . ': ' . $entry['change'] . '<br/>'; 
}

对我来说,一切看起来都很好,但当我在浏览器中查看输出时,我会收到以下错误消息:

分析错误:语法错误,意外的T_ARRAY,在/Applications/MAMP/htdocs/wtf2.php的5行中应为")"

我仔细看了看,然后发现在第4行,似乎有一两个尾随空格(一开始我甚至没有多想)。然而,当我复制空白时,将其粘贴到一个新文档中,如下所示(第2行):

<?php
$whitespace = '  ';
print rawurlencode($whitespace);

然后在我的浏览器中查看输出,这就是我看到的:

%C2%A0%20

会问,"这是怎么做到的?"但我真的不认为这是一个可行的问题。因此,我的实际问题是:这样的空白与其他空白有何不同(尤其是在通过PHP解释器运行时会导致致命错误)?有没有办法防止这种情况在未来发生?

附言:我正在运行PHP 5.3.20版本(通过Mac上的MAMP Pro)。

PPS:为了澄清,当WHITESPACE本身被删除时,代码运行良好

您所拥有的是一个UTF-8编码的非中断空间(%C2%A0,又名&nbsp;),它中断了PHP的解析器。这是PHP的一个已知问题,它被标记为"不会修复",因为人们"可能会将此字符用作标识符的一部分"。请参阅请求#38766不间断空格中断解析。

刚刚撞了我大约一个小时,对此我简直疯了。

Notepad++不会显示常规空格和nbsp之间的任何区别。

如果你想知道这个字符是如何进入你的代码的,这就是我的代码:altgr+空间