Php 为什么为了“continue”的目的,“switch”被视为循环结构?
我只是通过以下假设得到了一些信息:Php 为什么为了“continue”的目的,“switch”被视为循环结构?,php,loops,switch-statement,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
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
}
// ...
}
但事实上,根据
为了继续,switch语句被视为循环结构
PHP语言设计人员选择这个选项有什么原因吗?据我所知,
switch
不是循环控制结构,那么为什么在这种情况下将其视为循环控制结构呢?我能想到的最好解释是PHP将其视为循环结构,因此它适合使用continue
和break
的模型。开关
文档对它的说明仅限于
请注意,与其他一些语言不同,continue语句适用于switch,其作用类似于break。如果循环中有一个开关,并且希望继续到外部循环的下一个迭代,请使用continue 2
所以,这可能是因为,像循环一样,它停止了结构中其余代码的执行
但是,当您使用多个级别时,这两个级别的行为完全不同:
继续
无级别
<?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
<?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
<?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
<?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
无关卡中断
<?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
<?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
<?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
<?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
中,例如只迭代一次:
foreach (range(1,2) as $value)
{
$i = 0;
while (!$i++)
{
continue;
}
echo $value, "\n";
}
它也会回显值,而不是continue
foreach
循环;它与相关,而
如果您的期望是开关
类似于如果
(事实并非如此),那么您可能不会期望的行为继续
,但是我非常肯定在
您期望它的时候
但是如果你真的认为如果就像开关
,那么中断
的工作方式怎么可能不同于继续
所以我不会说它有那么多问题,只是开关是一个控制结构,具有循环的特性。正如我们通常使用的break
(您希望它能工作),continue
的行为并不为人所知。就这些。或者为什么您希望继续
不会像开关中的中断
那样工作
因此,原因可能是将中断
和继续
对齐。在谈论php
;时,应该避免使用“原因”和“设计”这两个词。)您可以使用continue 2
=)@drrcknlsn,开关
需要一致,因为它使用跳出活动块的中断
。顺便说一句,这都是我的猜测。@zzzzBov我们谈论的是continue
,它用于循环结构以跳到下一个迭代。它应该忽略开关
<代码>中断
在这两种情况下都可以,并且应该中断块或循环。将switch
视为循环结构本质上使continue
在本用例中成为break
的同义词。@chesles,如果在块上使用continue
,它将跳出活动块并继续该块的下一次迭代。我可以将switch
视为一个循环结构,只进行一次迭代,这将使continue
的行为与break
相同,完成循环并移出块。我不是在为语言的设计辩护,我只是在猜测我所看到的模式。那么,“他们是懒惰的”?我想这是有意义的:p在循环结束(代码块结束或中断
,继续
或返回
之前,表达式针对每种情况(情况
,默认值
)进行计算。@hakre不是真的。“在switch语句中,只对条件求值一次,并将结果与每个case语句进行比较”-我不确定其一致性,因为它与C中的switch/continue不一致。但是,在PHP源代码中进行了一些修改之后,为了实现continue
的简单性,它看起来确实很有用。由于它与关注开关块的中断
密切相关,继续
也关注它们。我的期望是开关就像一个字符串if
/else if
,除非我弄错了。一些没有开关的语言(例如python)甚至说“使用if/elif代替开关”。那么,switch在PHP中如何不像if呢?“switch语句类似于同一表达式上的一系列if语句。”——@chesles:好吧,酷,这就是我假设的(将switch放在头上就像if一样)——因此类比为break
和continue
。您是否希望它们也能正常工作(与if
和switch
forbreak
和continue
)相同?请参阅我的问题,我在其中描述了我期望的行为。本质上,我希望continue
继续最近循环的下一次迭代,我不希望switch
成为循环,因为它不是循环,尽管PHP出于某种原因将其视为循环。这就是我在这里要找的原因。那么break
呢?您对开关中的中断有什么期望?打破最近的僵局