我有点假设以下内容:
foreach ($arr as $key => $value) {
switch($key) {
// ... some other cases
default:
continue;
// ^== assumption: move on to the next iteration of the foreach
// actual PHP: treat this continue just like a break
}
// ...
}
但事实上,根据documentation for continue:
为了 continue 的目的,switch语句被认为是一个循环结构。
PHP语言设计者有这个选择的理由吗?据我所知,switch
不是一个循环控制结构,所以为什么在这种情况下将其视为一个呢?
答案 0 :(得分:7)
我能想到的最佳解释是PHP认为它是一个循环结构,因此它适合使用continue
和break
的模型。 switch
文档除了
请注意,与其他一些语言不同,continue语句适用于switch和类似break的行为。如果循环中有一个开关并希望继续下一次外循环迭代,请使用continue 2.
所以也许是因为,就像循环一样,它会停止在其结构中执行其余代码。
但是,当您使用多个级别时,这两个级别的行为完全不同:
continue
没有等级
<?php
for($i=0;$i<5;$i++) {
switch($i) {
case 2:
continue;
default:
echo $i, "\n";
}
echo "Finished with {$i}\n";
}
//0
//Finished with 0
//1
//Finished with 1
//Finished with 2
//3
//Finished with 3
//4
//Finished with 4
continue
级别
<?php
for($i=0;$i<5;$i++) {
switch($i) {
case 2:
continue 2;
default:
echo $i, "\n";
}
echo "Finished with {$i}\n";
}
//0
//Finished with 0
//1
//Finished with 1
//3
//Finished with 3
//4
//Finished with 4
break
没有等级
<?php
for($i=0;$i<5;$i++) {
switch($i) {
case 2:
break;
default:
echo $i, "\n";
}
echo "Finished with {$i}\n";
}
//0
//Finished with 0
//1
//Finished with 1
//Finished with 2
//3
//Finished with 3
//4
//Finished with 4
break
级别
<?php
for($i=0;$i<5;$i++) {
switch($i) {
case 2:
break 2;
default:
echo $i, "\n";
}
echo "Finished with {$i}\n";
}
//0
//Finished with 0
//1
//Finished with 1
答案 1 :(得分:3)
我认为你不会发现这种行为有任何真正的“原因”。
这种行为背后唯一真正的动机可能是实现switch
就好像它是一个循环结构,允许PHP重用循环的现有break
和continue
语义,而不是重新实现一个特殊的switch
的版本。
或者更积极地说出来:这是为了保持一致。
答案 2 :(得分:-2)
据我所知,
switch
不是循环控制结构,为什么在这种情况下将其视为一个?
一次迭代不符合循环条件吗?同样适用于while
内的foreach
,例如只迭代一次:
foreach (range(1,2) as $value)
{
$i = 0;
while (!$i++)
{
continue;
}
echo $value, "\n";
}
它确实回显了值而不是continue
foreach
循环;它与while
。
如果您希望switch
与if
相似(不是continue
,那么您可能不会期望while
的行为,但我非常肯定{ {1}}你期待它。
但如果你真的认为if
与switch
类似,那么break
的工作方式与continue
的工作方式有何不同?
所以我不会说它有那么多乱序,只是switch
是一个控制结构,有一个循环的衣服。正如我们通常使用break
(您期望工作),continue
的行为并不是众所周知的。就这样。或者,为什么您希望continue
在break
中不能像switch
一样工作?
因此可能的原因是break
和continue
对齐。