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

时间:2011-09-19 09:29:19

标签: php

PHP中是否有任何命令停止执行当前或父if语句,与break / break(1)的{​​{1}}或switch相同。例如

loop

在上面的代码中,PHP不会$arr=array('a','b'); foreach($arr as $val) { break; echo "test"; } echo "finish"; ,而是会转到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或不再需要执行的代码,可能有或没有附加条件,有没有办法做到这一点?

21 个答案:

答案 0 :(得分:198)

不要担心其他用户的评论,我能理解你,有时开发这种“花哨”的东西是必需的。如果我们可以打破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是另一种选择,关于这一点的坏处是你总是需要定义标签(点目标)。

答案 1 :(得分:90)

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

答案 2 :(得分:35)

正确的方法:

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();
}

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

答案 3 :(得分:15)

goto

  

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

答案 4 :(得分:13)

因为你可以打破摆脱do / while循环,让我们" "一轮。最后使用 while(false),条件永远不会成立,也不会重复。

getSession(false)

答案 5 :(得分:6)

使用 GOTO 命令。

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


}



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

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

答案 6 :(得分:5)

您可以使用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

中所述

答案 7 :(得分:4)

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

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

我肯定会在这里找到它

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

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

答案 8 :(得分:3)

$a = 1;

switch($a) {

  case "1":

    if  ($condition1){
      break;
    }

    if  ($condition2){
      break;
    }

    if  ($condition3){
      break;
    }
}

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

答案 9 :(得分:1)

没有

但是如何:

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

答案 10 :(得分:1)

简单的答案是,不,没有办法在没有完全停止执行的情况下从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

答案 11 :(得分:1)

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

答案 12 :(得分:0)

回答你的问题是否可以实现,那么可以使用&#34; goto&#34; php的运营商。

但从道德上讲,使用&#34; goto&#34;这不是一个好习惯。并且有任何需要使用goto然后这意味着需要重建代码,以便可以删除goto的要求。

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

答案 13 :(得分:0)

$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();

答案 14 :(得分:-1)

我有一个简单的解决方案,没有很多变化。 最初的陈述是

  

我想打破上面的if语句并停止执行echo&#34; yes&#34 ;;或者这些不再需要执行的代码,可能有或没有附加条件,是否有办法做到这一点?

所以,看起来很简单。试试这样的代码。

$a="test";
if("test"==$a)
{
  if (1==0){
      echo "yes"; // this line while never be executed. 
      // and can be reexecuted simply by changing if (1==0) to if (1==1) 
  }
}
echo "finish";

如果你想在没有这个代码的情况下尝试,那很简单。你可以随时回来。另一种解决方案是评论块。 或者只是思考并尝试另一个单独的代码并复制粘贴只在最终代码中的结果。 如果代码不再是必要的,在您的情况下,结果可以是

$a="test";
echo "finish";

使用此代码,原始语句完全受到尊重.. :) 而且更具可读性!

答案 15 :(得分:-1)

您可以使用语句'die'例如

<?php
if (condition)
{
statements;
die;
}
?>

在这种情况下,您要执行的操作在逻辑上没有意义。

答案 16 :(得分:-2)

简单的解决方案是将其评论出来。

$a="test";
if("test"==$a)
{

  //echo "yes"; //no longer needed - 7/7/2014 - updateded bla bla to do foo
}

额外的好处是您不会更改原始代码,您可以对其进行约会,初始化并说明原因。

为什么投票结果,根据OP请求,我认为这是一个非常有效的解决方案。

&#34;我想[打破上面的if语句并且]停止执行echo&#34; yes&#34 ;;或者不再需要执行的代码,可能有或可能没有附加条件,是否有办法做到这一点?&#34;

事实上有人可以看一些其他的解决方案,一年后,并想知道那里发生了什么。根据我的建议,可以留下好的文档供将来参考,这总是很好的做法。

答案 17 :(得分:-3)

要完全停止脚本的其余部分,您可以执行

出口; //代替休息。其余代码将不会执行

答案 18 :(得分:-3)

我迟到了,但我想做出贡献。我很惊讶没有人建议exit()。这对测试很有帮助。我一直使用它并且像魅力一样工作。

$a ='';
$b ='';
if($a == $b){
echo 'Clark Kent is Superman';
exit();
echo 'Clark Kent was never Superman';
}

代码将停在exit(),之后的所有内容都将无法运行。

<强>结果

Clark Kent is Superman

它也适用于foreach()while()。它适用于你真正放置的任何地方。

foreach($arr as $val)
{
  exit();
  echo "test";
}

echo "finish";

<强>结果

nothing gets printed here.

将其与forloop()

一起使用
for ($x = 2; $x < 12; $x++) {
    echo "Gru has $x minions <br>";
    if($x == 4){
    exit();
    }
}

<强>结果

Gru has 2 minions
Gru has 3 minions
Gru has 4 minions

在正常情况下

$a ='Make hot chocolate great again!';
echo $a;
exit();
$b = 'I eat chocolate and make Charlie at the Factory pay for it.';

<强>结果

Make hot chocolate great again!

答案 19 :(得分:-4)

使用三元运算符怎么样?

<?php
 // Example usage for: Ternary Operator
 $action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
?>

这与if / else语句相同:

<?php
 if (empty($_POST['action'])) {
   $action = 'default';
 } else {
   $action = $_POST['action'];
 }
?>

答案 20 :(得分:-6)

$a="test";
if("test"!=$a)
{
echo "yes";                   
}
 else
 {
  echo "finish";
}