Php switch()并更改变量

Php switch()并更改变量,php,switch-statement,Php,Switch Statement,我有一个switch语句,它处理变量$action,然后相应地加载数据。然而,让我们说,一个特定的动作是不可能的,并且已经在开关的中间被确定,例如: switch($action) { case "view": if($id) { // perform actions } else { $action = false; } break; case "false":

我有一个switch语句,它处理变量
$action
,然后相应地加载数据。然而,让我们说,一个特定的动作是不可能的,并且已经在开关的中间被确定,例如:

switch($action)
{
    case "view":
     if($id) { 
            // perform actions
        } else {
            $action = false;
        }
    break;
    case "false":
        // perform other actions
    break;
}
问题是我似乎无法做到这一点。一旦switch语句被设置为运动状态,变量似乎被锁定到该实例中


有办法解决这个问题吗?

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

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语句中需要什么以及您正在做什么

例如:

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

}

不过,我同意另一个答案,这似乎会失控。也许重构是更好的解决方案。

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


一般来说,对于读者来说,失败案例和转换并不那么清楚——你必须添加额外的评论,说明这确实是有意的。

对于这样的案例(请原谅双关语),最好的做法是重新考虑你的逻辑

像这样的事情会更清楚

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

function do_view($id)
{
    if ($id)
    {
        do_action_success();
    }
    else
    {
        do_action_false();
    }
}

试着这样做:

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

else
部分中的另一个局部变量如何,它将在
开关的末尾被重新分配给
$action
?请注意,第一类代码(跳过案例中的中断)不是很容易维护,可能会导致细微的错误。@StevenLiao:第二类更糟糕。;-)没有看到您的编辑文本,只有您的初始案例。我想在我开始输入xD之前,我们已经达成了一致。这太疯狂了!我以前从未见过这样的开关。第二个肯定有效吗??我曾尝试使用条件语句在<代码>案例中:,它导致了错误。我也考虑过失败,但我不喜欢它们的不可预测性;如果需要不止一次的失败,它们将不起作用。实际上我非常喜欢这样。我已经从
开关
中删除了
case false:
,并将其放入
if{}
$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);
}