令人费解的 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
在<?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
希望对您有所帮助。在我看来,这看起来就像输入被视为文本一样,直到空格跟随<?php
开头序列。
【讨论】:
【参考方案2】:PHP documentation 说:
在 PHP 5.2 及更早版本中,解析器不允许打开
<?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 及更早版本中,解析器不允许打开
<?php
标签是文件中唯一的东西。自 PHP 5.3 起允许这样做。
然而,OP 似乎允许开始标签 + 空格(即 不是文件中唯一的东西)。此外,从 cmets 看来,发行版或其他已修补的情况似乎并非如此。
【讨论】:
以上是关于令人费解的 php 解析器错误的主要内容,如果未能解决你的问题,请参考以下文章
JSONSerialization 返回错误,但是 php 解析器