代码之家  ›  专栏  ›  技术社区  ›  Josh Andreas Rehm

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

  •  21
  • Josh Andreas Rehm  · 技术社区  · 16 年前

    我已经测试过了,它工作得很好,但看起来很好。…奇怪。..对我来说。我是否应该担心这是非标准表单,会在未来的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有效,因此使用default:case。但开关也会执行一些操作,然后在开关后也会使用$kind。这就是为什么default:会遇到第一个情况,也会设置$kind)

    9 回复  |  直到 14 年前
        1
  •  21
  •   Jonathan Day    13 年前

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

    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;
    
    }
    
        2
  •  9
  •   Dan Larsen    14 年前

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

    一件事是标准,我认为我们也应该更加努力地遵守标准,但另一件事就是黑客攻击(以某种方式:利用每一种可能性)。

    $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";

    希望它能帮助别人。

        3
  •  4
  •   Frankie    16 年前

    出于同样的原因,这看起来很奇怪

    else {
       echo "lol";
    }
    if (1 == 1) {
       echo "bbq";
    }
    

    此外,你知道 default 第一个案件是故意的;这通常表明这不是一个好主意。

        4
  •  4
  •   Lightness Races in Orbit    14 年前

    这就是我可能会做的……它很容易上手,并且保持了功能。

    switch($kind)
    {
        default :
        case 'kind1': 
            $kind = "kind1";
            // Do stuff for kind 1 
            break;
    
        case 'kind2':
            // do stuff for kind2 
            break;
    
        case 'kindn':
            // do stuff for kindn 
            break;
    }
    
        5
  •  3
  •   Mez    16 年前

    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;
    
    }
    
        6
  •  2
  •   Henrik P. Hessel    16 年前

    例如:

    $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' 在启动开关之前,但这只是额外的代码,降低了可读性。

        7
  •  2
  •   Justin Johnson    16 年前

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

        8
  •  2
  •   DanielM Onshop    12 年前

    起初我有点刺痛,但那只是因为我们不习惯这样看待事物。

    我建议你高度重视这一点,因为有些人可能会称之为“棘手”的代码。一个新手或一些未来的维护者可能会出现,并将其移动到底部,在那里他们会更舒服,并打破顶部的副作用。

        9
  •  1
  •   lilHar    8 年前

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

    简短版本: 每个案例后都有休息时间。SWITCH/CASE更像是一系列“if”语句,其中每个语句都有相同的变量检查,但检查的值不同。

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

    $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的时代。.. 但如果你这样做,我必须在你写完所有代码后稍后调试你的代码。.. 愿Linus Torvalds怜悯你的灵魂。