Php 是否默认为switch语句中的第一个选项?

Php 是否默认为switch语句中的第一个选项?,php,syntax,switch-statement,Php,Syntax,Switch Statement,我已经测试过了,效果很好,但是看起来。。。奇怪的对我来说。我是否应该担心这是一种非标准形式,它将在未来的PHP版本中被删除,或者它可能会停止工作?我总是有一个默认案例作为最终案例,从来没有作为第一个案例 switch($kind) { default: // The kind wasn't valid, set it to the default $kind = 'kind1'; // and fall through: case

我已经测试过了,效果很好,但是看起来。。。奇怪的对我来说。我是否应该担心这是一种非标准形式,它将在未来的PHP版本中被删除,或者它可能会停止工作?我总是有一个默认案例作为最终案例,从来没有作为第一个案例

switch($kind)
{
    default:
        // The kind wasn't valid, set it to the default
        $kind = 'kind1';
        // and fall through:

    case 'kind1':
        // Do some stuff for kind 1 here
        break;

    case 'kind2':
        // do some stuff for kind2 here
        break;

    // [...]

    case 'kindn':
        // do some stuff for kindn here
        break;

}

// some more stuff that uses $kind here...
(如果不是很明显,我要做的是确保$kind有效,因此默认值为:case。但是开关也会执行一些操作,然后在开关后使用$kind。这就是为什么默认值:会出现在第一个案例中,并且还会设置$kind)


建议?这是正常/有效的语法吗?

通常的做法是将默认选项定义为最后一个选项。但是我认为你的解决方案没有什么问题(如果你的公司没有预定义的模式,如何布局你的代码)

这是一个不寻常的习惯用法,当你阅读它时,它会引起一点停顿,一个“嗯?”。这是可行的,但大多数人可能希望在最后找到默认情况:

switch($kind)
{
    case 'kind2':
        // do some stuff for kind2 here
        break;

    // [...]

    case 'kindn':
        // do some stuff for kindn here
        break;

    case 'kind1':
    default: 
        // Assume kind1
        $kind = 'kind1';

        break;

}

一开始有点让我心痛,但那只是因为我们不习惯这样看待事情


我建议您高度记录这段代码,因为有些人可能会称之为“棘手的”代码。noob或未来的维护人员可能会将其移动到底部,使其更易于使用,并消除顶部的副作用。

我个人更愿意这样做

switch($kind)
{
    case 'kind2':
        // do some stuff for kind2 here
        break;

    // [...]

    case 'kindn':
        // do some stuff for kindn here
        break;

    case 'kind1':
    default:
        $kind = 'kind1'; // Redundant if it's already set as 'kind1', but that doesn't make any difference to the code.
        // Do some stuff for kind 1 here
        break;

}

我可能会这样做。。。它很容易在眼睛上,并保持功能

switch($kind)
{
    case 'kind1': default :
        // Do some stuff for kind 1 here
        break;
    case 'kind2':
        // do some stuff for kind2 here
        break;
    case 'kindn':
        // do some stuff for kindn here
        break;
}

这看起来很奇怪,原因与

else {
   echo "lol";
}
if (1 == 1) {
   echo "bbq";
}
如果它有效的话,看起来会很奇怪。如果仅仅因为这个原因,我会避免它


此外,您知道,每次向某人展示代码时,您都必须解释将
默认值
放在第一位是故意的;这通常表明这不是一个好主意。

如果有人像我一样通过谷歌找到这个页面:

我和Josh在想同样的事情-所以。。。 一件事是标准,我认为我们也应该更努力地遵守标准,但另一件事是黑客攻击(即:以某种方式利用各种可能性)

虽然这很难看/奇怪/不正常-但这是可能的,而且IMHO在一些罕见的情况下可能有用

考虑以下几点:

$color = "greenish";
//$color = "green";

switch($color) {
    default:
        echo "no colors were selected so the color is: ";
    case "red":
        echo "red<br />\n";
        break;
    case "blue":
        echo "blue<br />\n";
        break;
    case "green":
        echo "green<br />\n";
        break;
}
$color=“绿色”;
//$color=“绿色”;
开关($color){
违约:
echo“未选择颜色,因此颜色为:”;
案例“红色”:
回显“红色
\n”; 打破 案例“蓝色”: 回显“蓝色
\n”; 打破 案例“绿色”: 回显“绿色
\n”; 打破 }
如果
$color=“绿色”将打印代码

未选择颜色,因此颜色为红色

而如果
$color=“绿色”
或任何其他已定义的情况下,它将只打印颜色

它知道这不是最好的例子,但你明白了重点;)
希望它能帮助一些人。

