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

像这样的案例(请原谅双关语)的最佳做法是重新考虑您的逻辑。

这样的事情会更清楚。

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 回答
1

您可以使用某种形式的递归,将开关包装在一个函数中,具体取决于您在 switch 语句中需要什么以及您在做什么。

例如:

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

在那种情况下,我会避免使用 switch case。编写一些处理这些场景的方法。
例如

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 回答
0

不完全是。对于您可能可以使用的特定情况,有一些解决方法,例如

case "view":
    if ($id) {
        // perform actions
        break;
    }
    // intentional fall-through
case "false":
    // other actions
break;

这并不总是有效,因为您只能从单个代码路径切换到另一个代码路径。但是您可以通过使用反向 switch 语句来解决此限制:

switch(true) {
    case $action == 'view' && $id:
        break;
    case $action == 'view' && !$id:
        // intentional fall-through -- but you can now write many of these
    case $action == 'false':
        break;
}

也就是说,这样的代码太不寻常了,不能不受惩罚地编写。当一条直线switch似乎还不够时,我建议退后一步,尝试重构代码,而不是试图强行切换到提交状态。

于 2013-09-13T09:10:37.950 回答
-1

尝试这样的事情:

$action = "view";
$id = false;
callswitch($action,$id);
function callswitch($action,$id){
switch($action)
{
    case "view":
        if($id) { 
            echo 'inside case view';    
            break;
        } else {
            callfunc();                 
            break;
        }       
    case "false":
        echo 'inside case false';
    break;
}
}

function callfunc(){
    $action = "false";
    $id = true;
    callswitch($action,$id);
}
于 2013-09-13T11:03:42.403 回答