PHP heredoc解析错误

4

这将产生输出页面 OK

$mystring = "<<<EOT";

用以下内容替换会产生如下错误:

在文件.php的第737行,出现语法错误:意外的$end

$mystring = <<<EOT
   This is some PHP text.
   It is completely free
   I can use "double quotes"
   and 'single quotes',
   plus $variables too, which will
   be properly converted to their values,
   you can even type EOT, as long as it
   is not alone on a line, like this:
EOT;

任何想法是什么导致解析器无法工作?
我正在使用PHP 4.4.7。
只有一个文件出现此行为,所有其他文件都遵循PHP定义的功能。
我正在尝试纠正的是可能在前面几行出了什么问题,以致于PHP解析器显示出这个错误。
John
将文件内容更改为:-
<?php

$mystring = <<<WHATEVER
   This is some PHP text.
WHATEVER;
?>

结果 =

解析错误:在文件.php的第5行出现意外的$end符号。

有什么线索吗?

编辑

原始错误与T_ENCAPSED_AND_WHITESPACE有关,例如jQuery中的"if(x == y){$('#my_image').hide():}"在heredoc中,bigram "{$将启动解析器寻找用于替换的PHP变量。

编辑

2个好的回应。

1)Ch4m3l3on - "<?php"与"<?"处理。

2)The Disintegrator - <q>遇到类似的问题,一个愚蠢的程序坚持将BOM放入utf-8文件(忽略首选项)</q>

编辑

1)用单个块替换所有内容无法解决问题或提供任何其他指针。

2)没有BOM(字节顺序标记),可惜这或类似的神奇字符可以完美地解释所有症状。


5
是时候升级至至少5.1版本了,最新的稳定版本是5.3 :D。 - Dirk
1
注意:我不是在寻找为什么heredoc编码错误,因为它已经被正确编码了。这就是为什么我在第一行中加入了$mystring = "<<<WHATEVER";因为那不会引起问题,可以参考David Dorward的答案。只有当发现合法的heredoc时,文件的其余部分才会导致解析器出错。 - John Griffiths
你能把你的文件上传到某个地方吗?因为这可能涉及文件的其他部分或者你的PHP版本或其他什么问题。 - Halil Özgür
无法复现。http://eval.in/11513 - hakre
php4在解析缩进方面存在一些错误。尝试将heredoc结束标记放置在行的第一个字符,并与变量赋值处于相同的缩进级别。并且在整个文件中使用相同的换行符。 - gcb
显示剩余5条评论
7个回答

13

你必须在行首放置终止 heredoc。如果使用一些带缩进的 IDE,请将其删除!你的终止 heredoc 必须与最后的 PHP 标记在同一垂直线上。


1
我读过的许多解释中最好的一个。它必须是左对齐的。 - Allen Gingrich

8
确保在“WHATEVER;”后面没有任何内容,即使是一个空格也会导致解析错误。我建议您删除这一行并重新输入,在键入分号后立即按下“”键。

无关紧要,heredoc在粘贴到其他php文件中可以正常工作,问题是为什么解析器会在有效的heredoc上出错,而它正确地解析了字符串赋值。 - John Griffiths
2
显然问题不在heredoc声明上。问题必须在脚本的其他地方。就像Pedro Cunha所说,检查未正确关闭的花括号。此外,您可能需要将任何php短标签替换为完整标签。 - Adi
抱歉Ch4m3l3on,我无法给你的评论点赞。请将你的回答重复为一个答案"<?php"与"<?",这样我就可以点赞了。虽然我仍不知道答案,但会调查你的想法。 - John Griffiths
你也可以点赞评论 ;) - Adi

5

请确保 EOT; 真的在行首。

if ($muh="kuh") {
     $foo = <<<EOT
           some text text text
EOT;
}

在发布之前,请确保在行开头检查了 EOT,并且如果空格可以的话,也要进行测试 <<<EOT,以及在 EOT..EOT 之间没有行,只有字母。如果出现症状,请将结果发送到 StackOverflow 上,以找出可能导致问题的原因,例如 <? 处理和 } 处理,还有 <xxx>..</xxx> 处理。 - John Griffiths

2
如果您尝试以下方法:
$mystring = <<<'EOT'
...
EOT;

(注意第一个EOT周围的单引号)

0

你可能需要检查一下是否有未闭合的花括号(或大括号,我记不清了)。

例如:

<?php

while(true) {
    echo "Something\n";

?>

会产生那个错误。


0

虽然我没有足够的声望,但Ch4m3l3on和Pedro Cunhna是正确的... 一个不正确的heredoc可能不会导致意外的$end错误,但未关闭的大括号肯定会。


0

我只是将它复制/粘贴到一个文件中,然后运行时没有出现错误。(PHP 5.2.8 (cli) (built: Feb 6 2009 12:33:08))

所以问题很可能是在那段代码附近,但不是你在问题中包含的内容。

要么是这样,要么是自从你的版本构建以来PHP发生了变化。


只有一个文件发生了这种行为,所有其他文件都遵循PHP定义的功能。但是什么是阻塞原因呢?目前还没有人给我任何线索。 - John Griffiths
由于提供的代码可以无错误运行,所以阻塞原因与您未向我们展示的代码有关 - 而我们没有水晶球。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接