Циклы внутри оператора Switch - PullRequest
1 голос
/ 15 ноября 2009

мой оператор switch имеет около десяти результатов, но некоторым из них требуется 1/2 цикла для проверки, поэтому я не могу написать их в case (условии), поэтому я попытался использовать более одного случая по умолчанию, это возможно

<?php

switch(true) {
case 1:
    break;
case 2:
    break;
default:
    echo "this text is never printed ??";

    while(true) {
        while(true) { // case 3
            break 3;
        }

        break;
    }

    while(true) {
        // case 4
        break 2;
    }
case 5:
    break;
default:
    while(true) {
        // case 6
        break 2;
    }
case 7:
    break;
}

?>

это возможно, поскольку мой первый дефолт вообще не выполняется?!

спасибо

Ответы [ 4 ]

6 голосов
/ 15 ноября 2009

Вы не можете иметь более одного default в операторе switch. Кроме того, default должен находиться в конце switch после всех операторов case.

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

3 голосов
/ 15 ноября 2009

Нет, это невозможно, вы не можете иметь более одного регистра по умолчанию в операторе switch, вам нужно добавить дополнительную логику в один оператор конечного регистра.

при достижении случая по умолчанию фиксируются все условия, поэтому более поздние случаи не оцениваются.

1 голос
/ 15 ноября 2009

В коммутаторе может быть только одно значение по умолчанию. Помните, что Zend не единственное, что анализирует PHP, вы можете запутать другие парсеры, не указав регистр по умолчанию в качестве последней части переключателя.

1 голос
/ 15 ноября 2009

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

EDIT : Кроме того, я не вижу, что вы пытаетесь сделать там. В чем смысл? Не могли бы вы объяснить немного? Возможно, мы сможем помочь вам достичь того, что вы хотите сделать

...