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
for
break
continue
)相同?请参阅我的问题,我在其中描述了我期望的行为。本质上,我希望
continue
继续最近循环的下一次迭代,我不希望
switch
成为循环,因为它不是循环,尽管PHP出于某种原因将其视为循环。这就是我在这里要找的原因。那么
break
呢?您对
开关中的
中断
有什么期望?打破最近的僵局