PHP执行路径(解析器)

时间:2013-10-11 04:12:53

标签: php compiler-construction

请参阅以下代码段:

<?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----

这到底发生了什么?

6 个答案:

答案 0 :(得分:0)

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

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

sfafsadffas
flush();
?>

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

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

flush();
sfafsadffas
?>

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

答案 1 :(得分: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";
?>

第二个片段在语法检查中幸存下来,因为它有一点&#34;功能&#34; PHP:解析器将?>计为分号。所以当你跑:

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

echo "foo";
echo "bar";

sfafsadffas
?>

语法检查说&#34; OK&#34;并继续PHP运行该文件。如果在文件的某个时间早些时候定义了sfafsadffas,那么该文件实际上是完全有效的。

然后由于你的die,代码永远不会落到第7行。

答案 2 :(得分:-1)

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

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

答案 3 :(得分:-1)

此处sfafsadffas被视为常量。 在示例1中,在sfafsadffas之后添加分号,并且您使用常量常量方式以便它可以工作。 在示例2中,您不需要使用分号分隔最后一行代码,请参阅this

答案 4 :(得分:-2)

抛出解析错误

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

请检查

http://writecodeonline.com/php/

答案 5 :(得分:-2)

示例1:

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

示例2:

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