为什么为了“继续”的目的,“开关”被认为是一个循环结构


Why is a `switch` considered a looping structure for the purposes of `continue`?

我只是通过假设以下内容得到了比特:

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认为它是一个循环结构,因此它适合使用continuebreak的东西的模型。除了之外,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重用循环的现有breakcontinue语义,而不是重新实现switch的特殊版本。

或者更积极地说:这是为了保持一致性。

据我所知,switch不是一个循环控制结构,那么在这种情况下为什么要把它当作一个呢?

一个迭代不符合循环的条件吗?这同样适用于foreach中的while,例如只迭代一次:

foreach (range(1,2) as $value)
{
    $i = 0;
    while (!$i++)
    {
       continue;
    }
    echo $value, "'n";
}

它也会在foreach循环中回显值,而不是continue;它与while有关。

如果你的期望是switchif一样(事实并非如此),那么你可能不会期望continue的行为,但我很确定while是你期望的。

但如果你真的认为ifswitch一样,那么break的工作原理怎么会与continue不同呢?

所以我不会说它有那么多不正常,只是switch是一个具有循环衣服的控制结构。由于我们通常使用break(您期望它工作),所以continue的行为并不为人所知。仅此而已。或者,为什么您希望continueswitch中不能像break那样工作?

因此,的原因可能是breakcontinue对齐。