【问题标题】:puzzling php parser error令人费解的 php 解析器错误
【发布时间】: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; 效果如何?还是没有错误?

标签: php parsing php-internals


【解决方案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 看来,发行版或其他已修补的情况似乎并非如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2013-12-23
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多