自从我开始学习PHP以来,我一直都在想这个问题。和许多其他初学者一样,我在整个地方放置了分号,出于某种原因,将它们放在if语句之后编译并运行,但不像人们期望的那样。
示例:
<?php
$foo = "bar";
if ($foo == "bar") // Correct way
echo "OK";
if ($foo == "bar"); // Incorrect way
echo "OK";
if ($foo == "derp"); // Incorrect way again
echo "NO";
?>
这将输出:
OKOKNO
这是为什么?这个的用途是什么?只是在代码中留下了一个由于某种原因从未修复过的twerk?看起来编译器只是一起跳过整个if语句。
答案 0 :(得分:4)
因为如果条件被评估为if(...)
,PHP解释器在true
之后查找一个语句。附加分号告诉解释器您已完成该语句。当条件成立时,你已经有效地告诉PHP执行no-op语句。 echo
甚至不再是if语句的一部分。
这相当于写作
if($foo == "bar"){
}
echo "OK";
答案 1 :(得分:2)
因为在你的情况下,分号被认为是空语句,所以你的代码被解释为:
<?php
$foo = "bar";
if ($foo == "bar")
echo "OK";
if ($foo == "bar")
; // empty statement
echo "OK";
if ($foo == "derp")
; // empty statement
echo "NO";
?>
答案 2 :(得分:0)
由于半冒号,第二个和第三个if语句被视为空语句。空语句真的什么都不做。
答案 3 :(得分:0)
当我第一次开始学习Java时,这让我开始了INSANE,造成了很多错误......我仍然做恶梦。
我假设它跳过if语句的原因是因为分号告诉编译器该块已经结束。
以下方法可行。
if ($foo == "bar") echo = "OK";
如果您刚刚更换了变量赋值怎么办?
if ($foo == "bar") ;
echo = "OK";
这仍然是合法的代码,但它只是说,如果这个条件成立,那么什么都不做。假设将作为if-block的一部分执行的代码将始终执行。
干杯,
答案 4 :(得分:0)
如其他答案所述,&#34;如何&#34;是因为分号被评估为空语句,然后下一行是&#34;&#34; if条件如此执行。
可能有很多东西语法&#34;有效&#34;但是没有实际用途,例如,你可以在技术上只是将一个变量放在行后面跟一个分号,它不会做任何事情,但它会有效......但在这种情况下,有一个< strong>真实世界使用:使用if条件作为执行一系列函数的方法,但在第一个返回true的函数处停止。类似的东西:
//Go until it gets to one that returns true...
if (firstCall() || secondCall() || thirdCall()) ;
在该示例中,它始终会调用firstCall()
。如果该函数返回true,那么 PHP会停止,因为其他人评估的内容并不重要,它知道整个语句都是真的。如果它返回false,它会继续运行,直到它遇到一个返回true的值(直到它通过所有部分)。换句话说,上面的内容将是的简写:
if (!firstCall()) {
if (!secondCall()) {
thirdCall();
}
}
您可以使用AND执行类似的解决方案,使其在第一个返回false的方法停止。