我只是因为假设了以下几点而被咬了:
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的说法
为了继续,switch语句被视为循环结构。
对于PHP语言设计者来说,这种选择是有原因的吗?据我所知,switch
不是一个循环控制结构,那么在这种情况下为什么要把它当作一个循环控制结构呢?
发布于 2012-01-27 04:38:35
我认为你不会为这种行为找到任何真正的“理由”。
这种行为背后唯一的真正动机可能是,将switch
作为循环结构来实现,允许PHP重用循环的现有break
和continue
语义,而不是为switch
重新实现特殊版本。
或者更积极的说法是:这是为了一致性。
发布于 2012-01-27 04:28:20
我能想到的最好的解释是PHP认为它是一个循环结构,所以它适合使用continue
和break
的模型。除了以下内容之外,switch
文档并没有对其进行更深入的说明
请注意,与某些其他语言不同,continue语句适用于switch,其作用类似于break。如果在循环中有一个switch,并且希望继续执行外部循环的下一次迭代,请使用continue 2。
因此,这可能是因为,就像循环一样,它会停止其结构中其余代码的执行。
但是,当您使用多个级别时,这两个级别的行为完全不同:
没有level的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
具有level的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
没有level的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
具有level的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
发布于 2012-01-27 23:29:04
据我所知,switch
不是一个循环控制结构,所以在这种情况下,为什么要把它当作一个循环控制结构呢?
一次迭代不符合循环的要求吗?这同样适用于foreach
中的while
,例如,它只迭代一次:
foreach (range(1,2) as $value)
{
$i = 0;
while (!$i++)
{
continue;
}
echo $value, "\n";
}
它也会回显这些值,而不是continue
foreach
循环;它与while
相关。
如果您的期望是switch
类似于if
(事实并非如此),那么您可能不会期望continue
的行为,但是我非常确定对于while
,您会期望它。
但是,如果您真的认为if
类似于switch
,那么break
与continue
的工作方式有什么不同呢
所以我不会说它有那么大的混乱,只是switch
是一个控制结构,有一个循环的衣服。由于我们通常使用break
(您期望它会工作),所以continue
的行为并不是那么广为人知。仅此而已。或者,为什么期望continue
不像switch
中的break
那样工作
因此,原因可能是让break
和continue
对齐。
https://stackoverflow.com/questions/9024271
复制相似问题