2012-10-01 43 views
-1

我有一系列我想运行的函数。在每个函数结束时,它会设置变量TRUE或FALSE。如果变量设置为TRUE,我想要做的是打破系列。PHP:仅在每次检查变量后运行函数

例如。我有以下几点:

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

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

非常感谢。

回答

1

这不是多少我清楚,但如果你的函数返回布尔值,你可以尝试:

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

运营商||只有当第一个是虚假的评估第二个操作数。

+0

感谢@tassoevan,这是很好的知道。然而,为什么这不起作用的原因是因为函数本身不返回任何东西。持续或不需要依赖于外部变量。然而,知道这一点...我当然可以调整它像你所显示的那样工作。谢谢。 –

0

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

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

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

+0

谢谢@Shabeer。这实际上是我现在运行它的方式。实际的应用程序比我在例子中给出的要复杂一些,这使得一系列的if语句真的很混乱。有一个更清洁的方式。 –

+0

您可以使用一系列函数名称和一个call_user_func循环来改进它。只要把'if'测试突破所需的停止条件,'$做== TRUE'循环。 –

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

你的问题不是非常直截了当,可能类似于迄今为止的形式。

$donefalse且仍有功能消耗你可以创建你的函数回调的数组,并使用它们:

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

这取决于一点什么你实际上需要实现。

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