Вопрос по syntax, switch-statement, 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 действителен, следовательно, default: case. Но коммутатор также выполняет некоторые операции, и после него также используется $ kind. Тот'почему default: возвращается к первому случаю, а также устанавливает $ kind)

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

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

Ваш Ответ

9   ответов
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 игнорировать остальную часть утверждения, но это действительно работает, ребята! kbtzr
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;

}
Спасибо, чтоЭто то, что я решил сделать. Я принял Павлаответ, потому что он был первым. Но +1 для вас :-) Josh
Да, это происходит со мной все время - это отстой! Извини :-) Josh
я слишком медленный сегодня вечером! Mez
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"; код напечатает

цвета не выбраны, поэтому цвет красный

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

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

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

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

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

4

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

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

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

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

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

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

Вы'Вы не пытаетесь установить это как приоритет? тот'собирается заставить любых будущих девчонок съежиться! Mez
почему бы и нет? Я никогда не видел Джошамакет раньше :) и я сделал много php лет назад * г Henrik P. Hessel
Затем вы должны установить стандарт по умолчанию в качестве последнего параметра в инструкции switch. Я смотрюнормальный" большинству программистов. Henrik P. Hessel
И поскольку все остальные операторы switch в коде таковы, я согласен. Спасибо! Josh
Хорошо, спасибо. Как ведущий разработчик моей компании, я могу установить приоритет :-) (еще одна причина, по которой я хочу получить другое »Мнение перед выбором моего пути) Josh
1

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

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

Длинная версия: Без учета перерыва каждый случай является "Начни здесь"и различия во многих отношениях делают его ближе к 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
</user></user></user></user>

Итак ... вы можете использовать переключатели, чтобы вернуться к временам Бейсика ... но если вы это сделаете, и мне придется отлаживать ваш код позже, после того, как вы все так написали ... Пусть Линус Торвальдс помилует вашу душу.

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

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