这对于流量控制来说非常方便,尤其是在您不需要在两个案例之间切换的情况下

例如:

$step = $_GET['skip_to_step'];
switch($step) {
    default:
    case 'step1':
        // do some stuff for step one
    case 'step2':
        // this follows on from step 1 or you can skip straight to it
}

您可以添加一个额外的“如果”,或一个巧妙的“或”,以使
$step
在启动切换之前默认为
'step1'
,但这只是额外的代码,降低了可读性。

其他答案给出了很好的例子,只是为了清晰起见陈述一下

案例(包括默认案例)不会在结束时停止执行,除非您包含中断。虽然开关经常被比作if-elseif-elseif等的序列,但它并不是这样

简短版本:开关/CASE的作用与IF/ELSEIF/ELSE类似,前提是在每个CASE之后都包含中断。SWITCH/CASE更像是一系列“if”语句,其中每个语句都有相同的变量检查和不同的值

长版本:不包括中断,每个案例都是“从这里开始”,许多方面的差异使它更接近GOTO,而没有缺点。从技术上讲,如果你真的想(阅读,是一个受虐狂的程序员,想要真正挑战自己),你几乎可以用一个外部数组、一个for循环和一个嵌套在里面的开关来编写任何程序

说真的,你为什么要这么做让我感到困惑,但它确实证明了switch/case可以偏离if/elseif模式多远,所以出于学术原因(但不要这么做!)

$array=[];
$array['masterLoop']=1;
$for($i=0,$i<$array['masterLoop'],$i++){
开关($array['goto'])){
违约:
案例1:
打印:“欢迎来到节目”;
案例2:
打印:“请做出选择:”;
案例3:
$array['choice']='';
//等待某个输入变量并将其设置为choice。
案例4:
$array['goto']=$array['choice'];
$array['masterLoop']++;
}
}
这段代码的运行方式(在您设置了捕获和设置选项之后)是

"Welcome to the program. Please make a choice."
<<user inputs 2>>
"Please make a choice."
<<user inputs 1>>
"Welcome to the program. Please make a choice."
<<user inputs 3>>
// program awaits user input
<<user inputs 4>>
// user triggers infinite loop
“欢迎参加该计划。请选择。”
“请做出选择。”
“欢迎参加该计划。请做出选择。”
//程序等待用户输入
//用户触发无限循环
所以。。。您可以使用开关来回溯到基本。。。 但是如果你这样做了,我以后不得不在你这样写代码之后调试你的代码。。。
愿莱纳斯·托瓦尔兹怜悯你的灵魂。

我还想提一句——我不是一个疯子。我只是想得到其他PHP专业人士的意见,我个人这么做是因为默认选项是表单中的第一个选项,如果他们不选择任何内容,那么按照顺序阅读选项会更容易。。。默认值为第一个。我来问这个问题是为了确认它是否有效。在编程中,当我们发现需要以非常规的方式解决问题时,最好在开关上方留下评论,解释您为什么以这种方式编写它。很酷,谢谢。作为我公司的首席开发人员,我
"Welcome to the program. Please make a choice."
<<user inputs 2>>
"Please make a choice."
<<user inputs 1>>
"Welcome to the program. Please make a choice."
<<user inputs 3>>
// program awaits user input
<<user inputs 4>>
// user triggers infinite loop