if和elseif有什么区别?

4
这应该是一个简单的问题。我有一个简单的 if/else 语句:
    <?php
    // TOP PICTURE DEFINITIONS
    if ( is_page('english') ) {
        $toppic = 'page1.png';
    }
    if ( is_page('aboutus') ) {
        $toppic = 'page1.png';
    }
    if ( is_page('newspaper') ) {
        $toppic = 'page1.png';
    }
    else {
        $toppic = 'page1.png';
    }
?>

有什么区别从 ^^^ 到这个:
<?php
    // TOP PICTURE DEFINITIONS
    if ( is_page('english') ) {
        $toppic = 'page1.png';
    }
    elseif ( is_page('aboutus') ) {
        $toppic = 'page1.png';
    }
    elseif ( is_page('newspaper') ) {
        $toppic = 'page1.png';
    }
    else {
        $toppic = 'page1.png';
    }
?>

我应该提到这将放入WordPress中。直到现在,我使用了第一部分(没有elseif,只有一系列“ifs”),而且它是有效的。我只是好奇知道区别是什么。

谢谢! Amit


2
重复问题,网址为 https://dev59.com/zkbRa4cB1Zd3GeqP4NrU 或 https://dev59.com/QE3Sa4cB1Zd3GeqPzfBG 等等。 - user180100
在你的情况下,无论你使用哪个,都没有关系,但是如果你有一些检查某些东西的函数,使用elseif可能会更快,因为它只检查直到某个条件匹配。 - domiSchenk
8个回答

18

是的。如果在 if/else 控制中满足了某个条件,那么其余的检查将被省略。else if 只是嵌套在 else 中的一个 if

if ( is_page('english') ) { // if true, other statements are skipped
    $toppic = 'page1.png';
}
elseif ( is_page('aboutus') ) {
    $toppic = 'page1.png';
}
elseif ( is_page('newspaper') ) {
    $toppic = 'page1.png';
}
else {
    $toppic = 'page1.png';
}

但在一系列的if语句中,所有的条件都会被测试。

if ( is_page('english') ) {
    $toppic = 'page1.png';
}
if ( is_page('aboutus') ) { // will be tested no matter what the outcome
                            // of the previous if statement was
    $toppic = 'page1.png';
}
if ( is_page('newspaper') ) { // the same here
    $toppic = 'page1.png';
}
else {
    $toppic = 'page1.png';
}

如果你要检查一个数字的奇偶性等属性,它要么是奇数,要么是偶数,为什么还要检查其他条件呢?这样会浪费资源。因此,以下代码更好:

if(number_is_odd) {
}
else { // if it's not odd, it's even for sure
}
if(number_is_odd) {
}

if(!number_is_odd) {
}

因为前者只检查条件一次,而后者检查两次。对于有多个状态的条件也是如此。


我在 PHP 指南书中看到过更糟糕的例子。干得好! - Drew
虽然这是一个很好的答案,但对于在这个问题中概述的情况,它应该被设置为switch语句,因为每个if都在评估相同的主题项... - Martin

2

在您的第一个代码块中,块内的每个比较都会被执行。此外,toppic将始终被分配为is_page('newspaper')的值或is_page('newspaper') else语句中的值。这是因为最后一个if语句总是被评估的。即使前面的if语句之一被评估为true,也会进入else块。要测试这一点,请尝试使用以下代码...

<?php
    // TOP PICTURE DEFINITIONS
    if ( is_page('english') ) {
        $toppic = 'english.png';
    }
    if ( is_page('aboutus') ) {
        $toppic = 'aboutus.png';
    }
    if ( is_page('newspaper') ) {
        $toppic = 'newspaper.png';
    }
    else {
        $toppic = 'finalelse.png';
    }
?>

你最终会得到'newspaper.png'或者'finalelse.png'其中之一。


2
<?php
    if ( 3 > 1 ) {
        echo "This will be printed.";
    }
    if ( 3 > 2 ) {
        echo "This will be printed too.";
    }
    if ( 3 > 3 ) {
        echo "This will NOT be printed.";
    }
    else {
        echo "This WILL be printed.";
    }
?>

但是使用elseif:
<?php
    if ( 3 > 1 ) {
        echo "This will be printed.";
    }
    elseif ( 3 > 2 ) {   /* This condition will not be evaluated */
        echo "This will NOT be printed";
              // because it's on the ELSE part of the previous IF
    }   
    elseif ( 3 > 3 ) {   /* This condition will not be evaluated either */
        echo "This will NOT be printed.";
    }
    else {    /* This ELSE condition is still part of the first IF clause */
        echo "This will NOT be printed.";
    }
?>

因此,您应该使用ELSEIF,否则$toppic将始终导致'newspaper.png',这应该是正确的,或者'finalelse.png',这可能是正确或错误的,因为它将覆盖先前的条件子句。
我希望您会发现这个有用。

2

有时候并不仅仅是效率的问题。如果你要切换某个东西,使用else if而非仅仅是if是至关重要的。

假设我们要切换变量$computerOn

if ($computerOn == true) {
    $computerOn = false;
}
if ($computerOn == false) {
    $computerOn = true;
}

在上述情况下,您的$computerOn始终true。如果它是true,则它会被设置为false。在此之后,我们检查它是否为false,这现在必须独立于初始条件,因此它现在被设置为true
另一方面,下面的代码将切换$computerOn的状态:
if ($computerOn == true) {
    $computerOn = false;
} elseif ($computerOn == false) {
    $computerOn = true;
}

现在我们仅在$computerOn最初不为true时检查它是否为false。因此我们有了一个切换。
如果情况变得更加复杂,你可能需要使用多个elseif。重要的是要认识到逻辑何时要求使用elseif而不是选择性使用。

2
第一种方法将检查每个条件,无论它们是真还是假。
第二种方法将检查每个条件,直到有一个为真,然后忽略其余的条件。

1
两者之间最大的区别在于,只要is_page('newspaper')返回false,最后一个else块就会被调用。在这种情况下,几乎每次脚本运行时都会发生。在这种情况下,这并不是什么大问题,因为你只是设置一个变量,而且它与其他所有值都相同。但是,如果它是不同的,你将不得不追踪一个非常令人沮丧的错误!
此外,如果你使用单独的if语句,每个if的条件都会被评估。同样,在这种情况下,这可能不是什么大问题。但是,如果条件是...
if(delete_file('foo.png')) {
    ....
}

if(delete_file('bar.png')) {
    ....
}

if(delete_file('baz.png')) {
    ....
}
else {
    ....
}

好的,你应该能够看出这是怎么回事;) 如果使用elseif,它将在找到为真时停止评估。而且,只有在没有其他条件为真时才会调用 else。


1

答案很简单:

if(a==1){
  b
}
elsif(b==1){
  c
}

等于

if(a==1){
  b
}
else{
  if(b==1){
    c
  }
}

这与之前相同。

if(a==1){
  b
}
if(b==1){
  c
}

如果a==1和b==1不可能同时成立,那么就需要使用if语句。尽管当两个if语句都为真时,b和c都可以执行。但是,如果在这里使用elsif,那么b==1只有在a!=1时才会被检查,这种情况将不可能发生!


0
使用elseif语句可以明智地节省大量时间,因为解析器不需要评估所有条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接