default как первый параметр в инструкции switch?

Я тестировал это, и он отлично работает, но он выглядит … странным … для меня. Должен ли я быть обеспокоен тем, что это нестандартная форма, которая будет удалена в будущей версии 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. Именно поэтому default: попадает в первый случай, а также устанавливает $ 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; } 

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

Мне было интересно то же самое, что и Джош – так … Одна вещь – стандарты, которые, я думаю, мы все должны стараться придерживаться тоже, но еще одна вещь – взломать (в способе: эксплуатировать – всевозможные возможности).

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

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

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

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

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

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

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

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

Я лично предпочел бы

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

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

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

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

Это может быть очень удобно для управления потоком, особенно если вы не нарушаете случаи.

Например:

 $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' перед запуском коммутатора, но это просто дополнительный код, что уменьшает читаемость.

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

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

Короткая версия: SWITCH / CASE действует только как IF / ELSEIF / ELSE, если вы включаете перерывы после каждого случая. 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 … но если вы это сделаете, и мне придется отлаживать ваш код позже, когда вы написали все это так … Пусть Линус Торвальдс пощадит вашу душу.