<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.control-structures.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'control-structures.switch.php',
    1 => 'switch',
    2 => 'switch',
  ),
  'up' => 
  array (
    0 => 'language.control-structures.php',
    1 => '流程控制',
  ),
  'prev' => 
  array (
    0 => 'control-structures.continue.php',
    1 => 'continue',
  ),
  'next' => 
  array (
    0 => 'control-structures.match.php',
    1 => 'match',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'language/control-structures/switch.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="control-structures.switch" class="sect1">
 <h2 class="title">switch</h2>
 <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p>
 <p class="simpara">
  <code class="literal">switch</code> 语句类似于具有同一个表达式的一系列 <code class="literal">if</code>
  语句。很多场合下需要把同一个变量（或表达式）与很多不同的值比较，并根据它等于哪个值来执行不同的代码。这正是
  <code class="literal">switch</code> 语句的用途。
 </p>
 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <span class="simpara">
   注意和其它语言不同，<a href="control-structures.continue.php" class="link">continue</a>
   语句作用到 switch 上的作用类似于 <code class="literal">break</code>。如果在循环中有一个
   switch 并希望 continue 到外层循环中的下一轮循环，用 <code class="literal">continue 2</code>。
  </span>
 </p></blockquote>
 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <p class="para">
   注意 switch/case 作的是<a href="types.comparisons.php#types.comparisions-loose" class="link">松散比较</a>。
  </p>
 </p></blockquote>  
 <p class="para">
  下面的例子使用不同方法实现同样的事。一个用一系列的
  <code class="literal">if</code> 和 <code class="literal">elseif</code>
  语句，另一个用 <code class="literal">switch</code> 语句。例子不同，但输出相同：
  <div class="example" id="example-1">
   <p><strong>示例 #1 <code class="literal">switch</code> 结构</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">// 这是 switch 语句<br /><br />switch ($i) {<br />    case 0:<br />        echo "i equals 0";<br />        break;<br />    case 1:<br />        echo "i equals 1";<br />        break;<br />    case 2:<br />        echo "i equals 2";<br />        break;<br />}<br /><br />// 相当于：<br /><br />if ($i == 0) {<br />    echo "i equals 0";<br />} elseif ($i == 1) {<br />    echo "i equals 1";<br />} elseif ($i == 2) {<br />    echo "i equals 2";<br />}<br />?&gt;</span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  为避免错误，理解 <code class="literal">switch</code> 是怎样执行的非常重要。<code class="literal">switch</code>
  语句一行接一行地执行（实际上是语句接语句）。开始时没有代码被执行。仅当一个
  <code class="literal">case</code> 语句中的值和 <code class="literal">switch</code>
  表达式的值匹配时 PHP 才开始执行语句，直到 <code class="literal">switch</code>
  的程序段结束或者遇到第一个 <code class="literal">break</code>
  语句为止。如果不在 case 的语句段最后写上 <code class="literal">break</code>
  的话，PHP 将继续执行下一个 case 中的语句段。例如：
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">switch (</span><span style="color: #0000BB">$i</span><span style="color: #007700">) {<br />    case </span><span style="color: #0000BB">0</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i equals 0"</span><span style="color: #007700">;<br />    case </span><span style="color: #0000BB">1</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i equals 1"</span><span style="color: #007700">;<br />    case </span><span style="color: #0000BB">2</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i equals 2"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="simpara">
  这里如果 <var class="varname">$i</var> 等于 0，PHP 将执行所有的 echo 语句！如果
  <var class="varname">$i</var> 等于 1，PHP 将执行后面两条 echo 语句。只有当
  <var class="varname">$i</var> 等于 2 时，才会得到“预期”的结果——只显示“i equals 2”。所以，别忘了
  <code class="literal">break</code> 语句就很重要（即使在某些情况下故意想避免提供它们时）。
 </p>
 <p class="simpara">
  在 <code class="literal">switch</code> 语句中条件只求值一次并用来和每个
  <code class="literal">case</code> 语句比较。在 <code class="literal">elseif</code>
  语句中条件会再次求值。如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中，那么用
  <code class="literal">switch</code> 语句可能会快一些。
 </p>
 <p class="para">
  在一个 case 中的语句也可以为空，这样只不过将控制转移到了下一个 case 中的语句。
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">switch (</span><span style="color: #0000BB">$i</span><span style="color: #007700">) {<br />    case </span><span style="color: #0000BB">0</span><span style="color: #007700">:<br />    case </span><span style="color: #0000BB">1</span><span style="color: #007700">:<br />    case </span><span style="color: #0000BB">2</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i is less than 3 but not negative"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">3</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i is 3"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  一个 case 的特例是 <code class="literal">default</code>。它匹配了任何和其它
  case 都不匹配的情况。例如：
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">switch (</span><span style="color: #0000BB">$i</span><span style="color: #007700">) {<br />    case </span><span style="color: #0000BB">0</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i equals 0"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">1</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i equals 1"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">2</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i equals 2"</span><span style="color: #007700">;<br />        break;<br />    default:<br />        echo </span><span style="color: #DD0000">"i is not equal to 0, 1 or 2"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <span class="simpara">
    如果有多个 default 将导致
    <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong> 错误。
   </span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <span class="simpara">
    从技术上讲，<code class="literal">default</code> case
    可以按照任何顺序列出。只有在没有匹配到其它的 case
    时才会使用它。但是最好按照惯例，将其作为最后一个分支放在最后。
   </span>
  </p></blockquote>
 </p>
 <p class="para">
  如果没有匹配到 <code class="literal">case</code> 分支且没有 <code class="literal">default</code>
  分支，则不会执行任何代码，就像 <code class="literal">if</code> 不为 true 一样。
 </p>
 <p class="para">
  case 的值可以使用表达式。然而，该表达式将会自我求值，然后与 switch
  的值进行松散比较。这意味着它不适合用于复杂的 switch 值求值。例如：
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$target </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$start </span><span style="color: #007700">= </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br /><br />switch (</span><span style="color: #0000BB">$target</span><span style="color: #007700">) {<br />    case </span><span style="color: #0000BB">$start </span><span style="color: #007700">- </span><span style="color: #0000BB">1</span><span style="color: #007700">:<br />        print </span><span style="color: #DD0000">"A"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">$start </span><span style="color: #007700">- </span><span style="color: #0000BB">2</span><span style="color: #007700">:<br />        print </span><span style="color: #DD0000">"B"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">$start </span><span style="color: #007700">- </span><span style="color: #0000BB">3</span><span style="color: #007700">:<br />        print </span><span style="color: #DD0000">"C"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">$start </span><span style="color: #007700">- </span><span style="color: #0000BB">4</span><span style="color: #007700">:<br />        print </span><span style="color: #DD0000">"D"</span><span style="color: #007700">;<br />        break;<br />}<br /><br /></span><span style="color: #FF8000">// 输出“B”<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  对于更复杂的比较，值 <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> 可用于 switch 的值。或使用 
  <code class="literal">if</code>-<code class="literal">else</code> 代替 <code class="literal">switch</code>。
  <div class="informalexample">
   <div class="example-contents">
    <div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$offset </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$start </span><span style="color: #007700">= </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br /><br />switch (</span><span style="color: #0000BB">true</span><span style="color: #007700">) {<br />    case </span><span style="color: #0000BB">$start </span><span style="color: #007700">- </span><span style="color: #0000BB">$offset </span><span style="color: #007700">=== </span><span style="color: #0000BB">1</span><span style="color: #007700">:<br />        print </span><span style="color: #DD0000">"A"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">$start </span><span style="color: #007700">- </span><span style="color: #0000BB">$offset </span><span style="color: #007700">=== </span><span style="color: #0000BB">2</span><span style="color: #007700">:<br />        print </span><span style="color: #DD0000">"B"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">$start </span><span style="color: #007700">- </span><span style="color: #0000BB">$offset </span><span style="color: #007700">=== </span><span style="color: #0000BB">3</span><span style="color: #007700">:<br />        print </span><span style="color: #DD0000">"C"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">$start </span><span style="color: #007700">- </span><span style="color: #0000BB">$offset </span><span style="color: #007700">=== </span><span style="color: #0000BB">4</span><span style="color: #007700">:<br />        print </span><span style="color: #DD0000">"D"</span><span style="color: #007700">;<br />        break;<br />}<br /><br /></span><span style="color: #FF8000">// 输出“B”<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  <code class="literal">switch</code> 支持替代语法的流程控制。更多信息见<a href="control-structures.alternative-syntax.php" class="link">流程控制的替代语法</a>一节。
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">switch (</span><span style="color: #0000BB">$i</span><span style="color: #007700">):<br />    case </span><span style="color: #0000BB">0</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i equals 0"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">1</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i equals 1"</span><span style="color: #007700">;<br />        break;<br />    case </span><span style="color: #0000BB">2</span><span style="color: #007700">:<br />        echo </span><span style="color: #DD0000">"i equals 2"</span><span style="color: #007700">;<br />        break;<br />    default:<br />        echo </span><span style="color: #DD0000">"i is not equal to 0, 1 or 2"</span><span style="color: #007700">;<br />endswitch;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  允许使用分号代替 case 语句后的冒号，例如：
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">switch(</span><span style="color: #0000BB">$beer</span><span style="color: #007700">)<br />{<br />    case </span><span style="color: #DD0000">'tuborg'</span><span style="color: #007700">;<br />    case </span><span style="color: #DD0000">'carlsberg'</span><span style="color: #007700">;<br />    case </span><span style="color: #DD0000">'stella'</span><span style="color: #007700">;<br />    case </span><span style="color: #DD0000">'heineken'</span><span style="color: #007700">;<br />        echo </span><span style="color: #DD0000">'Good choice'</span><span style="color: #007700">;<br />        break;<br />    default;<br />        echo </span><span style="color: #DD0000">'Please make a new selection...'</span><span style="color: #007700">;<br />        break;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>

 <div class="sect2">
  <h3 class="title">参见</h3>
  <p class="para">
   <ul class="simplelist">
    <li><a href="control-structures.match.php" class="link">match</a></li>
   </ul>
  </p>
 </div>
</div><?php manual_footer($setup); ?>