为什么“开关”被视为“继续”的循环结构?

2022-08-30 21:20:08

我只是通过假设以下内容得到了一点:

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


答案 1

我能想到的最好的解释是,PHP认为它是一个循环结构,所以它适合使用和的东西的模型。除了continuebreakswitch

请注意,与其他某些语言不同,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

答案 2

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

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

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


推荐