为什么`switch`被认为是'continue`的循环结构?

时间:2012-01-26 19:47:07

标签: 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
  }
  // ...
}

但事实上,根据documentation for continue

  

为了 continue 的目的,switch语句被认为是一个循环结构。

PHP语言设计者有这个选择的理由吗?据我所知,switch 不是一个循环控制结构,所以为什么在这种情况下将其视为一个呢?

3 个答案:

答案 0 :(得分:7)

我能想到的最佳解释是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

答案 1 :(得分:3)

我认为你不会发现这种行为有任何真正的“原因”。

这种行为背后唯一真正的动机可能是实现switch就好像它是一个循环结构,允许PHP重用循环的现有breakcontinue语义,而不是重新实现一个特殊的switch的版本。

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

答案 2 :(得分:-2)

  

据我所知,switch不是循环控制结构,为什么在这种情况下将其视为一个?

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

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

它确实回显了值而不是continue foreach循环;它与while

有关

如果您希望switchif相似(不是continue,那么您可能不会期望while的行为,但我非常肯定{ {1}}你期待它。

但如果你真的认为ifswitch类似,那么break的工作方式与continue的工作方式有何不同?

所以我不会说它有那么多乱序,只是switch是一个控制结构,有一个循环的衣服。正如我们通常使用break(您期望工作),continue的行为并不是众所周知的。就这样。或者,为什么您希望continuebreak中不能像switch一样工作?

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