it-swarm.cn

有没有办法打破PHP中的if语句?

PHP中是否有任何命令停止执行当前或父if语句,与breakbreak(1)相同,用于switch/loop。例如

$arr=array('a','b');
foreach($arr as $val)
{
  break;
  echo "test";
}

echo "finish";

在上面的代码中PHP将不会echo "test";并将转到echo "finish";

如果我需要这个

$a="test";
if("test"==$a)
{
  break;
  echo "yes"; // I don't want this line or lines after to be executed, without using another if
}
echo "finish";

我想break上面的if语句并停止执行echo "yes";或不再需要执行的代码,可能有或可能没有附加条件,有没有办法做到这一点?

110
Usman

不要担心其他用户的评论,我可以理解你, 有时开发这种“花哨”的东西是必需的 。如果我们可以打破if,那么就不需要很多嵌套ifs,使代码更加干净和美观。

这个示例代码 说明 CERTAINS SITUATIONS如果可以比许多丑陋的嵌套ifs更合适... 如果你没有遇到某种情况并不意味着它不存在

丑陋的代码

if(process_x()) {

    /* do a lot of other things */

    if(process_y()) {

         /* do a lot of other things */

         if(process_z()) {

              /* do a lot of other things */
              /* SUCCESS */

         }
         else {

              clean_all_processes();

         }

    }
    else {

         clean_all_processes();

    }

}
else {

    clean_all_processes();

}

好看的代码

do {

  if( !process_x() )
    { clean_all_processes();  break; }

  /* do a lot of other things */

  if( !process_y() )
    { clean_all_processes();  break; }

  /* do a lot of other things */

  if( !process_z() )
    { clean_all_processes();  break; }

  /* do a lot of other things */
  /* SUCCESS */

} while (0);

正如@NiematojakTomasz所说,使用goto是另一种选择,关于这一点的坏处是你总是需要定义标签(点目标)。

198
AgelessEssence

将代码封装在函数中。您可以随时停止使用return执行函数。

90
Maxim Krizhanovsky

正确的方法:

try{
    if( !process_x() ){
        throw new Exception('process_x failed');
    }

    /* do a lot of other things */

    if( !process_y() ){
        throw new Exception('process_y failed');
    }

    /* do a lot of other things */

    if( !process_z() ){
        throw new Exception('process_z failed');
    }

    /* do a lot of other things */
    /* SUCCESS */
}catch(Exception $ex){
    clean_all_processes();
}

在阅读了一些评论后,我意识到异常处理并不总是对正常的流量控制有意义。对于正常的控制流程,最好使用“If else”:

try{
  if( process_x() && process_y() && process_z() ) {
    // all processes successful
    // do something
  } else {
    //one of the processes failed
    clean_all_processes();
  }
}catch(Exception ex){
  // one of the processes raised an exception
  clean_all_processes();
}

您还可以将过程返回值保存在变量中,然后检查失败/异常块哪个进程失败。

35
user3170963

goto 运算符可用于跳转到程序中的另一个部分。目标点由标签后跟冒号指定,指令以 goto 后跟所需的目标标签。这不是完全无限制的 goto 。目标标签必须位于同一个文件和上下文中,这意味着您不能跳出函数或方法,也不能跳到一个。您也无法跳转到任何类型的循环或切换结构。你可以跳出这些,常用的是使用 goto 代替多级 break ...

15
NiematojakTomasz

因为你可以 中断 退出do/while循环,让我们“”一轮。使用 while(false) 结尾时,条件永远不会成立,并且不再重复。

do
{
    $subjectText = trim(filter_input(INPUT_POST, 'subject'));
    if(!$subjectText)
    {
        $smallInfo = 'Please give a subject.';
        break;
    }

    $messageText = trim(filter_input(INPUT_POST, 'message'));
    if(!$messageText)
    {
        $smallInfo = 'Please supply a message.';
        break;
    }
} while(false);
13
Markus Zeller

使用GOTOcommand。

if(smth) {
   .....
   .....
   .....
   .....
   .....
   goto Area1;
   .....
   .....


}



Area1:
....your code here....

但是,请记住goto不是推荐的做法,因为它会使代码格式异常。

6
T.Todua

你可以使用do-while(false):

    <?php
    do if ($foo)
    {
      // Do something first...

      // Shall we continue with this block, or exit now?
      if ($abort_if_block) break;

      // Continue doing something...

    } while (false);
    ?>

http://php.net/manual/en/control-structures.if.php#90073中所述

5
UltraDEVV

不,没有办法像在循环中一样“破坏”if块.:(
所以把你的测试变成switch

我想知道为什么没有人鼓励你使用 switch语句 since (即使你没有很多测试用例)
你觉得它太冗长吗?

我肯定会在这里找到它

  switch($a){
    case 'test':
        # do stuff here ...
        if(/* Reason why you may break */){
           break; # this will prevent executing "echo 'yes';" statement
        }
        echo 'yes';  # ...           
        break; # As one may already know, we might always have to break at the end of case to prevent executing following cases instructions.
    # default:
        # something else here  ..
        # break;
  }

对我来说,异常是为了引发错误而不是真正控制执行缺陷。
如果您尝试设置的中断行为与意外错误无关,则异常处理不是:/中的正确解决方案。

4
Stphane
$a = 1;

switch($a) {

  case "1":

    if  ($condition1){
      break;
    }

    if  ($condition2){
      break;
    }

    if  ($condition3){
      break;
    }
}

通过这种方式,我得到了我想要的东西。我用一个开关只有一个明确的情况然后使用break以便选择条件。我使用break:condition1和condition2的原因可能都满足,在这种情况下只应用condition1。根据顺序选择.IF。

3
user3530437

没有。

但是怎么样:

$a="test";
if("test"==$a)
{
  if ($someOtherCondition)
  {
    echo "yes";
  }
}
echo "finish";
1
Oliver Charlesworth

只需将不应执行的代码移动到else/elseif分支。我真的不明白你为什么要做你想做的事情。

1
Mchl

简单的答案是,不,没有办法在没有完全停止执行的情况下从if语句中断(通过exit)。其他解决方案对我不起作用,因为我无法更改if语句的结构,因为我将代码注入插件,如下所示:

if ( condition ) {
  // Code and variables I want to use

  // Code I have control over

  // Code I don't want to run
}
// More code I want to use
1
David
$arr=array('test','go for it');
$a='test';
foreach($arr as $val){
  $output = 'test';
  if($val === $a) $output = "";
  echo $output;
}
echo "finish";

结合你的陈述,我想这会给你你希望的结果。干净简单,没有太多陈述。

对于丑陋和美观的代码,我的重新定位将是:

function myfunction(){
  if( !process_x() || !process_y() || !process_z()) {
    clean_all_processes();  
    return; 
  }
/*do all the stuff you need to do*/
}

正常代码中的某个地方

myfunction();
0
Arthur Kielbasa

回答你的问题是否可以实现,然后是可以使用php的“goto”运算符实现的。

但从道德上讲,使用“goto”并不需要使用goto是一个好的做法,这意味着需要重构代码,以便可以删除goto的要求。

根据您在上面发布的示例代码,可以清楚地看到代码可以重建,不再需要的代码可以删除或注释(如果将来有可能使用)。

0
Sandeep Garg