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

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 这不是一个循环控制结构,所以为什么在这种情况下将其视为一个?

jpr*_*itt 7

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


Nik*_*kiC 3

我认为你不会为这种行为找到任何真正的“原因”。

这种行为背后的唯一真正动机可能是switch像循环结构一样实现允许 PHP 重用现有的循环break语义continue,而不是重新实现switch.

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