Php switch()并更改变量
我有一个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":
$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);
}