【问题标题】:PHP - exit from IF blockPHP - 退出 IF 块
【发布时间】:2010-12-28 11:43:01
【问题描述】:

如果满足特定条件,我如何退出 if 块?

我尝试使用break,但它不起作用:

if($bla): 
  $bla = get_bla();
  if(empty($bla)) break;
  do($bla);
endif;

它说:致命错误:无法在...中中断/继续 1 级

【问题讨论】:

标签: php if-statement conditional exit


【解决方案1】:

在 PHP 5.3 中你可以使用goto

if($bla): 
   $bla = get_bla();
   if(empty($bla)) goto end;
   do($bla);
endif;
end:

但我个人认为这是一个丑陋的解决方案。

【讨论】:

  • 为什么丑?在某些情况下肯定会很有用。投票!
  • 请问为什么 PHP 背后的人在 2009 年推出了它?他们本可以选择根本不介绍它。我同意它对我来说非常像 DOS(不是很好),但它肯定会派上用场。
  • 它仍然有一个目的,例如退出嵌套循环。
【解决方案2】:

您不能中断 if 语句,只能使用 for 或 while 之类的循环。

如果 this if 在函数中,请使用 'return'。

【讨论】:

    【解决方案3】:

    为什么不把它转过来。

    if($bla): 
      $bla = get_bla();
      if(!empty($bla)) {
        do($bla);
      }
    endif;
    

    这样它只会在 $bla 不为空的情况下运行你的代码。这就是 if 语句的重点

    【讨论】:

    • 您的回答解决了问题,但没有回答“我如何退出 if 块”的问题,如果有可能,请注意。
    • @rahmanisback 就像你说的,它解决了问题,所以我真的不明白我的答案有什么问题。如果您只看一个答案,您会发现该问题已得到解答。当我发布我的答案时,已经有几个帖子回答了这个问题,所以我所做的是提供一个实际的解决方案。你不能打破 if 语句,如果你需要这样做,你就用错了。
    • 它解决了我的问题!我也在做同样的事情,当我可以重新安排时试图退出。我看到了实际回答问题的优点,但如果问题使用了不正确的方法或不实用,则应注意。谢谢!
    【解决方案4】:

    试试这个

    do {
    
        if($bla) {
            $bla = get_bla();
    
            if (empty($bla)) {
                break;
            }
    
            do($bla);
        }
    
        /* You can do more comparisions here */
    
    } while (0);
    

    【讨论】:

      【解决方案5】:

      我不敢相信还没有人发布这个解决方案(用我的 PHP 风格编写):

      if($bla){do{
        $bla = get_bla();
        if(empty($bla)) break;
        do($bla);
      }while(false);}
      

      复杂度仍为 O(1)

      【讨论】:

      • 哇。但它仍然完全变态......我们可以使用 goto,我们甚至可以使用 include() 并从那里返回,但我们不能只退出 if 块......
      【解决方案6】:

      你不能。

      你可以把整个事情放到一个函数中,你可以从中return

      否则,您将不得不更改逻辑并包含另一个 if 块。

      if($bla): 
        $bla = get_bla();
        if(!empty($bla)): 
         do($bla);
        endif;
      endif;
      

      【讨论】:

        【解决方案7】:

        对我来说,如果您不介意在另一个块中使用 if 语句,那么在代码需要在块之间退出时使用转义标记会很有帮助。

        $exit = FALSE;
        
        if(!$exit){
            if($data["param1"] == cond1){
                //do something and continue
            }
            else{
                //do something
                $exit = TRUE;
            }
        }
        
        if(!$exit){
            if($data["param2"] == cond2){
                //do something and continue
            }
            else{
                //do something
                $exit = TRUE;
            }
        }
        
        {...}
        

        如果你继续在每个块周围放置条件语句,在你将 $exit 设置为 true 后,它不会执行任何其他块。如果这对您更有意义,您可以将变量命名为 $continue 并恢复其角色。

        如果你没有 else 语句,它会更容易工作。

        $exit = FALSE;
        
        if($bla): 
            $bla = get_bla();
            if(empty($bla)) $exit = TRUE;
            if(!$exit)do($bla);
        endif;
        

        【讨论】:

          【解决方案8】:

          严格来说,我们不能过早离开if-block,但有时确实需要。 break 只能在循环和switch-block 内使用。但是我们可以将if 放在一个循环中。所以,马科斯·费尔南德斯·拉莫斯的回答可能是最合适的。这里只是稍微好一点的变体。

          do if ()
          {
            ...
            if () break;
            ...
          } while (false);
          

          【讨论】:

            【解决方案9】:

            如果你真的想要一个可以break 的语句,你可以使用while 语句:

            while ($bla) {
                $bla = get_bla();
            
                if (!$bla) {
                    break;
                }
            
                do($bla);
            
                // Maybe some more code...
            
                // Do not forget to break out of the while loop!
                break;
            }
            

            这是避免许多嵌套的if 语句的好方法(在许多情况下可以避免),但要小心break 循环。

            【讨论】:

              【解决方案10】:

              如果您的条件是针对单个变量的测试,那么 switch 语句是一个更好的解决方案,您可以轻松突破:

              switch ($var_to_check) { // equivalent to if ($var_to_check==$value_against)
                  case $value_against:
                      ...
                      if ($something_wrong) { break; } // early exit from if
                      ...
                      break; // regular break
                  default: // equivalent to else
                      ...
              } // end of switch (or if)
              ... // after the tests
              

              它仅适用于单次测试检查。具有处理一堆 else if 的优势。

              【讨论】:

                【解决方案11】:

                只需将 IF 替换为 WHILE 并在新 while 语句的末尾以及中间的任何位置添加 break;

                【讨论】:

                  【解决方案12】:

                  您可以为 IF 块的 contains 创建一个函数。 例如

                  if($bla): 
                    doSomething();
                  endif;
                  

                  然后你可以简单地使用 RETURN

                  function doSomething() {
                      $bla = get_bla();
                      if(empty($bla)) return;
                      do($bla);
                  }
                  

                  它看起来比乘以 IF 语句更清晰

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-03-06
                    • 2011-01-05
                    • 1970-01-01
                    • 2015-12-08
                    • 2011-12-04
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多