Я заметил, что вы действительно можете использовать ключевое слово continue
в инструкции switch, но на PHP он не делает того, что я ожидал.
Если это не удается с PHP, кто знает, сколько других языков он терпит неудачу? Если я много переключаюсь между языками, это может быть проблемой, если код не ведет себя так, как я ожидаю, что он будет себя вести.
Должен ли я просто избегать использования continue
в инструкции switch?
Ошибка PHP (5.2.17):
for($p = 0; $p < 8; $p++){ switch($p){ case 5: print"($p)"; continue; print"*"; // just for testing... break; case 6: print"($p)"; continue; print"*"; break; } print"$p\r\n"; } /* Output: 0 1 2 3 4 (5)5 (6)6 7 */
C ++, похоже, работает как ожидалось (прыгает до конца цикла for):
for(int p = 0; p < 8; p++){ switch(p){ case 5: cout << "(" << p << ")"; continue; cout << "*"; // just for testing... break; case 6: cout << "(" << p << ")"; continue; cout << "*"; break; } cout << p << "\r\n"; } /* Output: 0 1 2 3 4 (5)(6)7 */
К сожалению, continue
и break
на PHP
при использовании операторов switch
.
Не позволяйте PHP
разрушать ваш опыт на других языках и продолжать использовать continue
где оно вам нужно!
Попробуйте использовать continue 2
для продолжения следующей итерации цикла, окружающего оператор switch.
РЕДАКТИРОВАТЬ:
$foo = 'Hello'; for ($p = 0; $p < 8; $p++) { switch($p) { case 3: if ($foo === 'Hello') { echo $foo; break; } else { continue 2; } default: echo "Sleeping...<br>"; continue 2; } echo "World!"; break; }
//This will print: Sleeping... Sleeping... Sleeping... Hello World!
Документация для оператора PHP continue
делает это ясно:
Примечание. Обратите внимание, что в PHP оператор switch считается циклической структурой для целей продолжения .
Вы должны знать, что разные языки дают одни и те же ключевые слова тонко разные значения, а не предполагают, что PHP continue
вести себя так же, как C ++.
Если continue
имеет смысл в PHP- switch
где он не будет работать на C ++, используйте его.
Если continue
имеет смысл в C ++- switch
где он не будет работать на PHP, используйте его.
В C и C ++ оператор switch
является лишь причудливой комбинацией if/else if
и label / goto
, поэтому использование continue
внутри switch
в порядке. Но, как вы заметили, он не делает то, что вы ожидаете от него, на других языках, похожих на C или C ++. Это потому, что они похожи только на синтаксис, поскольку для семантических правил они очень разные звери. Так что вещь, которая работает на одном языке, определенно не будет работать в другом, даже если языки будут похожи.
Использование продолжения внутри конструкции C ++ switch / case
, встроенной в цикл, совершенно нормально. Вы не должны ограничивать свой стиль на C ++ только из-за неправильного поведения, происходящего на других языках программирования.
Важно отметить, что continue
и break
не ведут себя одинаково, когда оператор switch
вложен в цикл. Если вы используете оператор switch
для оценки чего-либо и хотите перейти к следующему элементу в цикле, если условие выполнено, вы должны использовать continue 2
. Использование break 2
в этом случае вырвется из цикла for
for, что может не быть желаемым действием.
Как предупреждается в Руководстве по PHP :
«Обратите внимание, что в PHP оператор switch считается циклической структурой для продолжения».
Таким образом, использование continue будет выходить из оператора switch, а не цикла for. Опасности предполагать аналогичный синтаксис на разных языках.