1
0
mirror of https://github.com/php/doc-de.git synced 2026-03-24 15:22:14 +01:00
Files
Martin Samesch 7e5afd6bbf Sync with EN
2023-04-04 22:47:37 +02:00

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
-->