跳转到内容

PHP 编程/switch 结构

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

Switch cases

[编辑 | 编辑源代码]

工作原理

[编辑 | 编辑源代码]

以下是一个简单游戏的示例,用户输入 $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;
  
}

更多信息

[编辑 | 编辑源代码]


华夏公益教科书