2009-08-06 3 views
14

Я протестировал это, и он отлично работает, но он выглядит ... странным ... для меня. Должен ли я быть обеспокоен тем, что это нестандартная форма, которая будет удалена в будущей версии PHP или что она может перестать работать? Я всегда имел дело по умолчанию в качестве последнего случая, не как первый случай ...default как первый вариант в инструкции switch?

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... 

(В случае, если это не очевидно, что я пытаюсь сделать, это обеспечить $ рода является действительным, следовательно, default: case. Но коммутатор также выполняет некоторые операции, а затем после него переключается $ kind. Именно поэтому значение по умолчанию: проваливается в первый случай, а также устанавливает $ kind)

Предложения? Является ли этот нормальный/действительный синтаксис?

+0

Также хотел упомянуть - я * не * PHP noob. Я просто хотел получить мнение других экспертов PHP – Josh

+0

Я лично это делаю, потому что опция по умолчанию является первой опцией в форме, если они ничего не выбирают, поэтому будет проще читать параметры в порядке ...с первым по умолчанию. Я просто подошел к этому вопросу, чтобы подтвердить, что он сработает. –

+4

В программировании, когда мы находим необходимость решить проблему в _unconventional_ way, лучше всего оставить комментарий выше переключателя, чтобы объяснить, почему вы написали его так, как вы это делали. –

ответ

21

Это необычная идиома, это вызывает небольшую паузу, когда вы читаете ее, да?». Это работает, но большинство людей, вероятно, ожидать, чтобы найти дело по умолчанию в конце:

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; 

} 
+0

Я согласен, и каждый другой переключатель, который я когда-либо писал за 10 лет программирования, был таким. Но в этом случае *, если я пишу это так, мне нужны два оператора switch. – Josh

+2

Хорошо, я беру это обратно. Мне нужно: case 'kind1': default: $ kind = 'kind1'; – Josh

+0

+1 Это, безусловно, более приятная форма. –

2

Общей практикой является определение опции по умолчанию в качестве последней опции. Но я не вижу ничего плохого в вашем решении (если в вашей компании нет предопределенной схемы, как разложить свой код)

+0

Круто спасибо. Будучи ведущим разработчиком моей компании, я могу установить приоритет :-) (еще одна причина, по которой я хочу получить мнение других, прежде чем выбирать мой путь). – Josh

+0

Затем вы должны установить стандарт по умолчанию в качестве последнего параметра в инструкции switch. Я выгляжу «нормальным» для большинства программистов. –

+0

И так как каждый другой оператор switch в коде является таким образом, я согласен. Благодаря! – Josh

2

Вида меня приступ боли в первом, но это только потому, что мы не используем, чтобы видеть вещи таким образом.

Я предлагаю вам документально подтвердить это, так как некоторые могут назвать этот «хитрый» код. Noob или какой-то будущий сопровождающий может прийти и переместить его на дно, где они будут более комфортно с ним и сломать побочный эффект, который находится наверху.

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; 

} 
+0

Спасибо, вот что я решил сделать. Я принял ответ Павла, хотя он был первым. Но +1 для вас :-) – Josh

+0

сегодня слишком медленно! – Mez

+0

Да, это случается со мной все время - это отстой! Извините :-) – Josh

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

Сначала я сомневался, что 'default:' заставляет PHP игнорировать остальную часть утверждения, но это действительно работает! – cvsguimaraes

4

Это выглядит странно, по той же причине, что

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

будет выглядеть странно, если бы они были действительными. Если бы по этой причине я бы избегал этого.

Кроме того, вы знаете, что каждый раз, когда вы вы показываете код кому-то, вам нужно будет объяснить, что сначала положить default случай был преднамеренным; это обычно признак того, что это не очень хорошая идея.

+1

Клянусь, я пожал плечами. Сначала я не знал, что было странно, иначе сначала или 1 == 1 ... +1 за то, что просто заставило меня пойти 'wtf?' – Khez

9

В случае, если кто-нибудь найти эту страницу через Google, как я сделал:

мне было интересно, то же самое, как Джош - так ... Одно стандарты, которые я думаю, что мы все должны стараться придерживаться слишком , но еще одна вещь - взломать (в: exploit-every-possible kinda way).

Хотя это уродливое/странное/не нормальное - это возможно, и ИМХО может быть полезным в некоторых редких случаях ...

Рассмотрим следующий пример:

$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"; или любой другой определенных случаях , он просто напечатает цвет.

Он знает, что это не лучший пример, но вы поняли смысл;) Надеюсь, это поможет кому-то.

+0

+1 за то, что дал мне другой значок популярного вопроса ;-) – Josh

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 
} 

Вы можете добавить дополнительный «если», или умный «или» сделать $step по умолчанию для 'step1', прежде чем начать переключатель, но это только дополнительный код, снижая читаемость.

+0

это, потому что по умолчанию сначала полезно, если вы хотите, чтобы по умолчанию был по умолчанию первый случай, и вы чувствуете, что имеет смысл сначала поставить первый случай, а не последний ... например, когда они нумеруются следующим образом. – Andrew

1

Другие ответы дают хорошие примеры этого, просто констатирую для ясности ...

падежа (в том числе по умолчанию) не прекращает выполнение в его конце, если не включать в себя перерыв. Хотя переключатель часто сравнивается с последовательностью if elseif elseif и т. Д., Однако это не совсем так.

Короткая версия: SWITCH/СЛУЧАЙ действует только как IF/ELSE/ELSEIF если включить перерывы после каждого случая. SWITCH/CASE больше похожа на серию операторов «if», где каждая имеет одну и ту же проверку переменных с другим значением, которое проверяется.

Длинная версия: Без включения перерыва каждый случай «начинается здесь», а различия во многих отношениях приближают его к GOTO без недостатков. Технически, если вы действительно ДЕЙСТВИТЕЛЬНО хотели (читайте, были мазохистским кодером, который хотел действительно испытать себя), вы могли бы писать практически любые процедурные программы, используя только один внешний массив, цикл цикла и встроенный в него переключатель.

Серьезно, почему вы хотели бы сделать это, я умудряюсь, но на самом деле это демонстрирует, насколько далеко может измениться режим/case от шаблонов if/elseif, поэтому он здесь для вас по академическим причинам (но не делайте этого!) ...

$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 ... , но если вы это сделаете, и у меня есть чтобы отлаживать ваш код позже, после того, как вы написали все это так ... Май Линус Торвальдс милосердие к вашей душе.

+1

Я не понимаю, почему это было приостановлено. Я просто хотел немного разъяснить функциональность. – liljoshu

Смежные вопросы