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

时间:2009-08-06 21:45:07

标签: php syntax switch-statement

我已经测试了它并且它工作正常,但它看起来......很奇怪......对我而言。我是否应该担心这是非标准格式,将在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)

连连呢?这是正常/有效的语法吗?

9 个答案:

答案 0 :(得分:22)

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

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;

}

答案 1 :(得分:9)

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

我和Josh一样想知道 - 所以...... 有一件事是标准,我认为我们都应该更加努力地坚持,但另一件事是黑客攻击(在:利用每种可能性的方式)。

虽然它很丑/很奇怪/不正常 - 这是可能的,恕我直言可能在一些罕见的情况下有用......

请考虑以下事项:

$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 = "greenish";代码将打印

  

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

如果$color = "green";或任何其他定义的情况,它只会打印颜色。

它知道这不是最好的例子,但你明白了;) 希望它对某人有所帮助。

答案 2 :(得分:4)

这就是我可能会这样做的方式......它很容易实现并保持功能。

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

答案 3 :(得分:4)

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

此外,你知道每次你向某人展示代码时,你将不得不解释将default案件放在第一位是故意的;这通常表明这不是一个好主意。

答案 4 :(得分:3)

我个人更喜欢做

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;

}

答案 5 :(得分:2)

通常的做法是将默认选项定义为最后一个选项。但我认为您的解决方案没有任何问题(如果贵公司没有预定义架构如何布局代码)

答案 6 :(得分:2)

一开始有点让我烦恼,但那只是因为我们不习惯那样看东西。

我建议您高度记录这一点,因为有些人可能称之为“棘手”的代码。一个菜鸟或一些未来的维护者可能会把它移到底部,在那里他们对它更加舒服并且打破了顶部的副作用。

答案 7 :(得分:2)

这对于流量控制来说非常方便,特别是如果你没有在两种情况下分开。

例如:

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

您可以在开始切换之前添加额外的“if”或“聪明”或“使$step默认为'step1',但这只是额外的代码,降低了可读性。” >

答案 8 :(得分:1)

其他答案给出了很好的例子,只是为了清楚起见......

除非包含中断,否则案例(包括默认值)不会在其结尾处停止执行。虽然开关经常与if elseifif等序列进行比较,但它并不完全相同。

简短版本: SWITCH / CASE仅在IF / ELSEIF / ELSE 中起作用,如果在每种情况后都包含中断。 SWITCH / CASE更像是一系列&#34; if&#34;每个具有相同变量的语句,使用不同的值进行检查。

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

说真的,你为什么要这样做会令我难以置信,但它确实展示了切换/案例与if / elseif模式的偏差有多远,所以出于学术原因它会在这里出现(但不要#39)这样做!)......

$array = [];
$array['masterLoop'] = 1;
$for ($i = 0, $i < $array['masterLoop'], $i++ ){
    switch($array['goto']){
        default: 
        case 1: 
            PRINT: "Welcome to the program";
        case 2: 
            PRINT: "Please make a choice:";
        case 3:
            $array['choice']='';
            // Wait for some input variable and set choice to it.
        case 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

所以......你可以用开关来反映BASIC的时代...... 但是,如果你这样做,我必须在你写完代码之后调试你的代码... May Linus Torvalds怜悯你的灵魂。