Должен ли я когда-либо использовать продолжение внутри оператора switch?

Я заметил, что вы действительно можете использовать ключевое слово 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. Опасности предполагать аналогичный синтаксис на разных языках.