mirror of
https://github.com/php/doc-de.git
synced 2026-03-24 15:22:14 +01:00
331 lines
8.9 KiB
XML
331 lines
8.9 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: cdc9d28d334bbc08386fecf8aade66080004a9dd Maintainer: cmb Status: ready -->
|
|
|
|
<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>
|
|
Die <literal>switch</literal>-Anweisung entspricht in etwa einer
|
|
Folge von <literal>if</literal>-Anweisungen die jeweils den gleichen
|
|
Ausdruck prüfen. Es kommt oft vor, dass man dieselbe Variable (oder
|
|
denselben Ausdruck) gegen viele verschiedene mögliche Werte prüfen
|
|
und abhängig davon unterschiedlichen Code ausführen möchte. Genau
|
|
hierfür wurde die <literal>switch</literal>-Anweisung eingeführt.
|
|
</simpara>
|
|
<note>
|
|
<simpara>
|
|
Beachten Sie, dass im Unterschied zu einigen anderen Sprachen die
|
|
<link linkend="control-structures.continue">continue</link>-Anweisung
|
|
auch auf <literal>switch</literal> anwendbar ist und sich ähnlich wie <literal>break</literal>
|
|
verhält. Wenn Sie ein <literal>switch</literal> innerhalb einer Schleife verwenden und
|
|
mit dem nächsten Schleifendurchlauf beginnen wollen so müssen Sie in
|
|
diesem Fall <literal>continue 2</literal> angeben.
|
|
</simpara>
|
|
</note>
|
|
<note>
|
|
<para>
|
|
Beachten Sie auch, dass switch/case
|
|
<link linkend="types.comparisions-loose">typschwache Vergleiche</link>
|
|
durchführt.
|
|
</para>
|
|
</note>
|
|
<para>
|
|
Im folgenden Beispiel sind die beiden Codeblöcke gleichwertig.
|
|
Der eine verwendet eine Reihe von <literal>if</literal>- und
|
|
<literal>elseif</literal>-Anweisungen und der andere eine
|
|
<literal>switch</literal>-Anweisung. Die Ausgabe ist in beiden Fällen
|
|
dieselbe.
|
|
<example>
|
|
<title><literal>switch</literal>-Anweisung</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
// This switch statement:
|
|
|
|
switch ($i) {
|
|
case 0:
|
|
echo "i ist gleich 0";
|
|
break;
|
|
case 1:
|
|
echo "i ist gleich 1";
|
|
break;
|
|
case 2:
|
|
echo "i ist gleich 2";
|
|
break;
|
|
}
|
|
|
|
// Is equivalent to:
|
|
|
|
if ($i == 0) {
|
|
echo "i ist gleich 0";
|
|
} elseif ($i == 1) {
|
|
echo "i ist gleich 1";
|
|
} elseif ($i == 2) {
|
|
echo "i ist gleich 2";
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
Um Fehler zu vermeiden ist es wichtig zu verstehen wie eine
|
|
<literal>switch</literal>-Anweisung ausgeführt wird. Eine
|
|
<literal>switch</literal>-Anweisung wird zeilenweise (genauer: Anweisung für
|
|
Anweisung) ausgewertet. Zunächst einmal wird überhaupt kein Code ausgeführt.
|
|
Erst wenn eine <literal>case</literal>-Anweisung gefunden wird, deren
|
|
Ausdruck zu einem Wert evaluiert, der dem an <literal>switch</literal>
|
|
übergebenen Ausdruck entspricht, beginnt PHP tatsächlich die folgenden
|
|
Anweisungen auszuführen. Die Ausführung wird fortgesetzt bis das Ende
|
|
der <literal>switch</literal>-Anweisung erreicht ist oder bis PHP
|
|
bei der Ausführung auf eine <literal>break</literal>-Anweisung stößt.
|
|
Wenn Sie am Ende der Anweisungsliste eines case kein
|
|
<literal>break</literal> setzen, so wird die Ausführung mit dem nächsten
|
|
case fortgesetzt, &zb;:
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
switch ($i) {
|
|
case 0:
|
|
echo "i ist gleich 0";
|
|
case 1:
|
|
echo "i ist gleich 1";
|
|
case 2:
|
|
echo "i ist gleich 2";
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<simpara>
|
|
Wenn in diesem Beispiel <varname>$i</varname> gleich 0 ist, führt PHP alle
|
|
echo-Anweisungen aus! Ist <varname>$i</varname> gleich 1, führt PHP die
|
|
letzten beiden echo-Anweisungen aus. Sie erreichen das erwartete Verhalten
|
|
nur, wenn <varname>$i</varname> gleich 2 ist. Daher ist es wichtig
|
|
<literal>break</literal>-Anweisungen nicht zu vergessen (auch wenn Sie
|
|
gelegentlich absichtlich darauf verzichten werden, diese unter bestimmten
|
|
Bedingungen anzugeben).
|
|
</simpara>
|
|
<simpara>
|
|
In einer <literal>switch</literal>-Anweisung wird die Bedingung nur einmal
|
|
ausgewertet und das Ergebnis mit jeder <literal>case</literal>-Anweisung
|
|
verglichen. In einer <literal>elseif</literal>-Anweisung wird die Bedingung
|
|
erneut ausgewertet. Wenn Ihre Bedingung komplizierter ist als ein einfacher
|
|
Vergleich, und/oder sich in einer dichten Schleife befindet, kann ein
|
|
<literal>switch</literal> schneller sein.
|
|
</simpara>
|
|
<para>
|
|
Die Anweisungsliste eines case kann ebenso leer sein, was einfach die
|
|
Kontrolle an die Anweisungsliste des nächsten case übergibt.
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
switch ($i) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
echo "i ist kleiner als 3, aber nicht negativ";
|
|
break;
|
|
case 3:
|
|
echo "i ist 3";
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
Ein Sonderfall ist die <literal>default</literal>-Klausel. Diese fängt alles
|
|
ab, was nicht durch eine der anderen case-Klauseln behandelt wurde. Zum
|
|
Beispiel:
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
switch ($i) {
|
|
case 0:
|
|
echo "i ist gleich 0";
|
|
break;
|
|
case 1:
|
|
echo "i ist gleich 1";
|
|
break;
|
|
case 2:
|
|
echo "i ist gleich 2";
|
|
break;
|
|
default:
|
|
echo "i ist nicht gleich 0, 1 oder 2";
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
<note>
|
|
<simpara>
|
|
Mehrere default case-Anweisungen erzeugen einen
|
|
<constant>E_COMPILE_ERROR</constant>-Fehler.
|
|
</simpara>
|
|
</note>
|
|
<note>
|
|
<simpara>
|
|
Technisch gesehen kann der <literal>default</literal>-Case an einer
|
|
beliebigen Stelle stehen. Er wird nur verwendet, wenn kein anderer Fall
|
|
passt. Nach gängiger Praxis ist es jedoch am besten, ihn als letzten Punkt
|
|
ans Ende zu setzen.
|
|
</simpara>
|
|
</note>
|
|
</para>
|
|
<para>
|
|
Wenn kein <literal>case</literal>-Zweig passt und es keinen
|
|
<literal>default</literal>-Zweig gibt, dann wird kein Code ausgeführt,
|
|
genauso wie wenn keine <literal>if</literal>-Anweisung &true; wäre.
|
|
</para>
|
|
<para>
|
|
Ein case-Wert kann als Ausdruck angegeben werden. Dieser Ausdruck wird
|
|
jedoch für sich allein ausgewertet und dann nur einfach mit dem switch-Wert
|
|
verglichen. Das bedeutet, dass er nicht für komplexe Auswertungen des
|
|
switch-Wertes verwendet werden kann. Zum Beispiel:
|
|
<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;
|
|
}
|
|
|
|
// Gibt "B" aus
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
Für komplexere Vergleiche kann der Wert &true; als Switch-Wert verwendet
|
|
werden. Statt <literal>switch</literal> können alternativ auch
|
|
<literal>if</literal>-<literal>else</literal>-Blöcke verwendet werden.
|
|
<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;
|
|
}
|
|
|
|
// Gibt "B" aus
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
Die alternative Syntax für Kontrollstrukturen wird von switch-Anweisungen
|
|
unterstützt. Weitere Information entnehmen Sie dem Abschnitt
|
|
<link linkend="control-structures.alternative-syntax">Alternative Syntax für Kontrollstrukturen</link>.
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
switch ($i):
|
|
case 0:
|
|
echo "i ist gleich 0";
|
|
break;
|
|
case 1:
|
|
echo "i ist gleich 1";
|
|
break;
|
|
case 2:
|
|
echo "i ist gleich 2";
|
|
break;
|
|
default:
|
|
echo "i ist nicht gleich 0, 1 oder 2";
|
|
endswitch;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
Es ist möglich, ein Semikolon anstelle eines Doppelpunkts nach einem case zu
|
|
verwenden, wie:
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
switch($beer)
|
|
{
|
|
case 'Bitburger';
|
|
case 'Erdinger';
|
|
case 'Jever';
|
|
echo 'Gute Wahl';
|
|
break;
|
|
default;
|
|
echo 'Bitte treffen Sie eine andere Wahl...';
|
|
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
|
|
-->
|