请参阅以下代码段:
<?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----
这到底发生了什么?
答案 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)
答案 5 :(得分:-2)
示例1:
它不应该执行。因为编码将逐行运行。无效文本将停止执行。最后什么都不会执行,执行就会失败。
示例2:
由于逐行执行的原因,两个echo语句都将执行,但最终执行状态将失败。