jch*_*hes 19 php loops switch-statement
假设以下内容,我得到了一点:
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
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
但实际上,根据继续的文档:
为了继续,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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我认为你不会为这种行为找到任何真正的“原因”。
这种行为背后的唯一真正动机可能是switch像循环结构一样实现允许 PHP 重用现有的循环break语义continue,而不是重新实现switch.
或者更积极地说:这是为了一致性。