首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有办法中断PHP中的if语句?

有没有办法中断PHP中的if语句?
EN

Stack Overflow用户
提问于 2011-09-19 17:29:19
回答 21查看 184.6K关注 0票数 149

在PHP中有没有什么命令可以停止执行当前或父if语句,就像breakbreak(1)中的switch/loop一样。例如

代码语言:javascript
复制
$arr=array('a','b');
foreach($arr as $val)
{
  break;
  echo "test";
}

echo "finish";

在上面的代码中,PHP不会执行echo "test";,而是转到echo "finish";

我需要这个如果

代码语言:javascript
复制
$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";或这样的代码,这些代码不再需要执行,可能有也可能没有附加条件,有没有办法这样做?

更新:在发布这个问题仅仅两年后,我长大了,我学会了如何以小块的形式编写代码,为什么嵌套的if可能是一种代码气味,以及如何通过编写可管理的小函数来避免此类问题。

EN

回答 21

Stack Overflow用户

发布于 2011-11-15 09:30:34

不要担心其他用户的评论,我可以理解你,有时在开发这种“花哨”的东西时都需要。如果我们能打破一个if,那么很多嵌套的If就不再是必要的了,这使得代码更加整洁和美观。

这个示例代码演示了,在某些情况下,被破坏的if可能比许多丑陋的嵌套if更合适……如果你没有面对过这种情况,并不意味着它不存在。

丑陋的代码

代码语言:javascript
复制
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();

}

好看的代码

代码语言:javascript
复制
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是一种替代方案,不好的是你总是需要定义标签(点目标)。

票数 235
EN

Stack Overflow用户

发布于 2011-09-19 17:31:38

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

票数 105
EN

Stack Overflow用户

发布于 2014-01-08 06:18:54

正确的方法是:

代码语言:javascript
复制
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":

代码语言:javascript
复制
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();
}

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

票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7468836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档