重新启动if else构造

时间:2013-02-01 00:43:42

标签: php

我们来看看以下代码:

if ($a == 1) {
    echo "this is stage 1";
} 
else if ($a == 2) {
    echo "this is stage 2";
}
else if ($a == 3) {
    $a = 1;
    // at this point I want something that restarts the if-else construct so
    // that the output will be "this is stage 1"
}

我正在研究一个if else构造,让我们说我有三个阶段,if-else构造检查我在哪个阶段。

现在碰巧第3阶段的某些活动导致跳回到第1阶段。现在我已经传递了第一阶段的代码,这就是为什么我想以某种方式重新启动if-else结构。有没有办法做到这一点?更重要的是:有没有更好的方法来做我想要的?因为我的想法似乎不是好的做法。

6 个答案:

答案 0 :(得分:2)

你是对的,这是一种不好的做法。

您要求goto

示例:

<?php
goto a;
echo 'Foo';

a:
echo 'Bar';

以上内容永远不会输出Foo&#39;

如果没有准确了解您尝试做的事情,建议使用更好的方法很困难,但请考虑转换。

switch ($a) {

 case 3:
    // Execute 3 stuff
    // No break so it'll continue to 1
 case 1:
   // Execute 1 stuff
   break // Don't go any further
 case 2:
    // 2 stuff
    break; 


}

这可能不是你想要的。

您可能只想将代码抽象为函数,并在必要时多次调用它们。

答案 1 :(得分:2)

如果你已经完成了,你可以在你的if周围放一个无限循环

while (1) {
    if ($a == 1) {
        echo "this is stage 1";
        break;
    } 
    else if ($a == 2) {
        echo "this is stage 2";
        break;
    }
    else if ($a == 3) {
        $a = 1;
    }
    else {
        break;
    }
}

也许您想查看Wikipedia - Finite-state machine和此问题PHP state machine framework

答案 2 :(得分:1)

简短的回答是肯定的,有一种方法,但对你的第二个问题,更好的答案是肯定的。

至少,可以从函数中的多个位置调用代码。例如,

function stageOneCode() {
    //do stuff;
}

等。我会为每个阶段推荐一个功能,但是如果没有真正看到阶段中正在执行的内容,很难提出建议。

无论如何,在你的第三阶段功能结束时,只需调用你的第一阶段功能。

答案 3 :(得分:0)

递归函数对此有帮助(但如果它总是恢复为1则可能是矫枉过正的)

function echo_stage($stage) {
    if ($a == 1) {
        return "this is stage 1";
    } 
    else if ($a == 2) {
        return "this is stage 2";
    }
    return echo_stage(1);
}

echo echo_stage(5);

或者:

switch ($number)
{
    case 2 :
        echo "this is stage 2";
        break;
    case 1:
     default:
        echo "this is stage 1"
}

答案 4 :(得分:0)

使用switch()。你可以有一个&#34;默认&#34;案件以及具体案件。

答案 5 :(得分:0)

循环是您要搜索的内容:

// initialize $a 
$a = 1;

// the while loop will return endless
while (true);

    // if you want to break for any reason use the 
    // break statement:

    // if ($whatever) {
    //    break;
    // }

    if ($a == 1) {
        echo "this is stage 1";
    }
    else if ($a == 2) {
        echo "this is stage 2";
    }
    else if ($a == 3) {
        $a = 1;
        // continue will go back to the head 
        // of the loop (step 1) early:
        continue;
    }

    // don't forget to increment $a in every loop
    $a++;
}