【问题标题】:PHP if else - proper use of "else"PHP if else - 正确使用“else”
【发布时间】:2012-02-21 10:09:34
【问题描述】:

一位教授很久以前告诉我在“链接”一个系列中的多个条件时使用else(我还在学习)。几年后我一直在修补几个框架和 CMS,我觉得很有趣,我被教做的事情不一定是这样。

我被教导在一系列条件之间使用else

function double(param){
    if(param==1){
        return param+=1;
    }
    else 
    if(param==2){
        return param+=2;
    }
    else{
        return false;
    }
}

现在,我似乎看到了这一点,我很久以前就被警告不要这样做:

function double(param){
    if(param==1){
        return param+=1;
    }
    if(param==2){
        return param+=2;
    }
    return false;
}

这个示例代码可能不起作用,但想法是存在的:是否有必要在每个条件之间使用else 如果是(或不是),我应该注意什么当使用任何一种方式?一定是有什么事情让我的教授告诉我这样的话。

【问题讨论】:

  • 就像对使用空白的评论一样,“else if”中的 else 和 if 之间的换行符非常令人困惑(我从未见过前)。我还建议删除语言标签,因为这几乎适用于所有语言。
  • @therefromhere 我很抱歉,我在使用 PHP。那么空白只是为了清楚else。不过,有时我会以这种方式编写代码以查看 elseif 之外的内容。
  • else 在这里是多余的,因为您的代码中有return,无论如何这将最终导致函数执行。另外,整个函数可以写成function (n) { if( n==1 || n==2 ) { return n*2; } return false; }
  • “return else”这个问题争论已久。我倾向于远离“返回其他”。相关主题:codereview.stackexchange.com/questions/2084/…
  • developer.mozilla.org/En/Developer_Guide/Coding_Style 给出了“它增加了缩进级别”的原因,这在不平凡的示例中可以对可读性产生很大影响。

标签: php javascript actionscript-3 coding-style syntax


【解决方案1】:

你可能会喜欢我不久前在 Apple 网站上看到的这个场景

switch(true) {
    case foo == bar:
        break;
    case foo > 5:
        break;
    case foo > 10:
    case bar > 5:
        break;
}

你明白了。我相信所有编译器都将其分解为 if/else 代码,但我喜欢控制 break 语句位置的灵活性

【讨论】:

    【解决方案2】:

    这实际上取决于您的代码流... 有时你需要使用单独的 if(s),有时你需要使用 if(s) 和 else(s)... 但为了您添加的示例。就个人而言,我会选择你写的第一个,因为它更有效,更容易阅读和理解。也许还有其他因素和要点,但这就是我的看法,这就是我选择第一个的原因..

    还要补充一点......如果您使用第二个,编译器将始终执行第二个“if”,如果 $param 包含的值不是“1”或“2”。

    【讨论】:

      【解决方案3】:

      这真的只是一个见仁见智的问题。

      在这种情况下没有必要使用else,但是您的教授可能一直在描述不同的情况,或者他只是为了强调/强制清晰而让您这样做。

      首先,我认为从同一个函数返回不同的数据类型通常是不好的风格,但话虽如此,举个例子:

      function double($param) {
          if ($param == 1) {
              return $param + 1;
          } else if ($param == 2) {
              return $param + 1;
          } else {
              return false;
          }
      }
      

      现在想象一个类似的例子,只是它不是每次都返回:

      function double($param) {
          $returnMe = 0;
      
          if ($param == 1) {
              $returnMe = $param + 1
          } else if ($param == 2) {
              $returnMe = $param + 2;
          } else {
              $returnMe = false;
          }
      
          return $returnMe;
      }
      

      这可能看起来微不足道(并且在提供的示例中大部分是这样),您可以看到 else 确实确实有所作为。

      在强迫一切都像他一样拥有 else 时,他可能只是想在风格上提供一些一致性(我认为这对新人有好处)。

      当然,你是对的,在你提出的情况下,没有 else 是不必要的。是好是坏,真的只是见仁见智。

      【讨论】:

        【解决方案4】:

        没有必要使用else,因为控制流在return关键字处立即从函数返回。

        此外,我发现在返回时使用 else 会造成不必要的混乱,因此在所有情况下都希望使用替代 2。

        【讨论】:

          【解决方案5】:

          场景 1

          if ($one) {
              doA();
          }
          if ($two) { // ALWAYS check this block - it is not attached to anything
              doB();
          }
          
          Truth table:
          
                      | $one True | $one False 
          ------------+-----------+------------
          $two True   | A and B   | B only   
          $two False  | A only    | none
          

          场景 2

          if ($one) {
              doA();
          }
          else if ($two) {  // ONLY check this block if $one is false!
              doB();
          }
          
          Truth table:
          
                      | $one True | $one False 
          ------------+-----------+------------
          $two True   | A only    | B only   
          $two False  | A only    | none
          

          正如您在真值表中看到的,这两种情况并不相同。所以,到底是用if..else还是if..if,不只是语义或品味的问题,而是有着实际的功能区别。

          如果 returnsif 内,它将完全退出函数,因此 resultelse-if 相同。

          【讨论】:

            【解决方案6】:

            是的。为什么?因为这些条件都是基于同一个变量,只能满足一个。出于这个原因,如果您使用elseif (PHP) 或else if (JavaScript),您将提高代码可见性并可能避免将来出现一些错误。

            您在 PHP 中的代码

            您在 PHP 中的代码如下所示:

            function double($param){
                if($param==1){
                    return $param+=1;
                }
                elseif($param==2){
                    return $param+=2;
                }
                else{
                    return false;
                }
            }
            

            或者,使用switch对应:

            function double($param){
                switch ($param) {
                    case 1:
                        return $param+=1;
                    case 2:
                        return $param+=2;
                    default:
                        return false;
                }
            }
            

            您的 JavaScript 代码

            在 JavaScript 中它看起来像这样:

            function double($param){
                if($param==1){
                    return $param+=1;
                }
                else if($param==2){
                    return $param+=2;
                }
                else{
                    return false;
                }
            }
            

            【讨论】:

              【解决方案7】:

              使用else 或不使用它意味着两种不同的东西。

              如果您希望测试一系列最多可能为真的条件,请使用elseelse if。当一个条件为真时,块中的代码被执行,然后整个 if-else 结构被退出。

              当多个条件可能为真时,使用else排除其他条件的计算结果为真,因此在这种情况下使用else 是错误的。

              编辑:我现在看到您指的是每个子句都包含 return 语句的特定情况。在这种情况下,最好使用elseelseif 来明确 if-else 构造以第一种方式运行 - 即。最多可以执行一个条件。

              【讨论】:

              • +1 同意!使用使代码更具可读性的技术是一种很好的编码实践。我们是工程师。我们不是在用我们的代码玩 waldo 在哪里 :)
              • @jmort253 实际上,显然有些很无聊的人是:stackoverflow.com/questions/8479058/…
              【解决方案8】:

              我认为这是一个很好的做法,因为如果您忘记了 return 子句,流程会随之而来(导致难以发现的错误)

              反正else子句在某些情况下可能过于冗长,所以可以使用elseif

              <?php
              if ($a > $b) {
                  return "a is bigger than b";
              } elseif ($a == $b) {
                  return "a is equal to b";
              } else {
                  return "a is smaller than b";
              }
              ?>
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-08-28
                • 2014-08-08
                • 2012-11-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-07
                • 1970-01-01
                相关资源
                最近更新 更多