-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() を実行したいと思います。

while、switch、および/またはbreakを使用する必要があることはわかっています。これを設定する方法がわかりません。

とても有難い。

4

5 に答える 5

1

私にはあまり明確ではありませんが、関数がブール値を返す場合は、次を試すことができます。

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

演算子||は、最初のオペランドが false の場合にのみ、2 番目のオペランドを評価します。

于 2012-10-01T04:35:47.077 に答える
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 に答える
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

私の質問が誤解されたのかもしれませんが、しばらくすると、例外のある 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

あなたの質問はあまり単純ではなく、おそらくこれまでのフォームと似ています。

関数のコールバックを使用して配列を作成し、それらを消費することができますが、まだ消費する関数があります$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')
;

それは、実際に何を達成する必要があるかによって少し異なります。

于 2012-10-01T07:50:50.187 に答える