我只是通过假设以下内容得到了比特:
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
}
// ...
}
但事实上,根据文件继续:
为了continue的目的,switch语句被认为是一个循环结构。
PHP语言设计者做出这种选择有什么原因吗?据我所知,switch
不是循环控制结构,那么在这种情况下为什么要把它当作循环控制结构呢?
我能想到的最好的解释是,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
我想你不会为这种行为找到任何真正的"原因"。
这种行为背后唯一真正的动机可能是将switch
实现为循环结构,允许PHP重用循环的现有break
和continue
语义,而不是重新实现switch
的特殊版本。
或者更积极地说:这是为了保持一致性。
据我所知,
switch
不是一个循环控制结构,那么在这种情况下为什么要把它当作一个呢?
一个迭代不符合循环的条件吗?这同样适用于foreach
中的while
,例如只迭代一次:
foreach (range(1,2) as $value)
{
$i = 0;
while (!$i++)
{
continue;
}
echo $value, "'n";
}
它也会在foreach
循环中回显值,而不是continue
;它与while
有关。
如果你的期望是switch
和if
一样(事实并非如此),那么你可能不会期望continue
的行为,但我很确定while
是你期望的。
但如果你真的认为if
和switch
一样,那么break
的工作原理怎么会与continue
不同呢?
所以我不会说它有那么多不正常,只是switch
是一个具有循环衣服的控制结构。由于我们通常使用break
(您期望它工作),所以continue
的行为并不为人所知。仅此而已。或者,为什么您希望continue
在switch
中不能像break
那样工作?
因此,的原因可能是break
和continue
对齐。