Вопрос по switch-statement, syntax, php – по умолчанию в качестве первого варианта в инструкции switch?

14

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

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

Также хотел упомянуть - яnot PHP нуб. Я просто хотел получить других профи PHP & apos; мнения Josh
Я лично делаю это, потому что опция по умолчанию - это первая опция в форме, если они ничего не выбирают, так что будет проще читать опции по порядку ... по умолчанию будет первым. Я просто пришел к этому вопросу, чтобы подтвердить, что он будет работать. Jeff Davis
В программировании, когда мы находим необходимость решить проблему вunconventional Поэтому лучше оставить комментарий над переключателем, чтобы объяснить, почему вы написали его так, как сделали. Charles Addis

Ваш Ответ

9   ответов
1

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

Short version: SWITCH / CASE действует только как IF / ELSEIF / ELSEif Вы включаете перерывы после каждого случая. SWITCH / CASE больше похож на серию «если» операторы, в которых каждый имеет одну и ту же переменную, проверяют с разными значениями, с которыми он проверяется.

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

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

Я не понимаю, почему за это проголосовали. Я просто хотел немного уточнить функциональность.
9

если кто-нибудь найдет эту страницу через 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"; код напечатает

no colors were selected so the color is red

в то время как если$color = "green"; или любые другие определенные случаи, это просто напечатает цвет.

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

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

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

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

4

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

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

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

Клянусь, я пожал плечами. Сначала я не знал, что было более странно, иначе сначала или 1 == 1 ... +1 за то, что заставил меня уйти.wtf?
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' перед запуском коммутатора, но это просто дополнительный код, снижающий читабельность.

это потому, что установка default по умолчанию полезна, если вы хотите использовать default по умолчанию для первого случая, и вы чувствуете, что имеет смысл ставить первый случай первым, а не последним ... например, когда они нумеруются следующим образом.
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;
}
Сначала я сомневался, еслиdefault: заставляет PHP игнорировать остальную часть утверждения, но это действительно работает, ребята!
2

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

И поскольку все остальные операторы switch в коде таковы, я согласен. Спасибо! Josh
почему бы и нет? Я никогда не видел макет Джоша раньше :), и я много раз делал php много лет назад * g
Хорошо, спасибо. Как ведущий разработчик моей компании, я могу установить приоритет :-) (еще одна причина, по которой я хочу получить другие мнения, прежде чем выбрать свой путь) Josh
Затем вы должны установить стандарт по умолчанию в качестве последнего параметра в инструкции switch. Я выгляжу "нормально" большинству программистов.
Вы не пытаетесь установить это в качестве приоритета? это заставит всех будущих девчонок съежиться!
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;

}
Я согласен, и каждый другой переключатель, который я когда-либо писал за свои 10 с лишним лет программирования, был таким. Но в этомone В этом случае, если я напишу это так, мне понадобятся два оператора switch. Josh
Хорошо, я забираю это обратно. Мне нужно: case "kind1": default: $ kind = "kind1"; Josh
+1 Это определенно более приятная форма
Хорошо, извините, я не знаю, как я пропустил это в вашем ответе. Я могу пойти по этому пути только для ясности. Josh
После того, как первоначальная реакция многих людей была такой же, как и у меня, я решил, что так и должно быть. Josh
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;

}
Да, это происходит со мной все время - это отстой! Извини :-) Josh
я слишком медленный сегодня вечером!
Спасибо, это то, что я решил сделать. Я принял ответ Павла, потому что он был первым. Но +1 для вас :-) Josh

Похожие вопросы