跳转到内容

PHP 编程/switch 结构

来自维基教科书,开放的书籍,开放的世界

switch case

[编辑 | 编辑源代码]

工作原理

[编辑 | 编辑源代码]

这是一个简单的游戏示例,用户输入一个 $user_command,然后运行不同的函数

if ($user_command == "n") {
  go_north();
} else if ($user_command == "e") {
  go_east();
} else if ($user_command == "s") {
  go_south();
} else if ($user_command == "w") {
  go_west();
} else {
  do_something_else();
}

很明显,这里有很多重复代码。switch case 结构允许你避免这种冗余代码。它允许程序员重复地将某个变量的值与一组可能的值进行比较,并根据结果执行代码。这是 switch case 语句的语法,与使用 if 语句编写的相同代码相比

if 语句风格 switch case 风格
if ($firstvariable == 'comparison1' 
    || $firstvariable == 'comparison2') {

  doSomething();
  doSomethingElse();
} else if ($firstvariable == 'comparison3') {
  doAThirdThing();
} else {
  launchMissiles();
}
// Look at how much switch case saves you!
switch($firstvariable) {
  case 'comparison1':
  case 'comparison2':
    doSomething();
    doSomethingElse();
    break;
  
  case 'comparison3':
    doAThirdThing();
    break;
  
  default: 
    launchMissiles();
    break;
}

switch case 风格将使你免于重新输入 $firstvariable,并使你的代码看起来更简洁(特别是如果该代码是简单的 if 语句的长链)。回到我们的 zorkmid 示例程序,我们有

原始代码 switch-case 代码
if ($user_command == "n") {
  go_north();
} else if ($user_command == "e") {
  go_east();
} else if ($user_command == "s") {
  go_south();
} else if ($user_command == "w") {
  go_west();
} else {
  do_something_else();
}
switch($user_command) {
  case 'n':
    go_north();
    break;
  case 'e':
    go_east();
    break;
  case 's':
    go_south();
    break;
  case 'w':
    go_west();
    break;
  default:
    do_something_else();
    break;
}
switch($var) {
  case [value]:
    [code]
    break;
  
  case [value]:
    [code]
    break;
  
  ...
  
  default:
    [code]
    break;
}

在这个例子中,$var 是第一个要比较的变量。然后,这个变量将从上到下与每个 case 语句进行比较,直到找到匹配项。此时,代码将执行,直到遇到 break 语句(这将允许你完全退出 case 语句)。

关于使用 switch case 语句的重要警告

[编辑 | 编辑源代码]

不要忘记在需要中断时使用 break!如果你忘记了,你可能会运行你不打算运行的函数。然而,在某些情况下,省略 break 可能是有用的。请看这个例子

switch ($n) {
  case 0:
  case 1:
  case 2:
    //only executes, if $n is 0, 1 or 2
    doSomethingForNumbers2OrSmaller();
    break;
  case 3:
    //only executes, if $n is 3
    doSomethingForNumber3();
  default:
    //only executes, if $n is 3 or above
    doSomethingForNumbers3OrBigger();
    break;
}

这种编码方式有时会被认为是不好的,因为它并不总是清楚地表明代码的意图。此外,请考虑对没有 break 的 case 语句进行注释;在下一个 case 之前的语句,这样当其他人查看你的代码时,他们就知道不要添加 break。在这种情况下,最好在无 break 的 case 中添加注释,以便明确地表明省略 break 是有意为之的

switch ($n) {
  case 0:
    // Falls through!
  case 1:
    doSomethingForLargeNumbers();
    // Falls through!
  case 2:
    doSomethingForSmallerNumbers();
    break;
  
}

更多信息

[编辑 | 编辑源代码]


华夏公益教科书