mirror of
https://github.com/php/doc-ja.git
synced 2026-03-25 23:52:16 +01:00
328 lines
9.2 KiB
XML
328 lines
9.2 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: cdc9d28d334bbc08386fecf8aade66080004a9dd Maintainer: takagi Status: ready -->
|
|
<!-- Credits: mumumu -->
|
|
|
|
<sect1 xml:id="control-structures.switch" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>switch</title>
|
|
<?phpdoc print-version-for="switch"?>
|
|
<simpara>
|
|
<literal>switch</literal>文は、同じ式を用いてIF文を並べたのに似ています。
|
|
同じ変数を異なる値と比較し、値に応じて異なったコードを実行したいと
|
|
思うことがしばしばあるかと思います。
|
|
<literal>switch</literal>文は、まさにこのためにあるのです。
|
|
</simpara>
|
|
<note>
|
|
<simpara>
|
|
他の言語とは違って、
|
|
<link linkend="control-structures.continue">continue</link>命令は
|
|
<literal>switch</literal> にも適用され、<literal>break</literal>と同じ動作をします。
|
|
ループの内部で <literal>switch</literal> を使用しており、
|
|
外側のループの処理を続行させたい場合には、<literal>continue 2</literal>
|
|
を使用してください。
|
|
</simpara>
|
|
</note>
|
|
<note>
|
|
<para>
|
|
switch/case が行うのは、
|
|
<link linkend="types.comparisions-loose">緩やかな比較</link>
|
|
であることに注意しましょう。
|
|
</para>
|
|
</note>
|
|
|
|
<para>
|
|
次の二つの例は、同じことを二つの異なった方法で書いたものです。
|
|
一つは、<literal>if</literal> と <literal>elseif</literal>文を、
|
|
もう一つは<literal>switch</literal>文を使っています。
|
|
どちらも、出力は同じです。
|
|
<example>
|
|
<title><literal>switch</literal> 文の構造</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
// これが switch 文です:
|
|
|
|
switch ($i) {
|
|
case 0:
|
|
echo "iは0に等しい";
|
|
break;
|
|
case 1:
|
|
echo "iは1に等しい";
|
|
break;
|
|
case 2:
|
|
echo "iは2に等しい";
|
|
break;
|
|
}
|
|
|
|
// 上記は、下記と同じです:
|
|
if ($i == 0) {
|
|
echo "iは0に等しい";
|
|
} elseif ($i == 1) {
|
|
echo "iは1に等しい";
|
|
} elseif ($i == 2) {
|
|
echo "iは2に等しい";
|
|
}
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
失敗を避けるために<literal>switch</literal>文がどのように実行されるのかを
|
|
理解することが重要です。
|
|
<literal>switch</literal>文は、行毎に実行されます。
|
|
(実際には、文毎に実行されます。)初めは、何も実行しません。
|
|
<literal>switch</literal>式の値と同じ値として評価される式を有する
|
|
<literal>case</literal>文が見つけられたときに初めてPHPにより
|
|
命令の実行が行われます。
|
|
PHPは<literal>switch</literal>ブロックの終わりまたは最初の
|
|
<literal>break</literal>文まで実行を続けます。
|
|
CASE文の終わりに<literal>break</literal>文を書かない場合は、PHPは
|
|
次のCASE文を実行しつづけます。例えば、
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
switch ($i) {
|
|
case 0:
|
|
echo "iは0に等しい";
|
|
case 1:
|
|
echo "iは1に等しい";
|
|
case 2:
|
|
echo "iは2に等しい";
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<simpara>
|
|
ここで、<varname>$i</varname>が0に等しい場合は、PHPは全ての echo
|
|
文を出力してしまいます!
|
|
<varname>$i</varname>が1の場合、PHPは最後の二つの echo 文を出力します。
|
|
<varname>$i</varname>が2に等しい場合のみ、'期待した'動作をし、
|
|
'iは2に等しい'と表示します。
|
|
このため (ある種の状況下では、BREAKを付加することを避けたいと
|
|
思うかもしれませんが)、
|
|
<literal>break</literal>文を忘れないようにすることが重要です。
|
|
</simpara>
|
|
<simpara>
|
|
<literal>switch</literal>文では、条件は1度だけ評価され、
|
|
その結果が各<literal>case</literal>文と比較されます。
|
|
<literal>elseif</literal>文では、条件は、再度評価されます。
|
|
使用する条件が単純な比較処理よりも複雑な処理を行ったり、
|
|
重い繰り返し処理を行う場合、<literal>switch</literal>の方が
|
|
より処理が速い可能性があります。
|
|
</simpara>
|
|
<para>
|
|
caseに付随する文は、空とすることが可能です。
|
|
この場合、次のcaseに付随する文に制御が移行します。
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
switch ($i) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
echo "iは3より小さいですが負ではありません";
|
|
break;
|
|
case 3:
|
|
echo "iは3です";
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
<literal>default</literal> は、case 文の特別な場合です。これは他の全ての case
|
|
にマッチしない場合に実行されます。例を以下に示します。
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
switch ($i) {
|
|
case 0:
|
|
echo "iは0に等しい";
|
|
break;
|
|
case 1:
|
|
echo "iは1に等しい";
|
|
break;
|
|
case 2:
|
|
echo "iは2に等しい";
|
|
break;
|
|
default:
|
|
echo "iは0,1,2に等しくない";
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
<note>
|
|
<simpara>
|
|
複数の <literal>default</literal> を置くと、
|
|
<constant>E_COMPILE_ERROR</constant> エラーが発生します。
|
|
</simpara>
|
|
</note>
|
|
|
|
<note>
|
|
<simpara>
|
|
技術的には、
|
|
<literal>default</literal> は switch 文の中のどの位置でも置くことができます。
|
|
<literal>default</literal> は他の case にマッチしなかった場合に使われるものです。
|
|
しかし、規約上は最後に置くのが一番です。
|
|
</simpara>
|
|
</note>
|
|
</para>
|
|
<para>
|
|
どの <literal>case</literal> にもマッチせず、
|
|
<literal>default</literal> も存在しない場合、
|
|
どのコードも実行されません。これは、
|
|
どの <literal>if</literal> 文も true でなかった場合と同じです。
|
|
</para>
|
|
<para>
|
|
case に与える値は、式であっても構いません。
|
|
しかし、式はそれ自体が実行され、
|
|
その結果が switch に与えた値と緩やかに比較されます。
|
|
これは、switch に与える値の複雑な評価には使えないということです。
|
|
たとえば、以下の例を見てみましょう:
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$target = 1;
|
|
$start = 3;
|
|
switch ($target) {
|
|
case $start - 1:
|
|
print "A";
|
|
break;
|
|
case $start - 2:
|
|
print "B";
|
|
break;
|
|
case $start - 3:
|
|
print "C";
|
|
break;
|
|
case $start - 4:
|
|
print "D";
|
|
break;
|
|
}
|
|
// "B" を出力します。
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
もっと複雑な比較を行うには、
|
|
&true; をswitch文の値として指定するやり方が使えます。
|
|
もしくは、<literal>switch</literal>文ではなく、
|
|
<literal>if</literal>-<literal>else</literal>ブロックが使えます。
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$offset = 1;
|
|
$start = 3;
|
|
switch (true) {
|
|
case $start - $offset === 1:
|
|
print "A";
|
|
break;
|
|
case $start - $offset === 2:
|
|
print "B";
|
|
break;
|
|
case $start - $offset === 3:
|
|
print "C";
|
|
break;
|
|
case $start - $offset === 4:
|
|
print "D";
|
|
break;
|
|
}
|
|
// "B" を出力します。
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
switch文の制御構造に関する別の構文がサポートされています。
|
|
詳細は、<link linkend="control-structures.alternative-syntax">
|
|
制御構造に関する別の構文</link>を参照ください。
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
switch ($i):
|
|
case 0:
|
|
echo "iは0に等しい";
|
|
break;
|
|
case 1:
|
|
echo "iは1に等しい";
|
|
break;
|
|
case 2:
|
|
echo "iは2に等しい";
|
|
break;
|
|
default:
|
|
echo "iは0でも1でも2でもない";
|
|
endswitch;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
case の最後はコロンではなくセミコロンとすることもできます。たとえば次のようになります。
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
switch($beer)
|
|
{
|
|
case 'ツボルグ';
|
|
case 'カールスバーグ';
|
|
case 'ステラ';
|
|
case 'ハイネケン';
|
|
echo 'いいっすねぇ';
|
|
break;
|
|
default;
|
|
echo 'ほかのを選んでみませんか?';
|
|
break;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
|
|
<sect2 role="seealso">
|
|
&reftitle.seealso;
|
|
<para>
|
|
<simplelist>
|
|
<member>&match;</member>
|
|
</simplelist>
|
|
</para>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|