-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathswitch.xml
327 lines (319 loc) · 9.22 KB
/
switch.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
<?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
-->