1

変数を処理する switch ステートメントがあり、それ$actionに応じてデータをロードします。ただし、特定のアクションが不可能であり、切り替えの途中で決定されたとします。たとえば、次のようになります。

switch($action)
{
    case "view":
     if($id) { 
            // perform actions
        } else {
            $action = false;
        }
    break;
    case "false":
        // perform other actions
    break;
}

問題は、それができないように見えることです。switch ステートメントが実行されると、変数はそのインスタンスにロックされているように見えます。

これを回避する方法はありますか?

4

5 に答える 5

1

スイッチステートメント内で実際に何が必要で、何をしているかに応じて、スイッチを関数にラップして何らかの形式の再帰を使用できます。

例えば:

function myFunction($action){
    switch($action)
    {
    case "view": 
        if($id) { 
            // perform actions
        } else {
            myFunction(false);
        }
    break;
    case "false":
        // perform other actions
    break;
    }

}

私は他の答えに同意しますが、これは手に負えなくなりそうです。おそらくリファクタリングがより良い解決策です。

于 2013-09-13T09:13:02.930 に答える
1

そのシナリオでは、スイッチケースの使用は避けます。これらのシナリオを処理するいくつかのメソッドを記述します。
例えば

if(isActionSucessful($action)) //checks if $action == view
   performYourActions($id);    // check if $id is ok, if not then call cleanup;
else
   performCleanupActions() ..;

一般的にケースを通り抜け、切り替えは読者にとってそれほど明確ではありません-それが実際に意図的であるという追加のコメントを付ける必要があります.

于 2013-09-13T09:17:29.967 に答える
1

このようなケース (駄洒落を許してください) のベスト プラクティスは、ロジックを再考することです。

このようなものは、はるかに明確になります。

switch ($action)
{
    case "view":
        do_view($id);
        break;
    case "something_else":
        //...
}

function do_view($id)
{
    if ($id)
    {
        do_action_success();
    }
    else
    {
        do_action_false();
    }
}
于 2013-09-13T09:19:59.320 に答える