PHP:仅在每次检查变量后运行函数

PHP:仅在每次检查变量后运行函数,php,switch-statement,Php,Switch Statement,我有一系列我想运行的函数。在每个函数的末尾,它要么设置变量TRUE,要么设置变量FALSE。我想做的是,如果变量设置为TRUE,则中断序列 比如说。我有以下资料: $done = false; step1(); // Sets $done to false step2(); // Sets $done to false step3(); // Sets $done to true step4(); // Because step3() set $done to true, I wan't st

我有一系列我想运行的函数。在每个函数的末尾,它要么设置变量TRUE,要么设置变量FALSE。我想做的是,如果变量设置为TRUE,则中断序列

比如说。我有以下资料:

$done = false;

step1(); // Sets $done to false
step2(); // Sets $done to false
step3(); // Sets $done to true
step4(); // Because step3() set $done to true, I wan't step4() to NOT run.
当然,如果step3()返回false,我希望继续运行step4()

我知道我需要使用一段时间、切换和/或休息。我只是不清楚如何设置这个


非常感谢。

我不太清楚,但如果您的函数返回布尔值,您可以尝试:

step1() || step2() || step3() || step4();

运算符
|
仅在第一个操作数为false时计算第二个操作数。

如果需要,可以使用一个简单的
if
语句

$done = false;
$done = step1();  // each function returns true or false
if (!$done)
     {
      $done = step2();
     }
if (!$done)
     {
      $done = step3();
     }
if (!$done)
     {
      $done = step4();
     }

如果有任何错误,请纠正我。

您的问题不是很直截了当,可能与您目前的形式类似

    $done = false;

function step1($done){
    if($done===false){
        //proceed step 2
    }
    else{
        return;
    }
}
function step2($done){
    if($done===false){
        //proceed step 3
    }
    else{
        return;
    }
}
function step3($done){
    if($done===false){
        //proceed step 4
    }
    else{
        return;
    }
}
function step4($done){
    if($done===false){
        //finish
    }
    else{
        return;
    }
}
您可以创建一个包含函数回调的数组,并在
$done
false
且仍有函数要使用时使用它们:

$doFunctions = ['step1', 'step2', ... , 'stepN'];
$done = false;

while (!$done && $doFunctions)
{
    $function = array_shift($doFunctions);
    call_user_func($function);    
}
如图所示,不需要
开关
中断
,因为这里有一个简单的条件

另一种选择是通过将函数包装在闭包中来“使”函数返回某些内容,并将
$done
作为引用(上下文),然后返回:

$done = false;
$call = function ($function) use (&$done) {
    $function();
    return $done;
}

$call('step1')
    || $call('step2') 
    || $call('step3') 
    || $call('step4')
;

这在一定程度上取决于您实际需要实现的目标。

因此,也许我的问题被误解了,但过了一段时间,我意识到,带异常的try/catch块正是我想要的。下面是我最后做的大致情况

首先,我将函数设置为在出现错误时抛出异常

function step1() {
    // do awesome stuff
    if ($errorInStep1) {
        throw new Exception('There was an error in step 1.');
    }
}

function step2() {
    // do awesome stuff
    if ($errorInStep2) {
        throw new Exception('There was an error in step 2.');
    }
}

function step3() {
    // do awesome stuff
    if ($errorInStep3) {
        throw new Exception('There was an error in step 3.');
    }
}

function step4() {
    // do awesome stuff
    if ($errorInStep4) {
        throw new Exception('There was an error in step 4.');
    }
}
因此,如果每个函数中都有错误,脚本将抛出异常

然后我将这些函数包装在一个try/catch块中。脚本将尝试遍历每个语句,如果有东西抛出并出现异常……它将立即停止。太好了

try {
    step1();
    step2();
    step3();
    step4();
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

谢谢@Tassovan,很高兴知道。然而,这不起作用的原因是函数本身不返回任何内容。是否继续需要取决于外部变量。然而,知道这一点……我当然可以调整它,使其像您所展示的那样工作。谢谢,谢谢@Shabeer。这就是我现在运行它的方式。实际应用程序比我在示例中给出的要复杂一些,这使得一系列if语句非常混乱。必须有一个更干净的方法。你可以通过一个函数名数组和一个call\u user\u func循环来改进这个方法。只要做一个
如果
测试,在所需的停止条件下中断循环,
$done==true