-
Notifications
You must be signed in to change notification settings - Fork 146
/
switch.xml
333 lines (322 loc) · 8.82 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
328
329
330
331
332
333
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: cdc9d28d334bbc08386fecf8aade66080004a9dd Maintainer: yannick Status: ready -->
<!-- Reviewed: yes -->
<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>
L'instruction <literal>switch</literal> équivaut à une série d'instructions
<literal>if</literal>. En de nombreuses occasions, vous aurez besoin de
comparer la même variable (ou expression) avec un grand nombre de valeurs
différentes, et d'exécuter différentes parties de code suivant la valeur
à laquelle elle est égale. C'est exactement à cela que sert l'instruction
<literal>switch</literal>.
</simpara>
<note>
<simpara>
Notez que contrairement à d'autres langages, la structure
<link linkend="control-structures.continue">continue</link> s'applique
aux structures <literal>switch</literal> et se comporte de la même manière
que <literal>break</literal>.
Si vous avez un <literal>switch</literal> dans une boucle, et que vous
souhaitez continuer jusqu'à la prochaine itération de la boucle extérieure,
vous devez utiliser <literal>continue 2</literal>.
</simpara>
</note>
<note>
<para>
Notez que switch/case provoque une
<link linkend="types.comparisions-loose">comparaison large</link>.
</para>
</note>
<para>
Dans l'exemple suivant, chaque bloc de code est équivalent.
L'un utilise une série d'instructions <literal>if</literal> et
<literal>elseif</literal>, et l'autre une instruction de type
<literal>switch</literal>. Dans chaque cas, la sortie est la même.
<example>
<title>Instruction <literal>switch</literal></title>
<programlisting role="php">
<![CDATA[
<?php
// Ce switch:
switch ($i) {
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
}
// Équivaut à:
if ($i == 0) {
echo "i égal 0";
} elseif ($i == 1) {
echo "i égal 1";
} elseif ($i == 2) {
echo "i égal 2";
}
?>
]]>
</programlisting>
</example>
</para>
<para>
Il est important de comprendre que l'instruction
<literal>switch</literal> exécute chacune des
clauses dans l'ordre. L'instruction <literal>switch</literal>
est exécutée ligne par ligne. Au début,
aucun code n'est exécuté. Uniquement lorsqu'une instruction
<literal>case</literal> est trouvée dont
l'expression est évaluée à une valeur qui correspond à la valeur de
l'expression <literal>switch</literal>, PHP exécute alors les instructions correspondantes.
PHP continu d'exécuter les instructions jusqu'à
la fin du bloc d'instructions du <literal>switch</literal>,
ou bien dès qu'il trouve l'instruction <literal>break</literal>.
Si vous ne pouvez pas utiliser l'instruction
<literal>break</literal> à la fin de l'instruction
<literal>case</literal>, PHP continuera à exécuter
toutes les instructions qui suivent. Par exemple :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i) {
case 0:
echo "i égal 0";
case 1:
echo "i égal 1";
case 2:
echo "i égal 2";
}
?>
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Dans cet exemple, si <varname>$i</varname> est égal à 0, PHP va
exécuter quand même toutes les instructions qui
suivent! Si <varname>$i</varname> est égal à 1, PHP exécutera
les deux dernières instructions. Et seulement si <varname>$i</varname> est
égal à 2, vous obtiendrez le résultat
escompté, c'est-à-dire, l'affichage de
"i égal 2". Donc, l'important est de ne pas oublier
l'instruction <literal>break</literal> (même s'il est
possible que vous l'omettiez dans certaines circonstances).
</simpara>
<simpara>
Dans une commande <literal>switch</literal>, une condition n'est
évaluée qu'une fois, et le résultat est
comparé à chaque <literal>case</literal>.
Dans une structure <literal>elseif</literal>, les conditions sont
évaluées à chaque comparaison. Si votre
condition est plus compliquée qu'une simple
comparaison, ou bien fait partie d'une boucle,
<literal>switch</literal> sera plus rapide.
</simpara>
<para>
La liste de commandes d'un <literal>case</literal> peut
être vide, auquel cas PHP utilisera la liste de
commandes du cas suivant.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i est plus petit que 3 mais n'est pas négatif";
break;
case 3:
echo "i égal 3";
}
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Un cas spécial est <literal>default</literal>. Ce cas est utilisé lorsque tous
les autres cas ont échoué. Par exemple :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i) {
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
default:
echo "i n'est ni égal à 2, ni à 1, ni à 0.";
}
?>
]]>
</programlisting>
</informalexample>
<note>
<simpara>
Plusieurs cas default lèveront une erreur de niveau
<constant>E_COMPILE_ERROR</constant>.
</simpara>
</note>
<note>
<simpara>
Techniquement, le cas <literal>default</literal> peut être placé
à n'importe quelle position. Il ne sera utilisé que si aucun autre cas ne correspond.
Cependant, par convention, il est préférable de le placer à la fin.
</simpara>
</note>
</para>
<para>
Si aucun <literal>case</literal> ne correspond, et qu'il n'y a pas de <literal>default</literal>, alors aucun code ne sera exécuté, tout comme si aucune instruction <literal>if</literal> n'était vraie.
</para>
<para>
Une valeur de <literal>case</literal> peut être donnée sous forme d'expression. Cependant, cette expression sera
évaluée seule, puis comparée de manière approximative à la valeur du <literal>switch</literal>. Cela signifie
qu'elle ne peut pas être utilisée pour des évaluations complexes de la valeur du <literal>switch</literal>. Par exemple :
<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;
}
// Prints "B"
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Pour des comparaisons plus complexes, la valeur &true; peut être utilisée comme valeur de <literal>switch</literal>.
Ou, alternativement, des blocs <literal>if</literal>-<literal>else</literal> au lieu de <literal>switch</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;
}
// Prints "B"
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
La syntaxe alternative pour cette structure de contrôle est
la suivante : (pour plus d'informations, voir
<link linkend="control-structures.alternative-syntax">syntaxes
alternatives</link>).
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i):
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
default:
echo "i n'est ni égal à 2, ni à 1, ni à 0";
endswitch;
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Il est possible d'utiliser un point-virgule plutôt que deux points après
un case, comme ceci :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch($beer)
{
case 'leffe';
case 'grimbergen';
case 'guinness';
echo 'Bon choix';
break;
default;
echo 'Merci de faire un choix...';
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
-->