为什么if(陈述);编译并运行?

时间:2014-03-31 01:00:13

标签: php

自从我开始学习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语句。

5 个答案:

答案 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的方法停止。