2

请参阅以下代码段:

<?php
  die("----die----");

  sfafsadffas

  echo "foo";
  echo "bar";
?>

结果是:

Parse error: parse error in test.php on line 6.

这有点出乎意料,我原以为我们应该得到----die----.

现在看到以下内容:

<?php
  die("----die----");

  echo "foo";
  echo "bar";

  sfafsadffas
?>

结果是:

----die----

这里到底发生了什么?

4

6 回答 6

0

间接影响您的echo程序:除了打印到屏幕/浏览器之外,输出缓冲区echo正在flush尝试打印迄今为止“聚合”的所有输出。由于flush在此之前会发现语法错误。您可以通过执行以下操作重现相同的错误:

<?php
die("----die----");

sfafsadffas
flush();
?>

但是,如果您在解析器遇到语法错误之前刷新输出缓冲区 -die将被执行。

<?php
die("----die----");

flush();
sfafsadffas
?>

将输出----die----,然后解析器将停止执行,因为它died并且您不会到达导致语法错误的行。

于 2013-10-11T05:03:10.560 回答
0

PHP 在执行文件时做的第一件事是运行语法检查以查找明显的错误。这包括缺少;分号、不匹配的大括号{}等。

第一个片段未通过第一次测试:

<?php
die("----die----");

sfafsadffas  // <-- no semicolon between this line of code and the next,
             //     so you get a 'parse error' before the file even gets run
echo "foo";
echo "bar";
?>

由于 PHP 的一个小“特性”,第二个片段在语法检查中幸存下来:解析器算作?>分号。所以当你运行时:

<?php
die("----die----");

echo "foo";
echo "bar";

sfafsadffas
?>

语法检查显示“OK”,PHP 继续运行该文件。如果在文件中sfafsadffas较早的某个时间定义,该文件实际上将是完全有效的。

然后由于您的die,代码永远不会下降到第 7 行。

于 2016-09-05T20:44:10.297 回答
-1

sfafsadffas这里被认为是一个常数。在示例 1 中,在后面加上一个分号,sfafsadffas并且您以正常方式使用常量,因此它可以工作。在示例 2 中,您无需使用分号分隔最后一行代码,请参阅

于 2013-10-11T04:52:51.150 回答
-1

第一个失败,因为解析器看到了无效的文本和错误。

第二个可能会或可能不会失败,具体取决于您的 PHP 解释器,它可能不会失败,因为预处理器(或解析器)忽略了文件末尾的无关数据。

于 2013-10-11T04:27:59.147 回答
-2

引发解析错误

Parse error: syntax error, unexpected $end on line 7

请检查

http://writecodeonline.com/php/

于 2013-10-11T04:22:04.863 回答
-2

示例 1:

它不应该执行。因为编码将逐行运行。无效文本将停止执行。最后什么都不会执行,执行会失败。

示例 2:

由于逐行执行,两个echo语句都会执行,但最终执行状态会失败。

于 2013-10-11T04:35:06.367 回答