Ответ 1
К сожалению, continue
и break
используются при switch
при использовании switch
.
Не позволяйте PHP
разрушать ваши впечатления на других языках и продолжайте использовать continue
, где вам это нужно!
Я заметил, что вы действительно можете использовать ключевое слово 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
*/
С++ работает как ожидалось (переход к концу цикла 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
используются при switch
при использовании switch
.
Не позволяйте PHP
разрушать ваши впечатления на других языках и продолжайте использовать continue
, где вам это нужно!
Попробуйте использовать continue 2
, чтобы продолжить следующую итерацию цикла, окружающего оператор switch.
EDIT:
$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 считается структурой цикла для continue.
Вы должны знать, что разные языки дают одни и те же ключевые слова тонко разные значения и не предполагают, что PHP continue
ведет себя так же, как С++ continue
.
Если continue
имеет смысл в PHP switch
, где он не будет работать на С++, используйте его.
Если continue
имеет смысл в С++ switch
, где он не будет работать в PHP, используйте его.
Использование продолжения внутри конструкции С++ switch / case
, встроенной в цикл, отлично. Вы не должны ограничивать свой стиль на С++ только из-за неправильного поведения, происходящего на других языках программирования.
В C и С++ оператор switch
представляет собой лишь причудливую комбинацию if/else if
и меток /goto
, поэтому использование continue
внутри switch
в порядке. Но, как вы заметили, он не делает то, что вы ожидаете от него, на других языках, похожих на C или С++. Это потому, что они похожи только на синтаксис, для семантических правил они очень разные звери. Так что вещь, которая работает на одном языке, определенно не будет работать в другом, даже если языки выглядят одинаково.
Важно отметить, что continue
и break
не ведут себя одинаково, если оператор switch
вложен в цикл. Если вы используете оператор switch
для оценки чего-либо и хотите перейти к следующему элементу цикла, если условие выполнено, вы должны использовать continue 2
. Использование break 2
в этом случае вырвется из всего цикла for
, что может не быть желаемым действием.
Как указано в Руководство PHP:
"Обратите внимание, что в PHP оператор switch считается структурой циклов для продолжения."
Таким образом, использование continue выйдет из оператора switch, а не цикла for. Опасности принятия аналогичного синтаксиса на разных языках.