0

代码:

switch ($_GET['operation']) {
    case "professionist":
    case "company":
    case "student":
        echo "ok<br>";

    case "professionist":
        echo "inprofessionist<br>";
        break;

    case "company":
        echo "incompany<br>";
        break;

    default:
        echo "Meh!<br>";
        break;
}

我的目标是先执行一些(专业/公司/学生通用的)代码,然后根据操作执行其余代码...

问题是前 3 个案例完美运行,但是,例如,如果操作是“公司”,则切换到“专业人士”案例,我做错了什么?怎样才能改善呢?提前致谢...

4

2 回答 2

3

这就是开关的工作原理。如果您总是需要打印“ok”,请将其移到开关外:

$op = $_GET["operation"];

if (in_array($op, array("professionist", "company"))) {
   echo "ok<br>";
}

switch ($op) {
    case "professionist":
        echo "inprofessionist<br>";
        break;

    case "company":
        echo "incompany<br>";
        break;

    default:
        echo "Meh!<br>";
        break;
}
于 2012-11-27T08:32:55.977 回答
2

只有case具有给定值的第一个才会成为 a 的目标switch。(事实上​​,switch每次执行只处理一个案例 - fallthough 只是让您有多个案例共享一些代码,但其中只有一个是实际触发的。)

因此,拥有多个case具有相同值的 es 是没有意义的——一个switch语句与一系列独立if的 s 不同;它是跳跃目标的映射。

本质上,假设您有一个这样的开关:

w;                               // 001
switch ($foo) {                  // 002
  case 'a':
     w;                          // 003
  case 'b':
     x;                          // 004
     break;                      // 005
  case 'c':
     y;                          // 006
}
z;                               // 007

实际上最终发生的事情是您可以像这样有效地获得一些代码(注意:从实际工作方式高度简化):

001  v
002  jump based on $foo: [a -> 003, b -> 004, c -> 006]
003  w
004  x
005  jump to 007
006  y
007  z

然后那个程序就从上到下运行。

  • 在 where $foois 'a' 的情况下,它跳到 003 并从那里运行,这意味着它最终会做v,jump,w,x,z
  • 在 where $foois 'b' 的情况下,它会跳到 004 并从那里运行,这意味着它最终会做v,jump,x,z
  • 在 where $foois 'c' 的情况下,它会跳到 006 并从那里运行,这意味着它最终会做v,jump,y,z
于 2012-11-27T08:34:32.087 回答