【问题标题】:What's the difference between if and elseif?if 和 elseif 有什么区别?
【发布时间】:2011-03-24 01:09:54
【问题描述】:

这应该是一个简单的问题。我有一个简单的 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”),并且它有效。我只是想知道有什么区别。

谢谢! 阿米特

【问题讨论】:

标签: php conditional if-statement


【解决方案1】:

是的。如果满足if/else 控件中的条件,则将省略其余检查。 else if 只是嵌套在 if 内的 else

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';
}

但是在一系列ifs 中,它们都会被测试。

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 指南中看到过更糟糕的例子。干得好!
  • 虽然这是一个很好的答案,但对于这个问题中概述的情况,它应该设置为 switch 语句,因为每个 if 都在评估相同的主题项...
【解决方案2】:

第一种方法将检查每个条件,无论它们是真还是假。

第二种方法将检查每个条件,直到其中一个为真,然后忽略其余的。

【讨论】:

    【解决方案3】:

    在您的第一个块中,执行块中的每个比较。此外,将始终为主题分配 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”结尾。

    【讨论】:

      【解决方案4】:
      <?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”,这可能是对的或错的,因为它会覆盖前面的条件子句.

      希望对您有所帮助。

      【讨论】:

        【解决方案5】:

        这并不总是效率问题。如果您要切换某些内容,则必须使用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是否是false,如果它最初不是true。因此我们有一个切换。

        如果事情变得更复杂,您可能需要使用多个elseifs。当逻辑表明elseif 是必须的还是选项时,认识到这一点很重要。

        【讨论】:

          【解决方案6】:

          两者之间最大的区别在于,只要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。

          【讨论】:

            【解决方案7】:

            答案很简单:

            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 语句都为真时,当 b 和 c 都可以执行时。如果你在那里使用 elsif,这是不可能的,因为只有在 a!=1! 时才会检查 b==1!

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 2012-08-27
                • 1970-01-01
                • 2011-03-25
                • 2013-11-18
                • 1970-01-01
                • 2011-03-11
                • 1970-01-01
                • 2013-01-14
                • 1970-01-01
                相关资源
                最近更新 更多