Php 为什么会这样做(声明);编译并运行?

Php 为什么会这样做(声明);编译并运行?,php,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 aga

自从我开始学习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";
?>

这将输出:

奥科诺


为什么会这样?这个的预期用途是什么?代码中只剩下一个因某种原因从未被修复的twerk?看起来编译器只是跳过了整个if语句。

因为PHP解释器正在查找
if(…)
之后的一条语句,以便在条件计算为
true
时执行。添加分号告诉解释器您已经完成了语句。您已经有效地告诉PHP在条件为true时执行no-op语句。
echo
甚至不再是if语句的一部分

这相当于写作

if($foo == "bar"){
}
echo "OK";

因为PHP解释器正在查找
if(…)
之后的一条语句,以便在条件的计算结果为
true
时执行。添加分号告诉解释器您已经完成了语句。您已经有效地告诉PHP在条件为true时执行no-op语句。
echo
甚至不再是if语句的一部分

这相当于写作

if($foo == "bar"){
}
echo "OK";

由于分号,第二个和第三个if语句被视为空语句。空洞的陈述真的没有任何作用

由于分号,第二个和第三个if语句被视为空语句。空洞的陈述真的没有任何作用

因为在您的情况下,分号被视为空语句,所以您的代码被解释为:

<?php
$foo = "bar";

if ($foo == "bar")  
    echo "OK";

if ($foo == "bar")
    ;  // empty statement

echo "OK";

if ($foo == "derp")
    ;  // empty statement

echo "NO";
?>

因为在您的情况下,分号被视为空语句,所以您的代码被解释为:

<?php
$foo = "bar";

if ($foo == "bar")  
    echo "OK";

if ($foo == "bar")
    ;  // empty statement

echo "OK";

if ($foo == "derp")
    ;  // empty statement

echo "NO";
?>

当我第一次开始学习Java时,这让我发疯,导致了很多bug。。。我仍然做恶梦

我假设它跳过if语句的原因是因为分号告诉编译器块已经结束

下面的方法可以奏效

if ($foo == "bar") echo = "OK";
如果您只是替换了变量赋值呢

if ($foo == "bar") ;
echo = "OK";
这仍然是法律法规,但它只是说,如果这个条件是真的,那么什么也不做。假定作为if块的一部分执行的代码将始终被执行


干杯,

当我第一次开始学习Java时,这让我发疯,导致了很多bug。。。我仍然做恶梦

我假设它跳过if语句的原因是因为分号告诉编译器块已经结束

下面的方法可以奏效

if ($foo == "bar") echo = "OK";
如果您只是替换了变量赋值呢

if ($foo == "bar") ;
echo = "OK";
这仍然是法律法规,但它只是说,如果这个条件是真的,那么什么也不做。假定作为if块的一部分执行的代码将始终被执行


干杯,

如其他答案中所述,“how”是因为分号作为空语句计算,然后下一行是if条件so被执行后的“after”

可能有很多东西在语法上是“有效的”,但没有实际用途,例如,从技术上讲,你可以在一行上加上一个分号,它不会起作用,但它是有效的。。。然而,在这种情况下,有一个现实世界中的用法:使用if条件作为执行一系列函数的方法,但在第一个返回true的函数处停止。比如:

//Go until it gets to one that returns true...
if (firstCall() || secondCall() || thirdCall()) ;
在该示例中,它将始终调用
firstCall()
。如果该函数返回true,PHP在那里停止,因为其他函数的计算结果不重要,它知道整个语句都是true。如果它返回false,它将继续运行,直到遇到一个返回true的函数(直到它通过所有部分)。换言之,上述内容将是这方面的简称:

if (!firstCall()) {
    if (!secondCall()) {
        thirdCall();
    }
}

您可以使用AND执行类似的解决方案,使其在返回false的第一个方法处停止。

如其他答案中所述,“how”是因为分号被计算为空语句,然后下一行是“after”if条件so被执行

可能有很多东西在语法上是“有效的”,但没有实际用途,例如,从技术上讲,你可以在一行上加上一个分号,它不会起作用,但它是有效的。。。然而,在这种情况下,有一个现实世界中的用法:使用if条件作为执行一系列函数的方法,但在第一个返回true的函数处停止。比如:

//Go until it gets to one that returns true...
if (firstCall() || secondCall() || thirdCall()) ;
在该示例中,它将始终调用
firstCall()
。如果该函数返回true,PHP在那里停止,因为其他函数的计算结果不重要,它知道整个语句都是true。如果它返回false,它将继续运行,直到遇到一个返回true的函数(直到它通过所有部分)。换言之,上述内容将是这方面的简称:

if (!firstCall()) {
    if (!secondCall()) {
        thirdCall();
    }
}
您可以使用AND执行类似的解决方案,使其在返回false的第一个方法处停止