令人费解的 php 解析器错误

Posted

技术标签:

【中文标题】令人费解的 php 解析器错误【英文标题】:puzzling php parser error 【发布时间】:2011-10-07 07:33:01 【问题描述】:

好吧,也许不那么令人费解,但就是这样。

我在搞砸了,注意到了这一点,在文件中只输入<?php,就这样,之后没有空格,没有别的,只是标签,会引发解析错误。

只有一个空格就可以了。我想知道是否有人知道为什么解析器会阻塞,因为省略结束标签是完全可以的。 谢谢。

【问题讨论】:

我的 php 解释器在这种情况下不会抛出解析错误。 我的是 (PHP Parse error: syntax error, unexpected $end in /home/chris/test.php on line 1) PHP 版本是 5.3.3-7+squeeze3 不知道为什么,但我可以用 PHP5.3.6+Suhosin, 2.6.32-3-amd64 linux kernel 确认。 绝对令人费解。我想知道为什么我不能复制它。 PHP 版本 5.3.5-1ubuntu7.2 @PaulPRO:最常见的编辑器会在其中添加一个偷偷摸摸的换行符。 echo -n '<?php' > /tmp/test.php; php /tmp/test.php; 效果如何?还是没有错误? 【参考方案1】:

我的 PHP 版本:

$ php -v
PHP 5.3.6 (cli) (built: Mar 17 2011 20:56:13) 
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
    with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans

有问题的代码:

$ echo -n "<?php" | php
<?php

&lt;?php 旁边添加更多内容:

$ echo -n "<?php/**/" | php
<?php/**/

$ echo -n "<?php;" | php
<?php;

然后是一个空格:

$ echo -n "<?php " | php

(最终为空输出)。

对于上面的示例,PHP 版本没有给我Parse error: syntax error, unexpected $end 类型的消息,但它确实如此:

$ echo -n "<?php x" | php -d display_errors=1

Parse error: syntax error, unexpected $end in - on line 1

希望对您有所帮助。在我看来,这看起来就像输入被视为文本一样,直到空格跟随&lt;?php 开头序列。

【讨论】:

【参考方案2】:

PHP documentation 说:

在 PHP 5.2 及更早版本中,解析器不允许打开 &lt;?php 标签是文件中唯一的东西。自 PHP 5.3 起允许这样做。

话虽如此,在 PHP 5.3 中,如果您在 php.ini 文件中将 short_open_tags 设置为 On,错误仍然会出现。

【讨论】:

Ack,short_open_tags 确实是我的php版本(5.3.6)中解析错误与否之间的区别 啊。这解释了为什么我在使用 php 5.3.5 时拥有它,我猜它认为我正在尝试使用短标签。之后的“p”不是有效的 php。 :)【参考方案3】:

这个回答在PHP Documentation for Basic Syntax:

在 PHP 5.2 及更早版本中,解析器不允许打开 &lt;?php 标签是文件中唯一的东西。自 PHP 5.3 起允许这样做。

然而,OP 似乎允许开始标签 + 空格(即 不是文件中唯一的东西)。此外,从 cmets 看来,发行版或其他已修补的情况似乎并非如此。

【讨论】:

以上是关于令人费解的 php 解析器错误的主要内容,如果未能解决你的问题,请参考以下文章

JSONSerialization 返回错误,但是 php 解析器

无效格式xml的最佳PHP解析器[重复]

php [robots.txt解析器] robots.txt php解析器#php

PHP-XML基于流的解析器及其他常用解析器

用于 php 的独立语法和解析器

PHP XML Expat 解析器