@tosho的回答太好了。
刚才发生的是PHP解析器尝试解析该文件并创建tokens 首先,与第一个标记混淆class
, 因为该版本的PHP的解析器无法与\\r
字符。
其他不可见的Unicode字符也可能会破坏解析器。最主要的是,除非打开Hex编辑器,否则您无法从编辑器中理解问题。
BOM字符(props@MarkKaplun)也会产生问题。有些Unicode n-dash字符看起来就像-
(负),你可以抓你的头好几天。
在这种情况下,正如你所确认的\\r
carriage return character 是你的问题。
但这取决于PHP版本。我在PHP 7上测试了您的代码,没有发现任何问题。
我注意到WPSO编辑器将修剪\\r
字符,我在测试时手动添加了它。
这个故事的寓意。
通过regex replace从编辑器中修复项目的行尾
但也修复了非PHP文件的结尾。
define(\'CR\', "\\r"); // Carriage Return: Classic Mac
define(\'CRLF\', "\\r\\n"); // Carriage Return and Line Feed: Windows
define(\'LF\', "\\n"); // Best: Unix, Linux, Mac, Windows
function fix_endings($s) {
// Convert all line-endings to the Best format.
$s = str_replace( CRLF, LF, $s );
$s = str_replace( CR, LF, $s );
// Don\'t allow out-of-control blank lines
$s = preg_replace( "/\\n{2,}/", LF . LF, $s );
return $s;
}
行尾非常重要,也可能有安全隐患。如果PHP解析器在某些字符上失败,您可能会猜到一些读取文件的PHP函数也可能失败