-1

我有一系列想要运行的功能。在每个函数结束时,它设置一个变量 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()。

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

非常感激。

4

5 回答 5

1

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

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

||如果第一个操作数为假,则运算符仅评估第二个操作数。

于 2012-10-01T04:35:47.077 回答
0

所以也许我的问题被误解了,但过了一段时间我意识到带有异常的 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";
}
于 2012-12-31T05:03:04.693 回答
0
    $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;
    }
}
于 2012-10-01T04:45:14.157 回答
0

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

您可以创建一个带有函数回调的数组,并在存在时使用它们,$done并且false仍然有要使用的函数:

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

while (!$done && $doFunctions)
{
    $function = array_shift($doFunctions);
    call_user_func($function);    
}

如图所示,不需要switch也不break需要,因为这里有一个简单的条件。

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

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

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

这取决于您实际需要实现的目标。

于 2012-10-01T07:50:50.187 回答
0

如果需要,可以使用简单的if语句来完成。

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

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

于 2012-10-01T04:38:14.510 回答