cvs: phpdoc-de /language control-structures.xml
| From: | Friedhelm Betz | Date: | Sat, 12 Oct 2002 09:33:18 +0000 |
| Subject: | cvs: phpdoc-de /language control-structures.xml | ||
| Groups: | php.doc.de | ||
| Request: | Send a blank email to doc-de+get-296@lists.php.net to get a copy of this message | ||
betz Sat Oct 12 05:33:18 2002 EDT
Modified files:
/phpdoc-de/language control-structures.xml
Log:
sync to en
Index: phpdoc-de/language/control-structures.xml diff -u phpdoc-de/language/control-structures.xml:1.29 phpdoc-de/language/control-structures.xml:1.30 --- phpdoc-de/language/control-structures.xml:1.29 Fri Oct 4 15:54:48 2002 +++ phpdoc-de/language/control-structures.xml Sat Oct 12 05:33:17 2002 @@ -1,14 +1,16 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- $Revision: 1.29 $ --> -<!-- EN-Revision: 1.22 Maintainer: tzwenny Status: ready --> +<!-- $Revision: 1.30 $ --> +<!-- EN-Revision: 1.65 Maintainer: betz Status: ready --> +<!-- CREDITS: tzwenny --> + <chapter id="control-structures"> <title>Kontroll-Strukturen</title> <simpara> Jedes PHP-Skript besteht aus einer Reihe von Anweisungen. Eine - Anweisung kann aus einem Funktions-Aufruf, einer Schleife, einer + Anweisung kann aus einem Funktionsaufruf, einer Schleife, einer bedingten Anweisung oder einem Befehl, der nichts macht (eine - leere Anweisung), bestehen. Jeder Befehl endet gewöhnlich mit - einem Semikolon. Darüber hinaus können Befehle zu einer + leere Anweisung), bestehen. Jede Anweisung endet gewöhnlich mit + einem Semikolon. Darüber hinaus können Anweisungen zu einer Anweisungsgruppe zusammengefasst werden, welche durch geschweifte Klammern begrenzt wird. Eine Anweisungsgruppe ist auch eine Anweisung. Die unterschiedlichen Arten von Anweisungen werden in @@ -18,11 +20,11 @@ <sect1 id="control-structures.if"> <title><literal>if</literal></title> <para> - Der <literal>if</literal>-Befehl ist eine der wichtigsten + Das <literal>if</literal>-Konstrukt ist eine der wichtigsten Möglichkeiten vieler Programmier-Sprachen, PHP eingeschlossen. - Er erlaubt die bedingte Ausführung von Programmteilen. PHP - beinhaltet eine <literal>if</literal>-Struktur, die ähnlich der - C-Programmiersprache ist: + Es erlaubt die bedingte Ausführung von Programmteilen. PHP + kennt eine <literal>if</literal>-Struktur, die ähnlich der + Programmiersprache C ist: <informalexample> <programlisting> <![CDATA[ @@ -33,21 +35,24 @@ </informalexample> </para> <simpara> - Wie im Abschnitt über Expressions / Ausdrücke beschrieben, - wird ausdr auf seinen wirklichen Wertinhalt ausgewertet. Wenn - <replaceable>ausdr</replaceable> &true; - entspricht, wird PHP Anweisung ausführen, falls nicht - sie - also &false; ist - wird Anweisung übergangen. + Wie im Abschnitt über + <link linkend="language.expressions">Ausdrücke</link> beschrieben, wird + <replaceable>ausdr</replaceable> auf seinen boolschen Wertinhalt + ausgewertet. Wenn <replaceable>ausdr</replaceable> als &true; ausgewertet + wird, führt PHP die <replaceable>Anweisung</replaceable> aus, falls die + Auswertung &false; ergibt, wird sie übergangen. Mehr Informationen welche + Werte als &false; ausgewertet werden finden Sie im Abschnitt + <link linkend="language.types.boolean.casting">'Umwandlung nach boolean'</link>. </simpara> <para> - Das folgende Beispiel wird <computeroutput>a ist grösser als b - </computeroutput>anzeigen, wenn <replaceable>$a</replaceable> - grösser ist als <replaceable>$b</replaceable>: + Das folgende Beispiel wird <computeroutput>a ist größer als b + </computeroutput>anzeigen, wenn <replaceable>$a</replaceable> + größer als <replaceable>$b</replaceable> ist: <informalexample> <programlisting role="php"> <![CDATA[ if ($a > $b) - print "a ist grösser als b"; + print "a ist größer als b"; ]]> </programlisting> </informalexample> @@ -58,16 +63,16 @@ jede Anweisung mit einer <literal>if</literal>-Bedingung zu versehen. Statt dessen können Sie mehrere Anweisungen in Gruppen zusammenfassen. Z.B. wird der folgende Programm-Code - <computeroutput>a ist grösser als b</computeroutput> anzeigen, - wenn <replaceable>$a</replaceable> grösser ist als - <replaceable>$b</replaceable>. Danach wird der Wert von + <computeroutput>a ist größer als b</computeroutput> anzeigen, + wenn <replaceable>$a</replaceable> größer als + <replaceable>$b</replaceable> ist. Danach wird der Wert von <replaceable>$a</replaceable> in <replaceable>$b</replaceable> gespeichert: <informalexample> <programlisting role="php"> <![CDATA[ if ($a > $b) { - print "a ist grösser als b"; + print "a ist größer als b"; $b = $a; } ]]> @@ -75,7 +80,7 @@ </informalexample> </para> <simpara> - If-Anweisungen können ohne Einschränkung innerhalb anderer + <literal>If</literal>-Anweisungen können beliebig oft innerhalb anderer <literal>if</literal>-Anweisungen definiert werden. Das ermöglicht ihnen völlige Flexibilität bei der bedingten Ausführung verschiedenster Programmteile. @@ -91,18 +96,18 @@ <literal>Else</literal> erweitert eine <literal>if</literal>-Anweisung um die Ausführung von Anweisungen, sobald der Ausdruck der <literal>if</literal>-Anweisung als - &false; angesehen wird. Der folgende Code wird - z.B. <computeroutput>a ist grösser als b</computeroutput> anzeigen, - wenn <replaceable>$a</replaceable> grösser ist als + &false; ausgewertet wird. Der folgende Code wird z.B. + <computeroutput>a ist größer als b</computeroutput> anzeigen, + wenn <replaceable>$a</replaceable> größer ist als <replaceable>$b</replaceable>, anderenfalls - <computeroutput>a ist NICHT grösser als b</computeroutput>: + <computeroutput>a ist NICHT größer als b</computeroutput>: <informalexample> <programlisting role="php"> <![CDATA[ if ($a > $b) { - print "a ist grösser als b"; + print "a ist größer als b"; } else { - print "a ist NICHT grösser als b"; + print "a ist NICHT größer als b"; } ]]> </programlisting> @@ -125,18 +130,18 @@ <literal>if</literal>-Anweisung um die Ausführung anderer Anweisungen, sobald die normale <literal>if</literal>-Bedingung als &false; angesehen wird. Anders als bei - <literal>else</literal> wird die Ausführung dieser anderen + <literal>else</literal> wird die Ausführung dieser alternativen Anweisungen nur durchgeführt, wenn die bei <literal>elseif</literal> angegebene alternative Bedingung als &true; angesehen wird. Der folgende Code wird - z.B. <computeroutput>a ist grösser als b</computeroutput>, + z.B. <computeroutput>a ist größer als b</computeroutput>, <computeroutput>a ist gleich b</computeroutput> oder <computeroutput>a ist kleiner als b</computeroutput> ausgeben: <informalexample> <programlisting role="php"> <![CDATA[ if ($a > $b) { - print "a ist grösser als b"; + print "a ist größer als b"; } elseif ($a == $b) { print "a ist gleich b"; } else { @@ -152,15 +157,17 @@ <literal>elseif</literal>-Bedingung (falls vorhanden), die &true; ist, wird ausgeführt. In PHP kann man auch 'else if' schreiben (zwei Wörter). Das Verhalten ist - identisch zu 'elseif' (ein Wort), genau wie in C. + identisch zu 'elseif' (ein Wort). Die Bedeutung der Syntax ist leicht + unterschiedlich (falls Sie mit C vertraut sind, das ist das gleiche + Verhalten) aber der Grundtenor ist der, dass beide Schreibweisen, bezogen + auf das Ergebnis, sich exakt gleich verhalten. </simpara> <simpara> Die <literal>elseif</literal>-Anweisung wird nur ausgeführt, - wenn die vorausgehende <literal>if</literal>-Bedingung sowie + wenn die vorausgehende <literal>if</literal>-Bedingung sowie jede vorherige <literal>elseif</literal>-Bedingung &false; ist und die aktuelle - <literal>elseif</literal>-Bedingung &true; - ist. + <literal>elseif</literal>-Bedingung &true; ist. </simpara> </sect1> @@ -174,8 +181,8 @@ Immer muss die öffnende Klammer durch einen Doppelpunkt ":" und die schließende Klammer durch ein <literal>endif;</literal>, <literal>endwhile;</literal>, - <literal>endfor;</literal>, <literal>endforeach;</literal> - bzw. <literal>endswitch;</literal> ersetzt werden. + <literal>endfor;</literal>, <literal>endforeach;</literal> + oder <literal>endswitch;</literal> ersetzt werden. <informalexample> <programlisting role="php"> <![CDATA[ @@ -187,8 +194,8 @@ </informalexample> </para> <simpara> - Im obigen Beispiel ist der HTML-Bereich eingebettet in eine - <literal>if</literal>-Anweisung mit alternativer Syntax. + Im obigen Beispiel ist der HTML-Bereich "A ist gleich 5" in eine + <literal>if</literal>-Anweisung mit alternativer Syntax eingebettet. Der HTML-Bereich wird nur ausgegeben, wenn $a gleich 5 ist. </simpara> <para> @@ -235,23 +242,22 @@ </para> <simpara> Die Bedeutung einer <literal>while</literal>-Anweisung ist einfach. - Sie weist PHP an, einen in ihr eingebetteten Befehl zu - wiederholen, solange die <literal>while</literal>-Bedingung - &true; ist. Der Wert der Bedingung wird - immer am Anfang der Schleife geprüft. Wird der Wert während der - Ausführung der Befehle innerhalb der - <literal>while</literal>-Schleife geändert, endet die Ausführung - dieses Befehls-Blocks nicht vor einem neuem Schleifen-Durchlauf - (Iteration). Jeder Schleifendurchlauf ist eine Iteration. Falls - die <literal>while</literal>-Bedingung bereits zu Beginn - &false; ist, werden die Anweisungen der - <literal>while</literal>-Schleife nicht ein einziges Mal durchlaufen. + Sie weist PHP an, einen in ihr eingebetteten Befehl so lange zu + wiederholen, bis die <literal>while</literal>-Bedingung als &true; + ausgewertet wird. Der Wert der Bedingung wird immer am Anfang der + Schleife geprüft. Wird der Wert während der Ausführung der Anweisungen + innerhalb der <literal>while</literal>-Schleife verändert, endet die + Ausführung dieses Anweisungsblocks erst mit dem Ende der Iteration + (Jeder Schleifendurchlauf ist eine Iteration). Falls die + <literal>while</literal>-Bedingung bereits zu Beginn &false; ist, werden + die Anweisungen der <literal>while</literal>-Schleife nicht ein einziges + Mal durchlaufen. </simpara> <para> Wie bei der <literal>if</literal>-Anweisung kann man mehrere - Befehle innerhalb einer Schleife angeben, indem man sie mit - geschweiften Klammern umschliesst oder die alternative Syntax - gebraucht: + Anweisungen innerhalb der gleichen <literal>while</literal>-Schleife angeben, + indem man sie mit geschweiften Klammern umschliesst oder die alternative + Syntax gebraucht: <informalexample> <programlisting> <![CDATA[ @@ -290,16 +296,17 @@ <sect1 id="control-structures.do.while"> <title><literal>do..while</literal></title> <simpara> - <literal>Do..while</literal>-Schleifen sind den - <literal>while</literal>-Schleifen sehr ähnlich, außer dass die - Erfüllung des Ausdrucks am Ende jedes Durchlaufs geprüft wird - (statt am Anfang). Der Hauptunterschied zu gewöhnlichen - <literal>while</literal>-Schleifen ist, dass der erste - Schleifen-Durchlauf bei <literal>do..while</literal> in jedem - Fall statt findet, wogegen es bei <literal>while</literal>-Schleifen - durchaus passieren kann, dass die Schleife nie durchlaufen wird, - wenn die am Anfang zu prüfende Bedingung schon zu Beginn - &false; ist. + <literal>Do..while</literal>-Schleifen sind den <literal>while</literal> + -Schleifen sehr ähnlich, außer dass der Wahrheitsgehalt des Ausdrucks erst am + Ende jedes Durchlaufs geprüft wird, statt am Anfang. Der Hauptunterschied + zu gewöhnlichen <literal>while</literal>-Schleifen ist der, dass die Schleife + bei <literal>do..while</literal> in jeden Fall einmal durchlaufen wird + (die Bedingung wird erst am Ende einer Iteration geprüft), + wogegen es bei <literal>while</literal>-Schleifen + durchaus passieren kann, dass die Schleife nie durchlaufen wird (die + Bedingung wird immer am Anfang eines Durchlaufs überprüft. Wird diese + Bedingung von Anfang an als &false; ausgewertet endet die Ausführung + der Schleife sofort). </simpara> <para> Es gibt nur eine Syntax für <literal>do..while</literal>-Schleifen: @@ -317,8 +324,8 @@ <simpara> Die obige Schleife wird genau einmal durchlaufen, da nach der ersten Wiederholung die Erfüllung der Bedingung geprüft wird. Da - diese aber nicht erfüllt, also &false; ist ($i - ist nicht grösser als 0), wird die Schleifenausführung beendet. + diese aber nicht erfüllt, also &false; ist ($i ist nicht größer als 0), + wird die Schleifenausführung beendet. </simpara> <para> Erfahrene C-Anwender kennen auch die Möglichkeit, Programm-Blöcke @@ -330,7 +337,7 @@ <![CDATA[ do { if ($i < 5) { - print "i ist nicht gross genug"; + print "i ist nicht groß genug"; break; } $i *= $factor; @@ -348,8 +355,8 @@ </para> <simpara> Es ist nicht weiter tragisch, wenn Sie dieses Beispiel nicht - oder nur zum Teil verstehen. Sie können auch ohne dieses - Feature effektive PHP-Programme und Skripte schreiben. + oder nur zum Teil verstehen. Sie können auch ohne dieses + 'Feature' effektive PHP-Programme und Skripte schreiben. </simpara> </sect1> @@ -368,25 +375,25 @@ </informalexample> </para> <simpara> - Der erste Parameter (<replaceable>ausdr1</replaceable>) wird beim - Schleifenbeginn geprüft bzw. ausgeführt (ohne jegliche Vorbedingung). + Der erste Ausdruck (<replaceable>ausdr1</replaceable>) wird beim + Schleifenbeginn (ohne jegliche Vorbedingung) geprüft bzw. ausgeführt. </simpara> <simpara> Zu Beginn jedes Durchlaufs wird nun <replaceable>ausdr2</replaceable> geprüft. Wenn dieser &true; ist, fährt die Schleife - weiter fort mit der Ausführung der nachfolgenden Befehle. Wenn das - Ergebnis &false; lautet, wird die Schleife beendet. + fort mit der Ausführung der nachfolgenden Anweisung. Ist das + Ergebnis &false;, wird die Schleife beendet. </simpara> <simpara> - Am Ende jedes Durchlaufs wird nun auch noch - <replaceable>ausdr3</replaceable> geprüft / ausgeführt. + Am Ende jedes Durchlaufs wird <replaceable>ausdr3</replaceable> geprüft + (ausgeführt). </simpara> <simpara> - Jeder der Parameter kann leer sein (optional). - Ist <replaceable>ausdr2</replaceable> leer, wird die Schleife - unbestimmt oft durchlaufen, da PHP ihn als &true; - wertet (wie in C). Das ist nicht so sinnlos, wie Sie vielleicht glauben, - weil man häufig eine Schleife erst durch eine bedingte + Jeder Ausdruck kann leer sein. + Ist <replaceable>ausdr2</replaceable> leer, wird die Schleife endlos oft + durchlaufen (PHP wertet diesen, wie in C, implizit als &true;). Das ist + nicht so sinnlos, wie Sie vielleicht glauben, weil man häufig eine + Schleife erst durch eine bedingte <link linkend="control-structures.break"><literal>break</literal> </link>-Anweisung statt durch eine unwahr werdende <literal>for</literal>-Bedingung beenden möchte. @@ -422,7 +429,7 @@ print $i; $i++; } - + /* Beispiel 4 */ for ($i = 1; $i <= 10; print $i, $i++) ; @@ -431,7 +438,7 @@ </informalexample> </para> <simpara> - Selbstverständlich sieht das erste (oder das vierte) Beispiel am + Selbstverständlich sieht das erste (oder vielleicht das vierte) Beispiel am besten aus, aber Sie werden noch feststellen, dass es oftmals ganz nützlich sein kann, leere Parameter in <literal>for</literal>-Schleifen zu verwenden. @@ -463,11 +470,14 @@ <sect1 id="control-structures.foreach"> <title><literal>foreach</literal></title> <para> - PHP 4 (nicht PHP 3) enthält eine <literal>foreach</literal>-Funktion, - genau wie Perl und andere Sprachen. Diese ermöglicht es, auf - einfache Weise ein Array zu durchlaufen. Es gibt zwei - Syntax-Formen; die zweite ist eine unbedeutende aber sinnvolle - Erweiterung der ersten Syntax: + PHP 4 (nicht PHP 3) enthält ein <literal>foreach</literal> Konstrukt, + genau wie Perl und einige andere Sprachen. Diese ermöglicht es, auf + einfache Weise ein Array zu durchlaufen. <literal>foreach</literal> + funktioniert nur in Verbindung mit Arrays. Wenn Sie versuchen + <literal>foreach</literal> mit einer Variable eines anderen Datentyps oder + einer nicht initialisierten Variable zu benutzen, gibt PHP einen Fehler + aus. Es gibt zwei Syntax-Formen; die zweite ist eine unbedeutende, aber + sinnvolle Erweiterung der ersten Syntax: <informalexample> <programlisting> <![CDATA[ @@ -481,7 +491,7 @@ Die erste Form durchläuft das <literal>array_expression</literal>-Array. Bei jedem Durchgang wird der Wert des aktuellen Elements <literal>$value</literal> zugewiesen - und der interne Array-Zeiger um 1 erhöht. Dadurch wird beim nächsten + und der interne Array-Zeiger um eins erhöht. Dadurch wird beim nächsten Durchgang automatisch das nächste Element ausgewertet. </simpara> <simpara> @@ -494,9 +504,9 @@ <para> Sobald <literal>foreach</literal> zum ersten Mal ausgeführt wird, wird der interne Array-Pointer automatisch auf das erste Element - des Arrays zurück gesetzt. Das heisst, dass Sie nicht - <function>reset</function> vor einem Durchlauf von - <literal>foreach</literal> aufrufen müssen. + des Arrays zurück gesetzt. Das bedeutet, dass Sie vor einem Durchlauf + von <literal>foreach</literal> <function>reset</function> nicht + aufrufen müssen. </para> </note> </para> @@ -504,11 +514,20 @@ <note> <para> Beachten Sie auch, dass <literal>foreach</literal> mit einer - Kopie des angegebenen Arrays arbeitet. Deshalb wird auch der - Array-Pointer nicht wie bei dem each-Konstrukt verändert. + Kopie des angegebenen Arrays arbeitet, nicht mit dem Array selbst. + Deshalb wird auch der Array-Pointer nicht wie bei dem + <function>each</function>-Konstrukt verändert. Veränderungen eines + ausgegebenen Arrayelements haben keine Auswirkungen auf das originale + Array. </para> </note> </para> + <note> + <para> + Fehlermeldungen durch den Gebrauch von '@' zu unterdrücken ist bei + <literal>foreach</literal> nicht möglich. + </para> + </note> <para> Beachten Sie, dass die folgenden Beispiele in ihrer Funktionalität identisch sind: @@ -555,11 +574,12 @@ print "Aktueller Wert von \$a: $v.\n"; } -/* foreach Beispiel 2: Wert (mit Ausgabe des Array-Schlüssels) */ +/* foreach Beispiel 2: +Wert (mit Ausgabe des Array-Schlüssels zur Veranschaulichung) */ $a = array (1, 2, 3, 17); -$i = 0; /* nur für Anschauungs-Zweck */ +$i = 0; /* nur zu Veranschaulichung */ foreach($a as $v) { print "\$a[$i] => $v.\n"; @@ -578,6 +598,25 @@ foreach($a as $k => $v) { print "\$a[$k] => $v.\n"; } + +/* foreach Beispiel 4: multidimensionale Arrays */ + +$a[0][0] = "a"; +$a[0][1] = "b"; +$a[1][0] = "y"; +$a[1][1] = "z"; + +foreach($a as $v1) { + foreach ($v1 as $v2) { + print "$v2\n"; + } +} + +/* foreach Beispiel 5: dynamische Arrays */ + +foreach(array(1, 2, 3, 4, 5) as $v) { + print "$v\n"; +} ]]> </programlisting> </informalexample> @@ -588,20 +627,21 @@ <title><literal>break</literal></title> <simpara> <literal>Break</literal> bricht die Ausführung der aktuellen - <literal>for</literal>, <literal>while</literal> oder + <literal>for</literal>, <literal>foreach</literal> + <literal>while</literal>, <literal>do..while</literal> or <literal>switch</literal> Anweisungs-Sequenz ab. </simpara> <simpara> Einem <literal>break</literal> kann optional ein nummerisches Argument angehängt werden, das die Anzahl der abzubrechenden - Befehls-Sequenzen enthält. + Befehls-Sequenzen enthält. </simpara> <para> <informalexample> <programlisting role="php"> <![CDATA[ -$arr = array ('eins', 'zwei', 'drei', 'stop', 'vier'); +$arr = array ('eins', 'zwei', 'drei', 'vier', 'stop', 'fünf'); while (list ( , $val) = each ($arr)) { if ($val == 'stop') { break; /* Man kann hier auch 'break 1;' schreiben. */ @@ -637,8 +677,8 @@ </simpara> <simpara> <literal>Continue</literal> kann optional ein nummerisches - Argument erhalten, das die Anzahl der zu überspringenden - Schleifendurchläufe beinhaltet. + Argument erhalten, das angibt, wieviele Ebenen von enhaltenen Schleifen + übersprungen werden sollen. </simpara> <para> <informalexample> @@ -653,7 +693,7 @@ $i = 0; while ($i++ < 5) { - echo "Aussen<br>\n"; + echo "Außn<br>\n"; while (1) { echo " Mitte<br>\n"; while (1) { @@ -675,14 +715,14 @@ <simpara> Die <literal>switch</literal>-Anweisung ist gleichbedeutend einer Reihe von <literal>if</literal>-Anweisungen mit dem gleichen Parameter. - Häufig wollen Sie ein und die selbe Variable (bzw. den selben Ausdruck) + Häufig wollen Sie ein und dieselbe Variable (bzw. den selben Ausdruck) mit verschiedensten Werten vergleichen und in Abhängigkeit vom Auswertungsergebnis verschiedene Programmteile ausführen. Genau das ermöglicht die <literal>switch</literal>-Anweisung. </simpara> <para> - Die folgenden 2 Beispiele zeigen 2 verschiedene Wege, das gleiche - zu bewirken; eins gebraucht mehrere <literal>if</literal>-Befehle, + Die folgenden zwei Beispiele zeigen zwei verschiedene Wege, das Gleiche + zu bewirken; eines gebraucht mehrere <literal>if</literal>-Anweisungen, das andere eine <literal>switch</literal>-Anweisung: <informalexample> <programlisting role="php"> @@ -719,13 +759,13 @@ Zeile (also Anweisung für Anweisung) abgearbeitet. Zu Beginn wird nichts ausgeführt. Erst wenn bei einem <literal>case</literal>-Teil eine Entsprechung zum <literal>switch</literal>-Ausdruck vorliegt, - werden die darin enthaltenen Befehle ausgeführt. PHP fährt dann - mit der Abarbeitung des restlichen Codes innerhalb des - <literal>switch</literal>-Blocks fort (oder bis zum ersten - Auftreten einer <literal>break</literal>-Anweisung). Ohne + werden die darin enthaltenen Anweisungen von PHP ausgeführt. PHP fährt + dann mit der Abarbeitung des restlichen Codes innerhalb des + <literal>switch</literal>-Blocks fort oder bis zum ersten + Auftreten einer <literal>break</literal>-Anweisung. Ohne <literal>break</literal> am Ende eines case-Teils werden also noch die folgenden case-Blöcke ausgeführt. - Z.B.: + Zum Beispiel: <informalexample> <programlisting role="php"> <![CDATA[ @@ -743,21 +783,21 @@ </para> <simpara> Wenn hier $i gleich 0 ist, würde PHP alle print-Anweisungen - ausführen. Ist $i gleich 1, würden die letzten beiden - print-Befehle ausgeführt und wenn $i = 2 ist, würde nur der - letzte print-Befehl ausgeführt. Deshalb ist es wichtig, bei - der ersten gefundenen Übereinstimmung eine - <literal>break</literal>-Anweisung zu setzen (abgesehen von - bestimmten Fällen, wo genau dieses Verhalten gefordert wird). + ausführen! Ist $i gleich 1, werden die letzten beiden + print-Befehle ausgeführt und wenn $i = 2 ist, wird nur der + letzte print-Befehl ausgeführt. Deshalb ist es wichtig + <literal>break</literal>-Anweisungen zu setzen (abgesehen von + bestimmten Fällen, in denen Sie diese mit Absicht weglassen). </simpara> <simpara> Bei einer <literal>switch</literal>-Anweisung wird die Bedingung also nur einmal überprüft und das Ergebnis mit jeder <literal>case</literal>-Anweisung verglichen. Bei einem <literal>elseif</literal>-Befehl wird die Bedingung neu geprüft. - Eine <literal>switch</literal>-Anweisung kann schneller als - mehrere <literal>if</literal>-Befehle sein, z.B. bei - komplizierteren Bedingungen als einem einfachen Vergleich. + Ist ihre Bedingung komplizierter als ein einfacher Vergleich + und/oder in einer umfangreichen Schleife eingebettet, kann + eine <literal>switch</literal>-Anweisung schneller als + mehrere <literal>if</literal>-Befehle sein. </simpara> <para> Der Anweisungsteil von case kann auch leer sein. Dann wird @@ -779,9 +819,10 @@ </informalexample> </para> <para> - Ein Spezialfall ist die Anweisung default. Diese trifft + Ein Spezialfall ist default. Dieser Fall trifft auf alles zu, was nicht von den voranstehenden case-Ausdrücken - erfasst wurde, wie z.B.: + erfasst wurde und sollte als letzte <literal>case</literal> Anweisung + angegeben werden. Zum Beispiel: <informalexample> <programlisting role="php"> <![CDATA[ @@ -805,15 +846,14 @@ <para> Der <literal>case</literal>-Ausdruck kann eine Prüfung einfacher Typen sein, also von Integer- oder Fließkomma-Zahlen oder von - Strings / Zeichenketten. Arrays oder Objekte können nicht benutzt - werden, es sei denn, sie werden auf einfache Typen herunter - gebrochen. + Strings/Zeichenketten. Arrays oder Objekte können nicht benutzt + werden, es sei denn, sie wurden in einfache Typen umgewandelt. </para> <para> - Die alternative Syntax gilt auch für switch-Sequenzen. Mehr - Informationen dazu unter <link + Die alternative Syntax der Kontrollstrukturen gilt auch für + switch-Sequenzen. Mehr Informationen dazu erhalten Sie unter <link linkend="control-structures.alternative-syntax">Alternative Syntax - für Kontroll-Strukturen</link> . + für Kontroll-Strukturen</link>. <informalexample> <programlisting role="php"> <![CDATA[ @@ -835,546 +875,589 @@ </informalexample> </para> </sect1> - - <sect1 id="function.require"> - <title><function>require</function></title> - <simpara> - Der <function>require</function>-Befehl setzt an seine Stelle - den Inhalt der angegebenen Datei (ähnlich dem #include von C). - </simpara> - <simpara> - Wenn die PHP-Konfigurations-Option "URL fopen wrappers" auf enabled - (per default) steht, können Sie für die mittels - <function>require</function> eingebundene Datei statt einer lokalen - Pfadangabe auch eine URL angeben. Sehen Sie hierzu unter - <link linkend="features.remote-files">Remote-Dateien</link> und - <function>fopen</function> für weitere Informationen nach. - </simpara> - <simpara> - Wichtig: PHP kehrt zu Beginn der per <function>include</function> - oder <function>require</function> eingebundenen Dateien vom - PHP- in den HTML-Modus und am Schluss der Datei wieder vom - HTML- in den PHP-Modus zurück. Falls innerhalb dieser Dateien also - PHP-Code ausgeführt werden soll, muss dieser eingeschlossen werden - von gültigen PHP-Start- und PHP-Ende-Marken (siehe - <link linkend="language.basic-syntax.phpmode">gültige PHP-Start- und - Ende-Tags</link>). - </simpara> - <simpara> - <function>require</function> ist keine PHP-Anweisung, sondern - eine spezielle Sprachanweisung. Sie ist anderen Regeln - unterworfen als Funktionen. Einerseits unterliegt sie keinen - Kontroll-Srukturen, andererseits gibt sie keinen Wert zurück. - Der Versuch, von einem <function>require</function>-Aufruf einen - Rückgabewert zu erhalten, führt zu einem Parse-Fehler. - </simpara> - <simpara> - Anders als <function>include</function> wird - <function>require</function> <emphasis>immer</emphasis> die - angegebene Datei einlesen, <emphasis>auch dann, wenn die - Programmzeile, in der sie steht, nicht ausgeführt wird.</emphasis> - Wenn Sie eine Datei nur bedingt einlesen wollen, benutzen Sie - <function>include</function>. Die bedingte Anweisung würde - <function>require</function> nicht davon abhalten, die Datei zu - laden. - </simpara> - <simpara> - Innerhalb von Schleifen tritt der Effekt auf, dass, obwohl die den - <function>require</function>-Befehl enthaltende Zeile mehrfach - angesprungen wird, die entsprechende Datei trotzdem nur genau - einmal eingelesen (ausgeführt) wird. - </simpara> + + <sect1 id="control-structures.declare"> + <title><literal>declare</literal></title> <para> - Sie können also <function>require</function> nicht innerhalb von - Programm-Schleifen einsetzen. Deshalb, und wenn Sie verschiedene - Dateien einlesen wollen, müssen Sie in Schleifen den Befehl - <function>include</function> benutzen. + Das Sprachkonstrukt <literal>declare</literal> wird dazu verwendet, um + Ausführungsdirektiven für einen Codeblock anzugeben. + Die Schreibweise von <literal>declare</literal> ist der anderer + Kontrollstrukturen ähnlich: <informalexample> - <programlisting role="php"> + <programlisting> <![CDATA[ -require ('header.inc'); +declare (Direktive) Anweisung ]]> </programlisting> </informalexample> </para> - <simpara> - Wird eine Datei per <function>require</function> eingebunden, dann - "erbt" der darin enthaltene Code die bis zur Skriptzeile mit der - <function>require</function>-Anweisung definierten Variablen und - deren Inhalt. Alle innerhalb der eingebundenen Datei Definitionen - von Variablen stehen ab dieser Zeile zur Verfügung. - Steht die <function>require</function>-Anweisung innerhalb einer - Funktion, wird der darin stehende Code behandelt, als ob er - innerhalb der Funktion stehen würde. - </simpara> <para> - Wird die mittels <function>require</function> einzubindende Datei - über HTTP (fopen wrapper) aufgerufen und sieht der Ziel-Server die - Ziel-Datei als PHP-Code ansieht, dann werden die Variablen an die - einzubindende Datei wie bei einem HTTP GET übergeben. Das - entspricht nicht genau der Einbindung einer lokalen Datei, da das - Skript auf dem entfernten Server ausgeführt wird und nur die - Ergebnisse in das lokale Skript eingebunden werden. - <informalexample> - <programlisting role="php"> + Die <literal>Directive</literal> gibt ihnen die Möglichkeit, das + Verhalten des <literal>declare</literal>-Blocks zu bestimmen. + Zur Zeit wird nur eine Direktive erkannt: die <literal>ticks</literal> + (Weiter unten finden Sie mehr Informationen zu den + <link linkend="control-structures.declare.ticks">ticks</link>). + </para> + <para> + Der <literal>Anweisung</literal>steil des <literal>declare</literal>-Blocks + wird ausgeführt - wie genau diese Ausführung passiert und welche + Nebeneffekte während der Ausführung auftreten hängt von der Direktive ab, + die Sie im <literal>directive</literal>-Block angegeben haben. + </para> + + <sect2 id="control-structures.declare.ticks"> + <title>Ticks</title> + <para> + Ein tick ist ein Ereigniss, das bei jedem <replaceable>N</replaceable>-ten + Autreten der low-level Anweisungen innerhalb des + <literal>declare</literal> Blocks, die vom Parser ausgeführt werden, + auftritt. Der Wert von <replaceable>N</replaceable> wird durch die + Angabe von <literal>ticks=<replaceable>N</replaceable></literal> + innerhalb des <literal>declare</literal>-Blocks in dem + <literal>directive</literal> Abschnitt bestimmt. + </para> + <para> + Das Ereignis/die Ereignisse, die bei jedem tick eintreten, legen Sie mit + der Funktion <function>register_tick_function</function> fest. + Weitere Einzelheiten können Sie dem Beispiel unten entnehmen. Beachten + Sie, dass mehr als ein Ereigniss für jeden tick eintreten kann. + </para> + <para> + <example> + <title>Profil eines Bereichs von PHP Code</title> + <programlisting role="php"> <![CDATA[ -/* Dieses Beispiel geht davon aus, dass ein beliebiger Server zum - * Parsen von *.php-Dateien konfiguriert ist. Also meint 'funkt' hier, - * dass die Variablen $vareins und $varzwei innerhalb der angeforderten - * Datei vorhanden sind. */ +<?php +// Funktion, die bei Aufruf die Zeit aufzeichnet +function profile ($dump = FALSE) +{ + static $profile; + + // Rückgabe der gespeicherten Zeit aus profile, danach löschen + if ($dump) { + $temp = $profile; + unset ($profile); + return ($temp); + } + + $profile[] = microtime (); +} -/* Funkt. nicht; file.txt wird vom besagten Server nicht geparst. */ -require ("http://someserver/file.txt?vareins=1&varzwei=2"); +// Einen tick handler bestimmen +register_tick_function("profile"); -/* Funkt. nicht; schaut nach einer lokalen Datei namens -/* 'file.php?varone=1&vartwo=2' */ -require ("file.php?vareins=1&varzwei=2"); +// Funktion vor dem declare-Block initialisieren +profile (); -/* Funkt. */ -require ("http://someserver/file.php?vareins=1&varzwei=2"); +// Ausführen eines Code-Blocks, jede 2te Anweisung löst einen tick aus -$vareins = 1; -$varzwei = 2; -require ("file.txt"); /* Funkt. */ -require ("file.php"); /* Funkt. */ +declare (ticks=2) { + for ($x = 1; $x < 50; ++$x) { + echo similar_text (md5($x), md5($x*$x)), "<br />;"; + } +} + +// Ausgabe der gespeicherten Daten aus dem Profiler +print_r (profile (TRUE)); +?> ]]> - </programlisting> - </informalexample> + </programlisting> + </example> + Dieses Beispiel 'profiliert' den PHP Code der im 'declare'-Block steht, + indem die Zeit festgehalten wird, zu der jede zweite low-level Anweisung + im Codeblock ausgeführt wird. Diese Information können Sie dazu benutzen, + langsame Bereiche innerhalb bestimmter Codesegmente zu idebtifizieren. + Das gleiche Ziel können Sie auch mit anderen Methoden erreichen: die + Benutzung von ticks ist bequemer und einfacher zu implementieren. </para> <simpara> - In PHP 3 ist es möglich, eine <literal>return</literal>-Anweisung - innerhalb einer per <function>require</function> eingebundenen Datei - auszuführen, solange diese Anweisung im Hauptteil dieser Datei steht. - Die <literal>return</literal>-Anweisung darf nicht in Blöcken (also - innerhalb von geschwungenen Klammern "{}" stehen. In PHP 4 existiert - diese Möglichkeit nicht mehr. Wenn Sie diese dennoch benötigen, sehen - Sie unter <function>include</function> nach. + Ticks sind gut für Debugging, einfaches Multitasking, + Hintergrund I/O und viele andere Aufgaben geeignet. </simpara> <simpara> - Siehe auch <function>include</function>, <function>require_once</function>, - <function>include_once</function>, <function>readfile</function> - und <function>virtual</function>. + Siehe auch <function>register_tick_function</function> und + <function>unregister_tick_function</function>. </simpara> + </sect2> </sect1> - - <sect1 id="function.include"> - <title><function>include</function></title> + + <sect1 id="function.return"> + <title>return</title> <simpara> - Die <function>include</function>-Anweisung liest die angegebene Datei - ein und wertet sie aus. - </simpara> + Wird die<function>return</function> Anweisung innerhalb einer Funktion + aufgerufen, wird die Ausführung der Funktion sofort beendet und das + Argument als Wert des Funktionsaufrufs zurückgegeben. + <function>return</function> beendet auch die Ausführung einer + <function>eval</function> Anbweisung oder einer Skriptdatei. + </simpara> + <simpara> + Erfolgt der Aufruf innerhalb des globalen Bereichs, wird die Ausführung + des aktuellen Skripts beendet. Wurde das aktuelle Skript + <function>include</function>ed oder <function>require</function>ed, wird + die Kontrolle an das aufrufende Skript zurückgegeben. Wurde das + aktuelle Skript <function>include</function>ed, wird der Wert, der + <function>return</function> zugewiesen wurde, als Wert des Aufrufs + von <function>include</function> zurückgegeben. + Wird <function>return</function> inerhalb des Hauptskripts aufgerufen, + wird die Ausführung beendet. Handelt es sich bei dem Skript um eine + Datei, die über die Einträge + <link linkend="ini.auto-prepend-file">auto_prepend_file</link> + oder <link linkend="ini.auto-append-file">auto_append_file</link> + in der <link linkend="configuration.file">Konfigurationsdatei</link> + aufgerufen wurde, wird die Ausführung dieses Skripts beendet. + </simpara> + <note> + <simpara> + Beachten Sie, dass <function>return</function> ein Sprachkonstrukt und + keine Funktion ist. Deshalb brauchen Sie die KLammern um die Argumente + <emphasis>nicht</emphasis> zu schreiben -- tatsächlich ist es eher + gebräuchlich diese wegzulassen als die Klammern zu benutzen, obwohl es + keinen Unterschied ausmacht. + </simpara> + </note> + </sect1> + + <sect1 id="function.require"> + <title><function>require</function></title> <simpara> - Wenn die PHP-Konfigurations-Option "URL fopen wrappers" auf enabled - (per default) steht, können Sie für die mittels - <function>include</function> eingebundene Datei statt einer lokalen - Pfadangabe auch eine URL angeben. Sehen Sie hierzu unter - <link linkend="features.remote-files">Remote-Dateien</link> und - <function>fopen</function> für weitere Informationen nach. + Die <function>require</function> Anweisung bindet eine Datei ein und führt + diese aus. </simpara> <simpara> - Wichtig ist, dass beim <function>include</function>- oder - <function>require</function>-Befehl vom PHP-Parsing-Modus in den - HTML-Modus geschaltet wird und bei Rückkehr in das aufrufende Skript - wieder zurück vom HTML- in den PHP-Modus. Deshalb muss jeder - PHP-Code innerhalb der eingebundenen Dateien umschlossen werden von - <link linkend="language.basic-syntax.phpmode">gültigen - PHP-Start- und Ende-Tags</link>. + <function>require</function> bindet eine Datei ein und führt + diese aus. Genaue Informationen wie die Einbindung funktioniert ist in + der Dokumentation für <function>include</function> beschrieben. + </simpara> + <simpara> + <function>require</function> und <function>include</function> + sind in jeder Hinsicht gleichwertig mit der einen Ausnahme: der + Umgang mit Fehlern. <function>include</function> erzeugt ein + <link linkend="internal.e-warning">Warning</link> während + <function>require</function> in einem <link linkend="internal.e-error"> + Fatal Error</link> endet. Mit anderen Worten: scheuen Sie sich nicht, + <function>require</function> zu benutzen, wenn Sie möchten, dass eine + fehlende Datei die Ausführung ihres Skripts beendet. + <function>include</function> verhält sich anders, ihr Skript wird + weiterhin ausgeführt. Stellen Sie außerdem sicher, dass Sie einen gültigen + <link linkend="ini.include-path">include_path</link> gesetzt haben. </simpara> <para> - Das passiert jedes Mal, sobald die - <function>include</function>-Anweisung auftritt. Deshalb können Sie - <function>include</function> auch sehr gut innerhalb von Schleifen - verwenden, um eine Anzahl unterschiedlicher Dateien einzubinden. - <informalexample> - <programlisting role="php"> -<![CDATA[ -$files = array ('first.inc', 'second.inc', 'third.inc'); -for ($i = 0; $i < count($files); $i++) { - include $files[$i]; -} -]]> - </programlisting> - </informalexample> - </para> - <para> - <function>include</function> unterscheidet sich von - <function>require</function> dadurch, dass die include-Anweisung - jedesmal neu ausgewertet wird, sobald sie auftritt (und nur zur - Ausführungszeit). Dagegen wird die - <function>require</function>-Anweisung beim ersten Auftreten mit - der angegebenen Datei ersetzt, egal ob sie einzubinden ist oder - nicht (innerhalb von bedingten Anweisungen, z.B. bei - <link linkend="control-structures.if">if</link> auch dann, wenn - das ausgewertete Argument &false; ergeben hat). - </para> - <para> - Da <function>include</function> ein spezieller Sprach-Konstrukt - ist, müssen Sie ihn innerhalb einer bedingten Anweisung in einen - Anweisungsblock setzen. - <informalexample> + <example> + <title>Grundlegende <function>require</function> Beispiele</title> <programlisting role="php"> <![CDATA[ -/* Das ist falsch und führt nicht zum gewünschten Ergebnis. */ - -if ($Bedingung) - include($diesedatei); -else - include($anderedatei); - -/* Diese ist korrekt. */ +<?php -if ($Bedingung) { - include($diesedatei); -} else { - include($anderedatei); -} +require 'prepend.php'; + +require $somefile; + +require ('somefile.txt'); + +?> ]]> </programlisting> - </informalexample> + </example> </para> <simpara> - Sowohl in PHP 3 als auch in PHP 4 ist es möglich, eine - <literal>return</literal>-Anweisung innerhalb einer - <function>include</function>eten Datei anzugeben, um die - Ausführung dieser Datei abzubrechen und zum aufrufenden-Skript - zurück zu kehren. Es gibt aber ein paar Unterschiede in der - Arbeitsweise. Der erste ist, dass bei PHP 3 die - <literal>return</literal>-Anweisung nicht innerhalb eines Blocks - auftreten darf, es sei denn, es ist ein Funktions-Block. In - diesem Fall gilt <literal>return</literal> für diese Funktion - und nicht für die ganze Datei. In PHP 4 gibt es diese Beschränkung - nicht. PHP 4 erlaubt ihnen auch die Rückgabe von Werten bei - <function>include</function>eten Dateien. Sie können den Wert des - <function>include</function>-Aufrufs nutzen, als wenn Sie eine - Funktion aufgerufen hätten. Das wird in PHP 3 einen Parse-Error - ergeben. + Weitere Beispiele finden Sie in der Dokumentation zu + <function>include</function>. </simpara> - <example> - <title><function>include</function> in PHP 3 und PHP 4</title> - <para> - Beachten Sie, dass die folgende Datei, genannt - <filename>test.inc</filename> im gleichen Verzeichnis wie die - Hauptdatei stehen muss: - <programlisting role="php"> -<![CDATA[ -<?php -echo "Vor dem Return <br>\n"; -if (1) { - return 27; -} -echo "Nach dem Return <br>\n"; -?> -]]> - </programlisting> - </para> - <para> - Die Datei <filename>main.html</filename> enthält folgendes: - <programlisting role="php"> + <note> + <simpara> + Für frühere Versionen als PHP 4.0.2 gilt folgendes: + <function>require</function> wird immer versuchen die Zieldatei zu lesen, + selbst wenn die Zeile in der die Anweisung steht, nie ausgeführt wird. Eine + bedingte Anweisung hat keine Auswirkungen auf <function>require</function>. + Wenn jedoch die Zeile in der <function>require</function> steht, nie + ausgeführt wird, wird auch der Code der Zieldatei nie ausgeführt werden. + Ähnliches gilt für Schleifenstrukturen, diese beeinflussen das Verhalten + von <function>require</function> nicht. Obwohl der Code, der in der + Zieldatei enthalten ist, zur Schleife gehört, wird + <function>require</function> selbst nur einmal ausgeführt. + </simpara> + </note> + &warn.no-win32-fopen-wrapper; + <simpara> + Siehe auch <function>include</function>, <function>require_once</function>, + <function>include_once</function>, <function>eval</function>, + <function>file</function>, <function>readfile</function>, + <function>virtual</function> und <link linkend="ini.include-path">include_path</link>. + </simpara> + </sect1> + + <sect1 id="function.include"> + <title><function>include</function></title> + <simpara> + Die <function>include</function>-Anweisung bindet die angegebene Datei + ein und wertet sie aus. + </simpara> + <simpara> + Die untenstehende Dokumentation gilt ebenso für + <function>require</function>. Diese beiden Konstrukte sind in jeder + Hinsicht gleichwertig mit der einen Ausnahme: der Umgang mit Fehlern. + <function>include</function> erzeugt ein + <link linkend="internal.e-warning">Warning</link> während + <function>require</function> in einem <link linkend="internal.e-error"> + Fatal Error</link> endet. Mit anderen Worten, verwenden Sie + <function>require</function>, wenn Sie möchten, dass eine + fehlende Datei die Ausführung ihres Skripts beendet. + <function>include</function> verhält sich anders, ihr Skript wird + weiterhin ausgeführt. Stellen Sie außerdem sicher, dass Sie einen gültigen + <link linkend="ini.include-path">include_path</link> gesetzt + haben. + </simpara> + <simpara> + Wenn eine Datei eingebunden wird, erbt der enthaltene Code den + <link linkend="language.variables.scope">Geltungsbereich von Variablen</link> + der Zeile in der die Anweisung steht. Ab dieser Zeile stehen alle verfügbaren + Variablen in der aufgerufenen Datei im aufrufenden Skript zur Verfügung. + </simpara> + <para> + <example> + <title>Grundlegende <function>include</function> Beispiel</title> + <programlisting role="php"> <![CDATA[ +vars.php <?php -$retval = include ('test.inc'); -echo "Datei gibt zurück: '$retval'<br>\n"; + +$color = 'green'; +$fruit = 'appel'; + ?> -]]> - </programlisting> - </para> - <para> - Sobald <filename>main.html</filename> in PHP 3 aufgerufen wird, - wird ein Parse-Error in Zeile 2 angezeigt; Sie können in PHP 3 - also keinen Rückgabewert von <function>include</function> - erhalten. In PHP 4 wird das Ergebnis sein: - <screen> -Vor dem Return -Datei gibt zurück: '27' - </screen> - </para> - <para> - Die Datei <filename>main.html</filename> soll nun folgendes - enthalten: - <programlisting role="php"> -<![CDATA[ + +test.php <?php -include ('test.inc'); -echo "Zurück in main.html<br>\n"; + +echo "A $color $fruit"; // A + +include 'vars.php'; + +echo "A $color $fruit"; // A green apple + ?> ]]> - </programlisting> - </para> - <para> - In PHP 4 wird die Ausgabe sein: - <screen> -Vor dem Return -Zurück in main.html - </screen> - PHP 3 wird dagegen folgendes ausgeben: - <screen> -Vor dem Return -27Zurück in main.html - -Parse error: parse error in /home/torben/public_html/phptest/main.html on line 5 - </screen> - </para> - <para> - Der obige Parse-Error ist das Ergebnis der Tatsache, dass die - <literal>return</literal>-Anweisung innerhalb eines - Nicht-Funktions-Blocks von <filename>test.inc</filename> steht. - Wenn das return ausserhalb diese Blocks zu stehen kommt, wird - die Ausgabe wie folgt aussehen: - <screen> -Before the return -27Back in main.html - </screen> - </para> - <para> - Die '27' entsteht aus der Tatsache, dass PHP 3 keine solchen - Rückgabewerte unterstützt. - </para> - </example> + </programlisting> + </example> + </para> <simpara> - Wird eine Datei per <function>include</function> eingebunden, dann - "erbt" der darin enthaltene Code die bis zur Skriptzeile mit der - <function>include</function>-Anweisung definierten Variablen und - deren Inhalt. Alle innerhalb der eingebundenen Datei Definitionen - von Variablen stehen ab dieser Zeile zur Verfügung. Steht die - <function>include</function>-Anweisung innerhalb einer Funktion, - wird der darin stehende Code behandelt, als ob er innerhalb der - Funktion stehen würde. + Steht include im aufrufenden Skript innerhalb einer Funktion, + verhält sich der gesamte Code der aufgerufenen Datei genau so, + als ob Sie diesen Code innerhalb dieser Funktion definiert hätten. + Aus diesem Grund hat dieser Code den Geltungsbereich der Variablen + dieser Funktion. </simpara> <para> - Wird die mittels <function>include</function> einzubindende Datei - über HTTP (fopen wrapper) aufgerufen und sieht der Ziel-Server die - Ziel-Datei als PHP-Code ansieht, dann werden die Variablen an die - einzubindende Datei wie bei einem HTTP GET übergeben. Das - entspricht nicht genau der Einbindung einer lokalen Datei, da das - Skript auf dem entfernten Server ausgeführt wird und nur die - Ergebnisse in das lokale Skript eingebunden werden. - <informalexample> - <programlisting role="php"> + <example> + <title>Include innerhalb einer Funktion</title> + <programlisting role="php"> <![CDATA[ -/* Dieses Beispiel geht davon aus, dass ein beliebiger Server zum - * Parsen von *.php-Dateien konfiguriert ist. Also meint 'funkt' hier, - * dass die Variablen $vareins und $varzwei innerhalb der angeforderten - * Datei vorhanden sind. */ +<?php + +function foo() +{ +global $color; -/* Funkt. nicht; file.txt wird vom besagten Server nicht geparst. */ -include ("http://someserver/file.txt?vareins=1&varzwei=2"); + include 'vars.php'; -/* Funkt. nicht; schaut nach einer lokalen Datei namens -/* 'file.php?varone=1&vartwo=2' */ -include ("file.php?vareins=1&varzwei=2"); + echo "A $color $fruit"; +} + +/* vars.php ist im Geltungsbereich von foo(), * + * d.h. $fruit steht außerhalb dieses Bereichs * + * NICHT zur Verfügung. $color schon, da wir * + * diese Variable als global definiert haben */ -/* Funkt. */ -include ("http://someserver/file.php?vareins=1&varzwei=2"); +foo(); // A green apple +echo "A $color $fruit"; // A green -$vareins = 1; -$varzwei = 2; -include ("file.txt"); /* Funkt. */ -include ("file.php"); /* Funkt. */ +?> ]]> </programlisting> - </informalexample> + </example> </para> <simpara> - Lassen Sie sich nicht durch die Tatsache irritieren, dass Sie - Dateien auch über HTTP per require oder include einbinden können - (vgl. <link linkend="features.remote-files">Remote files</link>). - Das oben Gesagte behält seine Gültigkeit. - </simpara> - <simpara> - Siehe auch <function>require</function>, - <function>require_once</function>, - <function>include_once</function>, - <function>readfile</function> und <function>virtual</function>. + Beim Einbinden einer Datei wechselt der Parser vom PHP-Modus zu Beginn + der Zieldatei in den HTML-Modus und kehrt am Ende der eingebunden + Datei wieder in den PHP-Modus zurück. Deshalb muss jeglicher Code + innerhalb der eingebundenen Datei, der als PHP-Code ausgeführt werden + soll, von <link linkend="language.basic-syntax.phpmode">gültigen + PHP-Start- und Ende-Tags</link> eingefaßt sein. + </simpara> + <simpara> + Wenn "<link linkend="ini.allow-url-fopen">URL fopen wrappers</link>" + in PHP aktiviert sind (in der Standardkonfiguration ist das der Fall) + können Sie als Pfad der einzubindenden Datei auch eine URL (via HTTP oder + anderen unterstützen Wrappern - eine Liste der unterstützen Protokolle + finden Sie unter <xref linkend="wrappers"/>) statt einer lokalen + Pfadangabe angeben. Falls der Zielserver die Zieldatei als PHP-Code + interpretiert, können Sie an die einzubindende Datei Variablen in einem + Request-String übergeben, genauso wie bei HTTP GET. Streng genommen ist + das nicht das Gleiche, wie diese Datei einzubinden und diesem den + Geltungsbereich des Vater-Skripts zu vererben; das Skript wird auf dem + Remote-Server ausgeführt und danach wird das Ergebnis in das lokale Skript + eingebunden. </simpara> - </sect1> - - <sect1 id="function.require-once"> - <title><function>require_once</function></title> + &warn.no-win32-fopen-wrapper; <para> - Die <function>require_once</function>-Anweisung ersetzt sich selbst - durch die angegebene Datei (ähnlich der C-Preprozessor-Anweisung - <literal>#include</literal>), funktioniert also ähnlich wie die - <function>require</function>-Anweisung. Der Hauptunterschied dazu - liegt in der Tatsache, dass bei <function>require_once</function> - der einzubindende Code genau einmal in das Skript eingefügt wird. - </para> - <para> - Sie erzeugen beispielsweise die folgenden zwei Include-Dateien - <literal>utils.inc</literal> und <literal>foolib.inc</literal>: <example> - <title>utils.inc</title> + <title><function>include</function> über HTTP</title> <programlisting role="php"> <![CDATA[ <?php -define(PHPVERSION, floor(phpversion())); -echo "GLOBALE SIND GUT\n"; -function guterTee() { - return "Oolong-Tee schmeckt gut!"; -} + +/* Dieses Beispiel geht davon aus, dass www.example.com so konfiguriert * + * ist, dass .php-Dateien geparst werden und keine .txt Dateien. Also meint * + * 'Funkt' hier, dass die Variablen $foo und $bar innerhalb der * + * angeforderten Datei zur Verfügung stehen */ + +// Funkt. nicht; file.txt wird von www.example.com nicht als PHP geparst + +include 'http://www.example.com/file.txt?foo=1&bar=2'; + +// Funkt. nicht; schaut nach einer lokalen Datei namens +// 'file.php?foo=1&bar=2' im lokalen Dateisystem + +include 'file.php?foo=1&bar=2'; + +// Funkt +include 'http://www.example.com/file.php?foo=1&bar=2'; + +$foo = 1; +$bar = 2; +include 'file.txt'; // Funkt. +include 'file.php'; // Funkt. + ?> ]]> </programlisting> </example> + Siehe auch <link linkend="features.remote-files"> + Zugriff auf entfernte Dateien</link>, + <function>fopen</function> und <function>file</function> für verwandte + Informationen + </para> + <para> + Da <function>include</function> und <function>require</function> + spezielle Sprachkonstrukte sind, müssen Sie diese innerhalb einer + bedingten Anweisung in einen Anweisungsblock setzen. + </para> + <para> <example> - <title>foolib.inc</title> + <title>include() und bedingte Blöcke</title> <programlisting role="php"> <![CDATA[ <?php -require ("utils.inc"); -function zeigeVar($var) { - if (PHPVERSION == 4) { - print_r($var); - } else { - var_dump($var); - } + +// Das ist FALSCH und führt nicht zum gewünschten Ergebnis. + + +if ($bedingung) + include $datei; +else + include $andere_datei; + + +// Das ist KORREKT. +if ($bedingung) { + include $datei; +} else { + include $andere_datei; } -// es folgen weiter Funktionen ... ?> ]]> </programlisting> </example> - Nun schreiben Sie ein Skript - <literal>cause_error_require.php</literal>: + </para> + <simpara> + Der Umgang mit Returns: Es ist möglich eine <function>return</function> + -Anweisung innerhalb einer eingebunden Datei anzugeben, um die + Ausführung innerhalb dieser Datei abzubrechen und zum aufrufenden Skript + zurück zu kehren. Ebenso ist die Rückgabe von Werten aus einer + eingebunden Datei möglich. Sie können den Wert eines include-Aufrufs auf + die gleiche Art und Weise nutzen, wie Sie es bei einer Funktion machen + würden. + </simpara> + <note> + <simpara> + In PHP 3 darf eine return-Anweisung nicht innerhalb eines Blocks + auftreten, es sei denn, es ist ein Funktions-Block. In diesem Fall gilt + <function>return</function> für diese Funktion und nicht für die ganze + Datei. + </simpara> + </note> + <para> <example> - <title>cause_error_require.php</title> - <programlisting role="php"> + <title><function>include</function> und die <function>return</function> Anweisung</title> + <programlisting role="php"> <![CDATA[ +return.php <?php -require("foolib.inc"); -/* das Folgende erzeugt einen Fehler */ -require("utils.inc"); -$foo = array("1",array("complex","quaternion")); -echo "dies erfordert utils.inc, das auch\n"; -echo "in foolib.inc erforderlich ist\n"; -echo "Aufruf von guterTee: ".guterTee()."\n"; -echo "Ausgabe foo: \n"; -showVar($foo); + +$var = 'PHP'; + +return $var; + ?> -]]> - </programlisting> - </example> - Wenn Sie letzteres starten, wird folgende Ausgabe erzeugt (gilt für - PHP 4.01pl2): - <informalexample> - <programlisting> -<![CDATA[ -GLOBALE SIND GUT -GLOBALE SIND GUT -Fatal error: Cannot redeclare causeerror() in utils.inc on line 5 +noreturn.php +<?php +$var = 'PHP'; + +?> + +testreturns.php +<?php + +$foo = include 'return.php'; + +echo $foo; // gibt 'PHP' aus + +$bar = include 'noreturn.php'; + +echo $bar; // gibt 1 aus + +?> ]]> - </programlisting> - </informalexample> - Durch Umschreiben von <literal>foolib.inc</literal> und - <literal>cause_errror_require.php</literal> (Gebrauch von - <function>require_once</function> statt - <function>require</function>) und Umbenennung des letzten Skriptes - zu <literal>avoid_error_require_once.php</literal> haben wir nun: - <example> - <title>foolib.inc (fixed)</title> - <programlisting role="php"> -<![CDATA[ -... -require_once("utils.inc"); -function showVar($var) { -... -]]> - </programlisting> - </example> - <example> - <title>avoid_error_require_once.php</title> - <programlisting role="php"> -<![CDATA[ -... -require_once("foolib.inc"); -require_once("utils.inc"); -$foo = array("1",array("complex","quaternion")); -... -]]> - </programlisting> + </programlisting> </example> - Beim nachfolgenden Aufruf wird folgende Ausgabe erzeugt (bei PHP - 4.0.1pl2): - <informalexample> - <programlisting> -<![CDATA[ -GLOBALE SIND GUT -dies erfordert utils.inc, das auch -in foolib.inc erforderlich ist -Aufruf von guterTee: Oolong-Tee schmeckt gut!. -Ausgabe foo: -Array -( - [0] => 1 - [1] => Array - ( - [0] => complex - [1] => quaternion - ) - -) -]]> - </programlisting> - </informalexample> </para> + <simpara> + <literal>$bar</literal> hat den Wert <literal>1</literal>, weil include + erfolgreich war. Beachten Sie die Unterschiede in den obigen Beispielen. + Das erste nutzt <function>return</function> innerhalb der eingebundenen + Datei im Gensatzt zum zweiten Beispiel. + Weitere Möglichkeiten Dateien in Variablen "einzubinden" bieten ihnen die + Funktionen <function>fopen</function> und <function>file</function> oder + <function>include</function> im Zusammenspiel mit den + <link linkend="ref.outcontrol">Funktionen zur Ausgabesteuerung</link>. + </simpara> + + <simpara> + Siehe auch <function>require</function>, <function>require_once</function>, + <function>include_once</function>, <function>readfile</function>, + <function>virtual</function>und + <link linkend="ini.include-path">include_path</link>. + </simpara> + </sect1> + + <sect1 id="function.require-once"> + <title><function>require_once</function></title> + <para> + Die <function>require_once</function>-Anweisung bindet eine Datei ein + und führt diese zur Laufzeit des Skripts aus. + Das Verhalten ist ähnlich der <function>require</function>-Anweisung mit + dem einzigen Unterschied, dass einmal eingebundener Code aus einer Datei + nicht nocht einmal eingebunden wird. Lesen Sie die Dokumentation zu + <function>require</function> um mehr Informationen über die Arbeitsweise + dieser Anweisung zu erhalten. + </para> + <para> + <function>require_once</function> sollten Sie in den Fällen benutzen, + wenn die gleiche Datei in einem bestimmten Bereich mehrmals eingebunden + und interpretiert werden soll und Sie sicher stellen wollen, dass diese + Datei nur exakt einmal eingebunden wird, um Probleme mit Wiederholungen + bei Funktions-Definitionen und Wertzuweisungen zu Variablen zu vermeiden, + usw. + </para> + <para> + Weitere Beispiele zu <function>require_once</function> und + <function>include_once</function> können Sie dem + <ulink url="&url.php.pear;">PEAR</ulink>-Code entnehmen, welcher + im aktuellsten PHP-Source-Code enthalten ist. + </para> + <note> <para> - Beachten Sie, dass analog zum Verhalten von - <literal>#include</literal> im C-Preprozessor diese Anweisung zur - Zeit der Skript-"Compilierung" ausgewertet wird; sollten Sie also - z.B. das Skript vor dessen Ausführung parsen und bei der Ausführung - keinen Gebrauch machen wollen von dynamisch einzuschließenden - Teilen, sollten Sie <function>include_once</function> oder - <function>include</function> verwenden. - </para> - <para> - Weiter Beispiele zu <function>require_once</function> und - <function>include_once</function> können Sie dem PEAR-Code - entnehmen, welcher im aktuellsten PHP-Source-Code enthalten ist. + <function>require_once</function> steht ab PHP 4.01pl2 zur + Verfügung. </para> + </note> + <note> + <para> + Beachten Sie, dass auf auf einem Betriebssystem, das nicht zwischen + Groß- und Kleinschreibung unterschiedet (wie z.B. Windows) das Verhalten + von <function>require_once</function> und + <function>include_once</function> nicht unbedingt ihren Erwartungen + entspricht. + <example> + <title><function>require_once</function> und Groß-/Kleinschreibung</title> + <programlisting role="php"> +<![CDATA[ +require_once("a.php"); // bindet a.php ein +require_once("A.php"); // bindet a.php auf Windows nochmal ein! +]]> + </programlisting> + </example> + </para> + </note> + &warn.no-win32-fopen-wrapper; <para> Siehe auch: <function>require</function>, <function>include</function>, <function>include_once</function>, <function>get_required_files</function>, <function>get_included_files</function>, - <function>readfile</function>, + <function>readfile</function> und <function>virtual</function>. </para> </sect1> - + <sect1 id="function.include-once"> <title><function>include_once</function></title> <para> - Die Anweisung <function>include_once</function> schließt zur - Ausführungszeit das angegebene Skript ein und führt es aus. Dies + Die Anweisung <function>include_once</function> schließt zur + Ausführungszeit die angegebene Datei ein und wertet diese aus. Dies ist ähnlich der <function>include</function>-Anweisung; mit dem - Unterschied, dass einmal "includierter" Code nicht nochmals - eingebunden wird. + Unterschied, dass einmal eingebundener Code nicht nochmals + eingebunden wird. Wie der Name vermuten lässt, wird ie Datei nur ein + einziges Mal eingebunden. </para> <para> - Wie in der Beschreibung zu <function>require_once</function> - bereits angemerkt, soll <function>include_once</function> in den - Fällen verwendet werden, wo die selbe Datei mehr als einmal - während der Ausführung eingebunden werden soll und Sie - Wiederholungen bei den Funktions-Definitionen und Wertzuweisungen - zu Variablen usw. vermeiden müssen. + <function>include_once</function> sollten Sie in den Fällen benutzen, + wenn die gleiche Datei in einem bestimmten Bereich mehrmals eingebunden + und interpretiert werden soll und Sie sicher stellen wollen, dass diese + Datei nur exakt einmal eingebunden wird, um Probleme mit Wiederholungen + bei Funktions-Definitionen und Wertzuweisungen zu Variablen zu vermeiden, + usw. </para> <para> - Weiter Beispiele zu <function>require_once</function> und - <function>include_once</function> können Sie dem PEAR-Code - entnehmen, welcher im aktuellsten PHP-Source-Code enthalten ist. + Weitere Beispiele zu <function>require_once</function> und + <function>include_once</function> können Sie dem + <ulink url="&url.php.pear;">PEAR</ulink>-Code entnehmen, welcher + im aktuellsten PHP-Source-Code enthalten ist. </para> + <note> <para> <function>include_once</function> steht ab PHP 4.01pl2 zur Verfügung. </para> + </note> + <note> + <para> + Beachten Sie, dass auf auf einem Betriebssystem, das nicht zwischen + Groß- und Kleinschreibung unterschiedet (wie z.B. Windows) das Verhalten + von <function>include_once</function> und + <function>require_once</function> nicht unbedingt ihren Erwartungen + entspricht. + <example> + <title><function>include_once</function> und Groß-/Kleinschreibung</title> + <programlisting role="php"> +<![CDATA[ +include_once("a.php"); // bindet a.php ein +include_once("A.php"); // bindet a.php auf Windows nochmal ein! +]]> + </programlisting> + </example> + </para> + </note> + &warn.no-win32-fopen-wrapper; <para> - Siehe auch: <function>require</function>, - <function>include</function>, <function>require_once</function>, - <function>get_required_files</function>, - <function>get_included_files</function>, - <function>readfile</function> und <function>virtual</function>. + Siehe auch <function>include</function>, + <function>require</function>, <function>require_once</function>, + <function>get_required_files</function>, + <function>get_included_files</function>, <function>readfile</function> + und <function>virtual</function>. </para> </sect1>
Index: phpdoc-de/language/control-structures.xml diff -u phpdoc-de/language/control-structures.xml:1.29 phpdoc-de/language/control-structures.xml:1.30 --- phpdoc-de/language/control-structures.xml:1.29 Fri Oct 4 15:54:48 2002 +++ phpdoc-de/language/control-structures.xml Sat Oct 12 05:33:17 2002 @@ -1,14 +1,16 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- $Revision: 1.29 $ --> -<!-- EN-Revision: 1.22 Maintainer: tzwenny Status: ready --> +<!-- $Revision: 1.30 $ --> +<!-- EN-Revision: 1.65 Maintainer: betz Status: ready --> +<!-- CREDITS: tzwenny --> + <chapter id="control-structures"> <title>Kontroll-Strukturen</title> <simpara> Jedes PHP-Skript besteht aus einer Reihe von Anweisungen. Eine - Anweisung kann aus einem Funktions-Aufruf, einer Schleife, einer + Anweisung kann aus einem Funktionsaufruf, einer Schleife, einer bedingten Anweisung oder einem Befehl, der nichts macht (eine - leere Anweisung), bestehen. Jeder Befehl endet gewöhnlich mit - einem Semikolon. Darüber hinaus können Befehle zu einer + leere Anweisung), bestehen. Jede Anweisung endet gewöhnlich mit + einem Semikolon. Darüber hinaus können Anweisungen zu einer Anweisungsgruppe zusammengefasst werden, welche durch geschweifte Klammern begrenzt wird. Eine Anweisungsgruppe ist auch eine Anweisung. Die unterschiedlichen Arten von Anweisungen werden in @@ -18,11 +20,11 @@ <sect1 id="control-structures.if"> <title><literal>if</literal></title> <para> - Der <literal>if</literal>-Befehl ist eine der wichtigsten + Das <literal>if</literal>-Konstrukt ist eine der wichtigsten Möglichkeiten vieler Programmier-Sprachen, PHP eingeschlossen. - Er erlaubt die bedingte Ausführung von Programmteilen. PHP - beinhaltet eine <literal>if</literal>-Struktur, die ähnlich der - C-Programmiersprache ist: + Es erlaubt die bedingte Ausführung von Programmteilen. PHP + kennt eine <literal>if</literal>-Struktur, die ähnlich der + Programmiersprache C ist: <informalexample> <programlisting> <![CDATA[ @@ -33,21 +35,24 @@ </informalexample> </para> <simpara> - Wie im Abschnitt über Expressions / Ausdrücke beschrieben, - wird ausdr auf seinen wirklichen Wertinhalt ausgewertet. Wenn - <replaceable>ausdr</replaceable> &true; - entspricht, wird PHP Anweisung ausführen, falls nicht - sie - also &false; ist - wird Anweisung übergangen. + Wie im Abschnitt über + <link linkend="language.expressions">Ausdrücke</link> beschrieben, wird + <replaceable>ausdr</replaceable> auf seinen boolschen Wertinhalt + ausgewertet. Wenn <replaceable>ausdr</replaceable> als &true; ausgewertet + wird, führt PHP die <replaceable>Anweisung</replaceable> aus, falls die + Auswertung &false; ergibt, wird sie übergangen. Mehr Informationen welche + Werte als &false; ausgewertet werden finden Sie im Abschnitt + <link linkend="language.types.boolean.casting">'Umwandlung nach boolean'</link>. </simpara> <para> - Das folgende Beispiel wird <computeroutput>a ist grösser als b - </computeroutput>anzeigen, wenn <replaceable>$a</replaceable> - grösser ist als <replaceable>$b</replaceable>: + Das folgende Beispiel wird <computeroutput>a ist größer als b + </computeroutput>anzeigen, wenn <replaceable>$a</replaceable> + größer als <replaceable>$b</replaceable> ist: <informalexample> <programlisting role="php"> <![CDATA[ if ($a > $b) - print "a ist grösser als b"; + print "a ist größer als b"; ]]> </programlisting> </informalexample> @@ -58,16 +63,16 @@ jede Anweisung mit einer <literal>if</literal>-Bedingung zu versehen. Statt dessen können Sie mehrere Anweisungen in Gruppen zusammenfassen. Z.B. wird der folgende Programm-Code - <computeroutput>a ist grösser als b</computeroutput> anzeigen, - wenn <replaceable>$a</replaceable> grösser ist als - <replaceable>$b</replaceable>. Danach wird der Wert von + <computeroutput>a ist größer als b</computeroutput> anzeigen, + wenn <replaceable>$a</replaceable> größer als + <replaceable>$b</replaceable> ist. Danach wird der Wert von <replaceable>$a</replaceable> in <replaceable>$b</replaceable> gespeichert: <informalexample> <programlisting role="php"> <![CDATA[ if ($a > $b) { - print "a ist grösser als b"; + print "a ist größer als b"; $b = $a; } ]]> @@ -75,7 +80,7 @@ </informalexample> </para> <simpara> - If-Anweisungen können ohne Einschränkung innerhalb anderer + <literal>If</literal>-Anweisungen können beliebig oft innerhalb anderer <literal>if</literal>-Anweisungen definiert werden. Das ermöglicht ihnen völlige Flexibilität bei der bedingten Ausführung verschiedenster Programmteile. @@ -91,18 +96,18 @@ <literal>Else</literal> erweitert eine <literal>if</literal>-Anweisung um die Ausführung von Anweisungen, sobald der Ausdruck der <literal>if</literal>-Anweisung als - &false; angesehen wird. Der folgende Code wird - z.B. <computeroutput>a ist grösser als b</computeroutput> anzeigen, - wenn <replaceable>$a</replaceable> grösser ist als + &false; ausgewertet wird. Der folgende Code wird z.B. + <computeroutput>a ist größer als b</computeroutput> anzeigen, + wenn <replaceable>$a</replaceable> größer ist als <replaceable>$b</replaceable>, anderenfalls - <computeroutput>a ist NICHT grösser als b</computeroutput>: + <computeroutput>a ist NICHT größer als b</computeroutput>: <informalexample> <programlisting role="php"> <![CDATA[ if ($a > $b) { - print "a ist grösser als b"; + print "a ist größer als b"; } else { - print "a ist NICHT grösser als b"; + print "a ist NICHT größer als b"; } ]]> </programlisting> @@ -125,18 +130,18 @@ <literal>if</literal>-Anweisung um die Ausführung anderer Anweisungen, sobald die normale <literal>if</literal>-Bedingung als &false; angesehen wird. Anders als bei - <literal>else</literal> wird die Ausführung dieser anderen + <literal>else</literal> wird die Ausführung dieser alternativen Anweisungen nur durchgeführt, wenn die bei <literal>elseif</literal> angegebene alternative Bedingung als &true; angesehen wird. Der folgende Code wird - z.B. <computeroutput>a ist grösser als b</computeroutput>, + z.B. <computeroutput>a ist größer als b</computeroutput>, <computeroutput>a ist gleich b</computeroutput> oder <computeroutput>a ist kleiner als b</computeroutput> ausgeben: <informalexample> <programlisting role="php"> <![CDATA[ if ($a > $b) { - print "a ist grösser als b"; + print "a ist größer als b"; } elseif ($a == $b) { print "a ist gleich b"; } else { @@ -152,15 +157,17 @@ <literal>elseif</literal>-Bedingung (falls vorhanden), die &true; ist, wird ausgeführt. In PHP kann man auch 'else if' schreiben (zwei Wörter). Das Verhalten ist - identisch zu 'elseif' (ein Wort), genau wie in C. + identisch zu 'elseif' (ein Wort). Die Bedeutung der Syntax ist leicht + unterschiedlich (falls Sie mit C vertraut sind, das ist das gleiche + Verhalten) aber der Grundtenor ist der, dass beide Schreibweisen, bezogen + auf das Ergebnis, sich exakt gleich verhalten. </simpara> <simpara> Die <literal>elseif</literal>-Anweisung wird nur ausgeführt, - wenn die vorausgehende <literal>if</literal>-Bedingung sowie + wenn die vorausgehende <literal>if</literal>-Bedingung sowie jede vorherige <literal>elseif</literal>-Bedingung &false; ist und die aktuelle - <literal>elseif</literal>-Bedingung &true; - ist. + <literal>elseif</literal>-Bedingung &true; ist. </simpara> </sect1> @@ -174,8 +181,8 @@ Immer muss die öffnende Klammer durch einen Doppelpunkt ":" und die schließende Klammer durch ein <literal>endif;</literal>, <literal>endwhile;</literal>, - <literal>endfor;</literal>, <literal>endforeach;</literal> - bzw. <literal>endswitch;</literal> ersetzt werden. + <literal>endfor;</literal>, <literal>endforeach;</literal> + oder <literal>endswitch;</literal> ersetzt werden. <informalexample> <programlisting role="php"> <![CDATA[ @@ -187,8 +194,8 @@ </informalexample> </para> <simpara> - Im obigen Beispiel ist der HTML-Bereich eingebettet in eine - <literal>if</literal>-Anweisung mit alternativer Syntax. + Im obigen Beispiel ist der HTML-Bereich "A ist gleich 5" in eine + <literal>if</literal>-Anweisung mit alternativer Syntax eingebettet. Der HTML-Bereich wird nur ausgegeben, wenn $a gleich 5 ist. </simpara> <para> @@ -235,23 +242,22 @@ </para> <simpara> Die Bedeutung einer <literal>while</literal>-Anweisung ist einfach. - Sie weist PHP an, einen in ihr eingebetteten Befehl zu - wiederholen, solange die <literal>while</literal>-Bedingung - &true; ist. Der Wert der Bedingung wird - immer am Anfang der Schleife geprüft. Wird der Wert während der - Ausführung der Befehle innerhalb der - <literal>while</literal>-Schleife geändert, endet die Ausführung - dieses Befehls-Blocks nicht vor einem neuem Schleifen-Durchlauf - (Iteration). Jeder Schleifendurchlauf ist eine Iteration. Falls - die <literal>while</literal>-Bedingung bereits zu Beginn - &false; ist, werden die Anweisungen der - <literal>while</literal>-Schleife nicht ein einziges Mal durchlaufen. + Sie weist PHP an, einen in ihr eingebetteten Befehl so lange zu + wiederholen, bis die <literal>while</literal>-Bedingung als &true; + ausgewertet wird. Der Wert der Bedingung wird immer am Anfang der + Schleife geprüft. Wird der Wert während der Ausführung der Anweisungen + innerhalb der <literal>while</literal>-Schleife verändert, endet die + Ausführung dieses Anweisungsblocks erst mit dem Ende der Iteration + (Jeder Schleifendurchlauf ist eine Iteration). Falls die + <literal>while</literal>-Bedingung bereits zu Beginn &false; ist, werden + die Anweisungen der <literal>while</literal>-Schleife nicht ein einziges + Mal durchlaufen. </simpara> <para> Wie bei der <literal>if</literal>-Anweisung kann man mehrere - Befehle innerhalb einer Schleife angeben, indem man sie mit - geschweiften Klammern umschliesst oder die alternative Syntax - gebraucht: + Anweisungen innerhalb der gleichen <literal>while</literal>-Schleife angeben, + indem man sie mit geschweiften Klammern umschliesst oder die alternative + Syntax gebraucht: <informalexample> <programlisting> <![CDATA[ @@ -290,16 +296,17 @@ <sect1 id="control-structures.do.while"> <title><literal>do..while</literal></title> <simpara> - <literal>Do..while</literal>-Schleifen sind den - <literal>while</literal>-Schleifen sehr ähnlich, außer dass die - Erfüllung des Ausdrucks am Ende jedes Durchlaufs geprüft wird - (statt am Anfang). Der Hauptunterschied zu gewöhnlichen - <literal>while</literal>-Schleifen ist, dass der erste - Schleifen-Durchlauf bei <literal>do..while</literal> in jedem - Fall statt findet, wogegen es bei <literal>while</literal>-Schleifen - durchaus passieren kann, dass die Schleife nie durchlaufen wird, - wenn die am Anfang zu prüfende Bedingung schon zu Beginn - &false; ist. + <literal>Do..while</literal>-Schleifen sind den <literal>while</literal> + -Schleifen sehr ähnlich, außer dass der Wahrheitsgehalt des Ausdrucks erst am + Ende jedes Durchlaufs geprüft wird, statt am Anfang. Der Hauptunterschied + zu gewöhnlichen <literal>while</literal>-Schleifen ist der, dass die Schleife + bei <literal>do..while</literal> in jeden Fall einmal durchlaufen wird + (die Bedingung wird erst am Ende einer Iteration geprüft), + wogegen es bei <literal>while</literal>-Schleifen + durchaus passieren kann, dass die Schleife nie durchlaufen wird (die + Bedingung wird immer am Anfang eines Durchlaufs überprüft. Wird diese + Bedingung von Anfang an als &false; ausgewertet endet die Ausführung + der Schleife sofort). </simpara> <para> Es gibt nur eine Syntax für <literal>do..while</literal>-Schleifen: @@ -317,8 +324,8 @@ <simpara> Die obige Schleife wird genau einmal durchlaufen, da nach der ersten Wiederholung die Erfüllung der Bedingung geprüft wird. Da - diese aber nicht erfüllt, also &false; ist ($i - ist nicht grösser als 0), wird die Schleifenausführung beendet. + diese aber nicht erfüllt, also &false; ist ($i ist nicht größer als 0), + wird die Schleifenausführung beendet. </simpara> <para> Erfahrene C-Anwender kennen auch die Möglichkeit, Programm-Blöcke @@ -330,7 +337,7 @@ <![CDATA[ do { if ($i < 5) { - print "i ist nicht gross genug"; + print "i ist nicht groß genug"; break; } $i *= $factor; @@ -348,8 +355,8 @@ </para> <simpara> Es ist nicht weiter tragisch, wenn Sie dieses Beispiel nicht - oder nur zum Teil verstehen. Sie können auch ohne dieses - Feature effektive PHP-Programme und Skripte schreiben. + oder nur zum Teil verstehen. Sie können auch ohne dieses + 'Feature' effektive PHP-Programme und Skripte schreiben. </simpara> </sect1> @@ -368,25 +375,25 @@ </informalexample> </para> <simpara> - Der erste Parameter (<replaceable>ausdr1</replaceable>) wird beim - Schleifenbeginn geprüft bzw. ausgeführt (ohne jegliche Vorbedingung). + Der erste Ausdruck (<replaceable>ausdr1</replaceable>) wird beim + Schleifenbeginn (ohne jegliche Vorbedingung) geprüft bzw. ausgeführt. </simpara> <simpara> Zu Beginn jedes Durchlaufs wird nun <replaceable>ausdr2</replaceable> geprüft. Wenn dieser &true; ist, fährt die Schleife - weiter fort mit der Ausführung der nachfolgenden Befehle. Wenn das - Ergebnis &false; lautet, wird die Schleife beendet. + fort mit der Ausführung der nachfolgenden Anweisung. Ist das + Ergebnis &false;, wird die Schleife beendet. </simpara> <simpara> - Am Ende jedes Durchlaufs wird nun auch noch - <replaceable>ausdr3</replaceable> geprüft / ausgeführt. + Am Ende jedes Durchlaufs wird <replaceable>ausdr3</replaceable> geprüft + (ausgeführt). </simpara> <simpara> - Jeder der Parameter kann leer sein (optional). - Ist <replaceable>ausdr2</replaceable> leer, wird die Schleife - unbestimmt oft durchlaufen, da PHP ihn als &true; - wertet (wie in C). Das ist nicht so sinnlos, wie Sie vielleicht glauben, - weil man häufig eine Schleife erst durch eine bedingte + Jeder Ausdruck kann leer sein. + Ist <replaceable>ausdr2</replaceable> leer, wird die Schleife endlos oft + durchlaufen (PHP wertet diesen, wie in C, implizit als &true;). Das ist + nicht so sinnlos, wie Sie vielleicht glauben, weil man häufig eine + Schleife erst durch eine bedingte <link linkend="control-structures.break"><literal>break</literal> </link>-Anweisung statt durch eine unwahr werdende <literal>for</literal>-Bedingung beenden möchte. @@ -422,7 +429,7 @@ print $i; $i++; } - + /* Beispiel 4 */ for ($i = 1; $i <= 10; print $i, $i++) ; @@ -431,7 +438,7 @@ </informalexample> </para> <simpara> - Selbstverständlich sieht das erste (oder das vierte) Beispiel am + Selbstverständlich sieht das erste (oder vielleicht das vierte) Beispiel am besten aus, aber Sie werden noch feststellen, dass es oftmals ganz nützlich sein kann, leere Parameter in <literal>for</literal>-Schleifen zu verwenden. @@ -463,11 +470,14 @@ <sect1 id="control-structures.foreach"> <title><literal>foreach</literal></title> <para> - PHP 4 (nicht PHP 3) enthält eine <literal>foreach</literal>-Funktion, - genau wie Perl und andere Sprachen. Diese ermöglicht es, auf - einfache Weise ein Array zu durchlaufen. Es gibt zwei - Syntax-Formen; die zweite ist eine unbedeutende aber sinnvolle - Erweiterung der ersten Syntax: + PHP 4 (nicht PHP 3) enthält ein <literal>foreach</literal> Konstrukt, + genau wie Perl und einige andere Sprachen. Diese ermöglicht es, auf + einfache Weise ein Array zu durchlaufen. <literal>foreach</literal> + funktioniert nur in Verbindung mit Arrays. Wenn Sie versuchen + <literal>foreach</literal> mit einer Variable eines anderen Datentyps oder + einer nicht initialisierten Variable zu benutzen, gibt PHP einen Fehler + aus. Es gibt zwei Syntax-Formen; die zweite ist eine unbedeutende, aber + sinnvolle Erweiterung der ersten Syntax: <informalexample> <programlisting> <![CDATA[ @@ -481,7 +491,7 @@ Die erste Form durchläuft das <literal>array_expression</literal>-Array. Bei jedem Durchgang wird der Wert des aktuellen Elements <literal>$value</literal> zugewiesen - und der interne Array-Zeiger um 1 erhöht. Dadurch wird beim nächsten + und der interne Array-Zeiger um eins erhöht. Dadurch wird beim nächsten Durchgang automatisch das nächste Element ausgewertet. </simpara> <simpara> @@ -494,9 +504,9 @@ <para> Sobald <literal>foreach</literal> zum ersten Mal ausgeführt wird, wird der interne Array-Pointer automatisch auf das erste Element - des Arrays zurück gesetzt. Das heisst, dass Sie nicht - <function>reset</function> vor einem Durchlauf von - <literal>foreach</literal> aufrufen müssen. + des Arrays zurück gesetzt. Das bedeutet, dass Sie vor einem Durchlauf + von <literal>foreach</literal> <function>reset</function> nicht + aufrufen müssen. </para> </note> </para> @@ -504,11 +514,20 @@ <note> <para> Beachten Sie auch, dass <literal>foreach</literal> mit einer - Kopie des angegebenen Arrays arbeitet. Deshalb wird auch der - Array-Pointer nicht wie bei dem each-Konstrukt verändert. + Kopie des angegebenen Arrays arbeitet, nicht mit dem Array selbst. + Deshalb wird auch der Array-Pointer nicht wie bei dem + <function>each</function>-Konstrukt verändert. Veränderungen eines + ausgegebenen Arrayelements haben keine Auswirkungen auf das originale + Array. </para> </note> </para> + <note> + <para> + Fehlermeldungen durch den Gebrauch von '@' zu unterdrücken ist bei + <literal>foreach</literal> nicht möglich. + </para> + </note> <para> Beachten Sie, dass die folgenden Beispiele in ihrer Funktionalität identisch sind: @@ -555,11 +574,12 @@ print "Aktueller Wert von \$a: $v.\n"; } -/* foreach Beispiel 2: Wert (mit Ausgabe des Array-Schlüssels) */ +/* foreach Beispiel 2: +Wert (mit Ausgabe des Array-Schlüssels zur Veranschaulichung) */ $a = array (1, 2, 3, 17); -$i = 0; /* nur für Anschauungs-Zweck */ +$i = 0; /* nur zu Veranschaulichung */ foreach($a as $v) { print "\$a[$i] => $v.\n"; @@ -578,6 +598,25 @@ foreach($a as $k => $v) { print "\$a[$k] => $v.\n"; } + +/* foreach Beispiel 4: multidimensionale Arrays */ + +$a[0][0] = "a"; +$a[0][1] = "b"; +$a[1][0] = "y"; +$a[1][1] = "z"; + +foreach($a as $v1) { + foreach ($v1 as $v2) { + print "$v2\n"; + } +} + +/* foreach Beispiel 5: dynamische Arrays */ + +foreach(array(1, 2, 3, 4, 5) as $v) { + print "$v\n"; +} ]]> </programlisting> </informalexample> @@ -588,20 +627,21 @@ <title><literal>break</literal></title> <simpara> <literal>Break</literal> bricht die Ausführung der aktuellen - <literal>for</literal>, <literal>while</literal> oder + <literal>for</literal>, <literal>foreach</literal> + <literal>while</literal>, <literal>do..while</literal> or <literal>switch</literal> Anweisungs-Sequenz ab. </simpara> <simpara> Einem <literal>break</literal> kann optional ein nummerisches Argument angehängt werden, das die Anzahl der abzubrechenden - Befehls-Sequenzen enthält. + Befehls-Sequenzen enthält. </simpara> <para> <informalexample> <programlisting role="php"> <![CDATA[ -$arr = array ('eins', 'zwei', 'drei', 'stop', 'vier'); +$arr = array ('eins', 'zwei', 'drei', 'vier', 'stop', 'fünf'); while (list ( , $val) = each ($arr)) { if ($val == 'stop') { break; /* Man kann hier auch 'break 1;' schreiben. */ @@ -637,8 +677,8 @@ </simpara> <simpara> <literal>Continue</literal> kann optional ein nummerisches - Argument erhalten, das die Anzahl der zu überspringenden - Schleifendurchläufe beinhaltet. + Argument erhalten, das angibt, wieviele Ebenen von enhaltenen Schleifen + übersprungen werden sollen. </simpara> <para> <informalexample> @@ -653,7 +693,7 @@ $i = 0; while ($i++ < 5) { - echo "Aussen<br>\n"; + echo "Außn<br>\n"; while (1) { echo " Mitte<br>\n"; while (1) { @@ -675,14 +715,14 @@ <simpara> Die <literal>switch</literal>-Anweisung ist gleichbedeutend einer Reihe von <literal>if</literal>-Anweisungen mit dem gleichen Parameter. - Häufig wollen Sie ein und die selbe Variable (bzw. den selben Ausdruck) + Häufig wollen Sie ein und dieselbe Variable (bzw. den selben Ausdruck) mit verschiedensten Werten vergleichen und in Abhängigkeit vom Auswertungsergebnis verschiedene Programmteile ausführen. Genau das ermöglicht die <literal>switch</literal>-Anweisung. </simpara> <para> - Die folgenden 2 Beispiele zeigen 2 verschiedene Wege, das gleiche - zu bewirken; eins gebraucht mehrere <literal>if</literal>-Befehle, + Die folgenden zwei Beispiele zeigen zwei verschiedene Wege, das Gleiche + zu bewirken; eines gebraucht mehrere <literal>if</literal>-Anweisungen, das andere eine <literal>switch</literal>-Anweisung: <informalexample> <programlisting role="php"> @@ -719,13 +759,13 @@ Zeile (also Anweisung für Anweisung) abgearbeitet. Zu Beginn wird nichts ausgeführt. Erst wenn bei einem <literal>case</literal>-Teil eine Entsprechung zum <literal>switch</literal>-Ausdruck vorliegt, - werden die darin enthaltenen Befehle ausgeführt. PHP fährt dann - mit der Abarbeitung des restlichen Codes innerhalb des - <literal>switch</literal>-Blocks fort (oder bis zum ersten - Auftreten einer <literal>break</literal>-Anweisung). Ohne + werden die darin enthaltenen Anweisungen von PHP ausgeführt. PHP fährt + dann mit der Abarbeitung des restlichen Codes innerhalb des + <literal>switch</literal>-Blocks fort oder bis zum ersten + Auftreten einer <literal>break</literal>-Anweisung. Ohne <literal>break</literal> am Ende eines case-Teils werden also noch die folgenden case-Blöcke ausgeführt. - Z.B.: + Zum Beispiel: <informalexample> <programlisting role="php"> <![CDATA[ @@ -743,21 +783,21 @@ </para> <simpara> Wenn hier $i gleich 0 ist, würde PHP alle print-Anweisungen - ausführen. Ist $i gleich 1, würden die letzten beiden - print-Befehle ausgeführt und wenn $i = 2 ist, würde nur der - letzte print-Befehl ausgeführt. Deshalb ist es wichtig, bei - der ersten gefundenen Übereinstimmung eine - <literal>break</literal>-Anweisung zu setzen (abgesehen von - bestimmten Fällen, wo genau dieses Verhalten gefordert wird). + ausführen! Ist $i gleich 1, werden die letzten beiden + print-Befehle ausgeführt und wenn $i = 2 ist, wird nur der + letzte print-Befehl ausgeführt. Deshalb ist es wichtig + <literal>break</literal>-Anweisungen zu setzen (abgesehen von + bestimmten Fällen, in denen Sie diese mit Absicht weglassen). </simpara> <simpara> Bei einer <literal>switch</literal>-Anweisung wird die Bedingung also nur einmal überprüft und das Ergebnis mit jeder <literal>case</literal>-Anweisung verglichen. Bei einem <literal>elseif</literal>-Befehl wird die Bedingung neu geprüft. - Eine <literal>switch</literal>-Anweisung kann schneller als - mehrere <literal>if</literal>-Befehle sein, z.B. bei - komplizierteren Bedingungen als einem einfachen Vergleich. + Ist ihre Bedingung komplizierter als ein einfacher Vergleich + und/oder in einer umfangreichen Schleife eingebettet, kann + eine <literal>switch</literal>-Anweisung schneller als + mehrere <literal>if</literal>-Befehle sein. </simpara> <para> Der Anweisungsteil von case kann auch leer sein. Dann wird @@ -779,9 +819,10 @@ </informalexample> </para> <para> - Ein Spezialfall ist die Anweisung default. Diese trifft + Ein Spezialfall ist default. Dieser Fall trifft auf alles zu, was nicht von den voranstehenden case-Ausdrücken - erfasst wurde, wie z.B.: + erfasst wurde und sollte als letzte <literal>case</literal> Anweisung + angegeben werden. Zum Beispiel: <informalexample> <programlisting role="php"> <![CDATA[ @@ -805,15 +846,14 @@ <para> Der <literal>case</literal>-Ausdruck kann eine Prüfung einfacher Typen sein, also von Integer- oder Fließkomma-Zahlen oder von - Strings / Zeichenketten. Arrays oder Objekte können nicht benutzt - werden, es sei denn, sie werden auf einfache Typen herunter - gebrochen. + Strings/Zeichenketten. Arrays oder Objekte können nicht benutzt + werden, es sei denn, sie wurden in einfache Typen umgewandelt. </para> <para> - Die alternative Syntax gilt auch für switch-Sequenzen. Mehr - Informationen dazu unter <link + Die alternative Syntax der Kontrollstrukturen gilt auch für + switch-Sequenzen. Mehr Informationen dazu erhalten Sie unter <link linkend="control-structures.alternative-syntax">Alternative Syntax - für Kontroll-Strukturen</link> . + für Kontroll-Strukturen</link>. <informalexample> <programlisting role="php"> <![CDATA[ @@ -835,546 +875,589 @@ </informalexample> </para> </sect1> - - <sect1 id="function.require"> - <title><function>require</function></title> - <simpara> - Der <function>require</function>-Befehl setzt an seine Stelle - den Inhalt der angegebenen Datei (ähnlich dem #include von C). - </simpara> - <simpara> - Wenn die PHP-Konfigurations-Option "URL fopen wrappers" auf enabled - (per default) steht, können Sie für die mittels - <function>require</function> eingebundene Datei statt einer lokalen - Pfadangabe auch eine URL angeben. Sehen Sie hierzu unter - <link linkend="features.remote-files">Remote-Dateien</link> und - <function>fopen</function> für weitere Informationen nach. - </simpara> - <simpara> - Wichtig: PHP kehrt zu Beginn der per <function>include</function> - oder <function>require</function> eingebundenen Dateien vom - PHP- in den HTML-Modus und am Schluss der Datei wieder vom - HTML- in den PHP-Modus zurück. Falls innerhalb dieser Dateien also - PHP-Code ausgeführt werden soll, muss dieser eingeschlossen werden - von gültigen PHP-Start- und PHP-Ende-Marken (siehe - <link linkend="language.basic-syntax.phpmode">gültige PHP-Start- und - Ende-Tags</link>). - </simpara> - <simpara> - <function>require</function> ist keine PHP-Anweisung, sondern - eine spezielle Sprachanweisung. Sie ist anderen Regeln - unterworfen als Funktionen. Einerseits unterliegt sie keinen - Kontroll-Srukturen, andererseits gibt sie keinen Wert zurück. - Der Versuch, von einem <function>require</function>-Aufruf einen - Rückgabewert zu erhalten, führt zu einem Parse-Fehler. - </simpara> - <simpara> - Anders als <function>include</function> wird - <function>require</function> <emphasis>immer</emphasis> die - angegebene Datei einlesen, <emphasis>auch dann, wenn die - Programmzeile, in der sie steht, nicht ausgeführt wird.</emphasis> - Wenn Sie eine Datei nur bedingt einlesen wollen, benutzen Sie - <function>include</function>. Die bedingte Anweisung würde - <function>require</function> nicht davon abhalten, die Datei zu - laden. - </simpara> - <simpara> - Innerhalb von Schleifen tritt der Effekt auf, dass, obwohl die den - <function>require</function>-Befehl enthaltende Zeile mehrfach - angesprungen wird, die entsprechende Datei trotzdem nur genau - einmal eingelesen (ausgeführt) wird. - </simpara> + + <sect1 id="control-structures.declare"> + <title><literal>declare</literal></title> <para> - Sie können also <function>require</function> nicht innerhalb von - Programm-Schleifen einsetzen. Deshalb, und wenn Sie verschiedene - Dateien einlesen wollen, müssen Sie in Schleifen den Befehl - <function>include</function> benutzen. + Das Sprachkonstrukt <literal>declare</literal> wird dazu verwendet, um + Ausführungsdirektiven für einen Codeblock anzugeben. + Die Schreibweise von <literal>declare</literal> ist der anderer + Kontrollstrukturen ähnlich: <informalexample> - <programlisting role="php"> + <programlisting> <![CDATA[ -require ('header.inc'); +declare (Direktive) Anweisung ]]> </programlisting> </informalexample> </para> - <simpara> - Wird eine Datei per <function>require</function> eingebunden, dann - "erbt" der darin enthaltene Code die bis zur Skriptzeile mit der - <function>require</function>-Anweisung definierten Variablen und - deren Inhalt. Alle innerhalb der eingebundenen Datei Definitionen - von Variablen stehen ab dieser Zeile zur Verfügung. - Steht die <function>require</function>-Anweisung innerhalb einer - Funktion, wird der darin stehende Code behandelt, als ob er - innerhalb der Funktion stehen würde. - </simpara> <para> - Wird die mittels <function>require</function> einzubindende Datei - über HTTP (fopen wrapper) aufgerufen und sieht der Ziel-Server die - Ziel-Datei als PHP-Code ansieht, dann werden die Variablen an die - einzubindende Datei wie bei einem HTTP GET übergeben. Das - entspricht nicht genau der Einbindung einer lokalen Datei, da das - Skript auf dem entfernten Server ausgeführt wird und nur die - Ergebnisse in das lokale Skript eingebunden werden. - <informalexample> - <programlisting role="php"> + Die <literal>Directive</literal> gibt ihnen die Möglichkeit, das + Verhalten des <literal>declare</literal>-Blocks zu bestimmen. + Zur Zeit wird nur eine Direktive erkannt: die <literal>ticks</literal> + (Weiter unten finden Sie mehr Informationen zu den + <link linkend="control-structures.declare.ticks">ticks</link>). + </para> + <para> + Der <literal>Anweisung</literal>steil des <literal>declare</literal>-Blocks + wird ausgeführt - wie genau diese Ausführung passiert und welche + Nebeneffekte während der Ausführung auftreten hängt von der Direktive ab, + die Sie im <literal>directive</literal>-Block angegeben haben. + </para> + + <sect2 id="control-structures.declare.ticks"> + <title>Ticks</title> + <para> + Ein tick ist ein Ereigniss, das bei jedem <replaceable>N</replaceable>-ten + Autreten der low-level Anweisungen innerhalb des + <literal>declare</literal> Blocks, die vom Parser ausgeführt werden, + auftritt. Der Wert von <replaceable>N</replaceable> wird durch die + Angabe von <literal>ticks=<replaceable>N</replaceable></literal> + innerhalb des <literal>declare</literal>-Blocks in dem + <literal>directive</literal> Abschnitt bestimmt. + </para> + <para> + Das Ereignis/die Ereignisse, die bei jedem tick eintreten, legen Sie mit + der Funktion <function>register_tick_function</function> fest. + Weitere Einzelheiten können Sie dem Beispiel unten entnehmen. Beachten + Sie, dass mehr als ein Ereigniss für jeden tick eintreten kann. + </para> + <para> + <example> + <title>Profil eines Bereichs von PHP Code</title> + <programlisting role="php"> <![CDATA[ -/* Dieses Beispiel geht davon aus, dass ein beliebiger Server zum - * Parsen von *.php-Dateien konfiguriert ist. Also meint 'funkt' hier, - * dass die Variablen $vareins und $varzwei innerhalb der angeforderten - * Datei vorhanden sind. */ +<?php +// Funktion, die bei Aufruf die Zeit aufzeichnet +function profile ($dump = FALSE) +{ + static $profile; + + // Rückgabe der gespeicherten Zeit aus profile, danach löschen + if ($dump) { + $temp = $profile; + unset ($profile); + return ($temp); + } + + $profile[] = microtime (); +} -/* Funkt. nicht; file.txt wird vom besagten Server nicht geparst. */ -require ("http://someserver/file.txt?vareins=1&varzwei=2"); +// Einen tick handler bestimmen +register_tick_function("profile"); -/* Funkt. nicht; schaut nach einer lokalen Datei namens -/* 'file.php?varone=1&vartwo=2' */ -require ("file.php?vareins=1&varzwei=2"); +// Funktion vor dem declare-Block initialisieren +profile (); -/* Funkt. */ -require ("http://someserver/file.php?vareins=1&varzwei=2"); +// Ausführen eines Code-Blocks, jede 2te Anweisung löst einen tick aus -$vareins = 1; -$varzwei = 2; -require ("file.txt"); /* Funkt. */ -require ("file.php"); /* Funkt. */ +declare (ticks=2) { + for ($x = 1; $x < 50; ++$x) { + echo similar_text (md5($x), md5($x*$x)), "<br />;"; + } +} + +// Ausgabe der gespeicherten Daten aus dem Profiler +print_r (profile (TRUE)); +?> ]]> - </programlisting> - </informalexample> + </programlisting> + </example> + Dieses Beispiel 'profiliert' den PHP Code der im 'declare'-Block steht, + indem die Zeit festgehalten wird, zu der jede zweite low-level Anweisung + im Codeblock ausgeführt wird. Diese Information können Sie dazu benutzen, + langsame Bereiche innerhalb bestimmter Codesegmente zu idebtifizieren. + Das gleiche Ziel können Sie auch mit anderen Methoden erreichen: die + Benutzung von ticks ist bequemer und einfacher zu implementieren. </para> <simpara> - In PHP 3 ist es möglich, eine <literal>return</literal>-Anweisung - innerhalb einer per <function>require</function> eingebundenen Datei - auszuführen, solange diese Anweisung im Hauptteil dieser Datei steht. - Die <literal>return</literal>-Anweisung darf nicht in Blöcken (also - innerhalb von geschwungenen Klammern "{}" stehen. In PHP 4 existiert - diese Möglichkeit nicht mehr. Wenn Sie diese dennoch benötigen, sehen - Sie unter <function>include</function> nach. + Ticks sind gut für Debugging, einfaches Multitasking, + Hintergrund I/O und viele andere Aufgaben geeignet. </simpara> <simpara> - Siehe auch <function>include</function>, <function>require_once</function>, - <function>include_once</function>, <function>readfile</function> - und <function>virtual</function>. + Siehe auch <function>register_tick_function</function> und + <function>unregister_tick_function</function>. </simpara> + </sect2> </sect1> - - <sect1 id="function.include"> - <title><function>include</function></title> + + <sect1 id="function.return"> + <title>return</title> <simpara> - Die <function>include</function>-Anweisung liest die angegebene Datei - ein und wertet sie aus. - </simpara> + Wird die<function>return</function> Anweisung innerhalb einer Funktion + aufgerufen, wird die Ausführung der Funktion sofort beendet und das + Argument als Wert des Funktionsaufrufs zurückgegeben. + <function>return</function> beendet auch die Ausführung einer + <function>eval</function> Anbweisung oder einer Skriptdatei. + </simpara> + <simpara> + Erfolgt der Aufruf innerhalb des globalen Bereichs, wird die Ausführung + des aktuellen Skripts beendet. Wurde das aktuelle Skript + <function>include</function>ed oder <function>require</function>ed, wird + die Kontrolle an das aufrufende Skript zurückgegeben. Wurde das + aktuelle Skript <function>include</function>ed, wird der Wert, der + <function>return</function> zugewiesen wurde, als Wert des Aufrufs + von <function>include</function> zurückgegeben. + Wird <function>return</function> inerhalb des Hauptskripts aufgerufen, + wird die Ausführung beendet. Handelt es sich bei dem Skript um eine + Datei, die über die Einträge + <link linkend="ini.auto-prepend-file">auto_prepend_file</link> + oder <link linkend="ini.auto-append-file">auto_append_file</link> + in der <link linkend="configuration.file">Konfigurationsdatei</link> + aufgerufen wurde, wird die Ausführung dieses Skripts beendet. + </simpara> + <note> + <simpara> + Beachten Sie, dass <function>return</function> ein Sprachkonstrukt und + keine Funktion ist. Deshalb brauchen Sie die KLammern um die Argumente + <emphasis>nicht</emphasis> zu schreiben -- tatsächlich ist es eher + gebräuchlich diese wegzulassen als die Klammern zu benutzen, obwohl es + keinen Unterschied ausmacht. + </simpara> + </note> + </sect1> + + <sect1 id="function.require"> + <title><function>require</function></title> <simpara> - Wenn die PHP-Konfigurations-Option "URL fopen wrappers" auf enabled - (per default) steht, können Sie für die mittels - <function>include</function> eingebundene Datei statt einer lokalen - Pfadangabe auch eine URL angeben. Sehen Sie hierzu unter - <link linkend="features.remote-files">Remote-Dateien</link> und - <function>fopen</function> für weitere Informationen nach. + Die <function>require</function> Anweisung bindet eine Datei ein und führt + diese aus. </simpara> <simpara> - Wichtig ist, dass beim <function>include</function>- oder - <function>require</function>-Befehl vom PHP-Parsing-Modus in den - HTML-Modus geschaltet wird und bei Rückkehr in das aufrufende Skript - wieder zurück vom HTML- in den PHP-Modus. Deshalb muss jeder - PHP-Code innerhalb der eingebundenen Dateien umschlossen werden von - <link linkend="language.basic-syntax.phpmode">gültigen - PHP-Start- und Ende-Tags</link>. + <function>require</function> bindet eine Datei ein und führt + diese aus. Genaue Informationen wie die Einbindung funktioniert ist in + der Dokumentation für <function>include</function> beschrieben. + </simpara> + <simpara> + <function>require</function> und <function>include</function> + sind in jeder Hinsicht gleichwertig mit der einen Ausnahme: der + Umgang mit Fehlern. <function>include</function> erzeugt ein + <link linkend="internal.e-warning">Warning</link> während + <function>require</function> in einem <link linkend="internal.e-error"> + Fatal Error</link> endet. Mit anderen Worten: scheuen Sie sich nicht, + <function>require</function> zu benutzen, wenn Sie möchten, dass eine + fehlende Datei die Ausführung ihres Skripts beendet. + <function>include</function> verhält sich anders, ihr Skript wird + weiterhin ausgeführt. Stellen Sie außerdem sicher, dass Sie einen gültigen + <link linkend="ini.include-path">include_path</link> gesetzt haben. </simpara> <para> - Das passiert jedes Mal, sobald die - <function>include</function>-Anweisung auftritt. Deshalb können Sie - <function>include</function> auch sehr gut innerhalb von Schleifen - verwenden, um eine Anzahl unterschiedlicher Dateien einzubinden. - <informalexample> - <programlisting role="php"> -<![CDATA[ -$files = array ('first.inc', 'second.inc', 'third.inc'); -for ($i = 0; $i < count($files); $i++) { - include $files[$i]; -} -]]> - </programlisting> - </informalexample> - </para> - <para> - <function>include</function> unterscheidet sich von - <function>require</function> dadurch, dass die include-Anweisung - jedesmal neu ausgewertet wird, sobald sie auftritt (und nur zur - Ausführungszeit). Dagegen wird die - <function>require</function>-Anweisung beim ersten Auftreten mit - der angegebenen Datei ersetzt, egal ob sie einzubinden ist oder - nicht (innerhalb von bedingten Anweisungen, z.B. bei - <link linkend="control-structures.if">if</link> auch dann, wenn - das ausgewertete Argument &false; ergeben hat). - </para> - <para> - Da <function>include</function> ein spezieller Sprach-Konstrukt - ist, müssen Sie ihn innerhalb einer bedingten Anweisung in einen - Anweisungsblock setzen. - <informalexample> + <example> + <title>Grundlegende <function>require</function> Beispiele</title> <programlisting role="php"> <![CDATA[ -/* Das ist falsch und führt nicht zum gewünschten Ergebnis. */ - -if ($Bedingung) - include($diesedatei); -else - include($anderedatei); - -/* Diese ist korrekt. */ +<?php -if ($Bedingung) { - include($diesedatei); -} else { - include($anderedatei); -} +require 'prepend.php'; + +require $somefile; + +require ('somefile.txt'); + +?> ]]> </programlisting> - </informalexample> + </example> </para> <simpara> - Sowohl in PHP 3 als auch in PHP 4 ist es möglich, eine - <literal>return</literal>-Anweisung innerhalb einer - <function>include</function>eten Datei anzugeben, um die - Ausführung dieser Datei abzubrechen und zum aufrufenden-Skript - zurück zu kehren. Es gibt aber ein paar Unterschiede in der - Arbeitsweise. Der erste ist, dass bei PHP 3 die - <literal>return</literal>-Anweisung nicht innerhalb eines Blocks - auftreten darf, es sei denn, es ist ein Funktions-Block. In - diesem Fall gilt <literal>return</literal> für diese Funktion - und nicht für die ganze Datei. In PHP 4 gibt es diese Beschränkung - nicht. PHP 4 erlaubt ihnen auch die Rückgabe von Werten bei - <function>include</function>eten Dateien. Sie können den Wert des - <function>include</function>-Aufrufs nutzen, als wenn Sie eine - Funktion aufgerufen hätten. Das wird in PHP 3 einen Parse-Error - ergeben. + Weitere Beispiele finden Sie in der Dokumentation zu + <function>include</function>. </simpara> - <example> - <title><function>include</function> in PHP 3 und PHP 4</title> - <para> - Beachten Sie, dass die folgende Datei, genannt - <filename>test.inc</filename> im gleichen Verzeichnis wie die - Hauptdatei stehen muss: - <programlisting role="php"> -<![CDATA[ -<?php -echo "Vor dem Return <br>\n"; -if (1) { - return 27; -} -echo "Nach dem Return <br>\n"; -?> -]]> - </programlisting> - </para> - <para> - Die Datei <filename>main.html</filename> enthält folgendes: - <programlisting role="php"> + <note> + <simpara> + Für frühere Versionen als PHP 4.0.2 gilt folgendes: + <function>require</function> wird immer versuchen die Zieldatei zu lesen, + selbst wenn die Zeile in der die Anweisung steht, nie ausgeführt wird. Eine + bedingte Anweisung hat keine Auswirkungen auf <function>require</function>. + Wenn jedoch die Zeile in der <function>require</function> steht, nie + ausgeführt wird, wird auch der Code der Zieldatei nie ausgeführt werden. + Ähnliches gilt für Schleifenstrukturen, diese beeinflussen das Verhalten + von <function>require</function> nicht. Obwohl der Code, der in der + Zieldatei enthalten ist, zur Schleife gehört, wird + <function>require</function> selbst nur einmal ausgeführt. + </simpara> + </note> + &warn.no-win32-fopen-wrapper; + <simpara> + Siehe auch <function>include</function>, <function>require_once</function>, + <function>include_once</function>, <function>eval</function>, + <function>file</function>, <function>readfile</function>, + <function>virtual</function> und <link linkend="ini.include-path">include_path</link>. + </simpara> + </sect1> + + <sect1 id="function.include"> + <title><function>include</function></title> + <simpara> + Die <function>include</function>-Anweisung bindet die angegebene Datei + ein und wertet sie aus. + </simpara> + <simpara> + Die untenstehende Dokumentation gilt ebenso für + <function>require</function>. Diese beiden Konstrukte sind in jeder + Hinsicht gleichwertig mit der einen Ausnahme: der Umgang mit Fehlern. + <function>include</function> erzeugt ein + <link linkend="internal.e-warning">Warning</link> während + <function>require</function> in einem <link linkend="internal.e-error"> + Fatal Error</link> endet. Mit anderen Worten, verwenden Sie + <function>require</function>, wenn Sie möchten, dass eine + fehlende Datei die Ausführung ihres Skripts beendet. + <function>include</function> verhält sich anders, ihr Skript wird + weiterhin ausgeführt. Stellen Sie außerdem sicher, dass Sie einen gültigen + <link linkend="ini.include-path">include_path</link> gesetzt + haben. + </simpara> + <simpara> + Wenn eine Datei eingebunden wird, erbt der enthaltene Code den + <link linkend="language.variables.scope">Geltungsbereich von Variablen</link> + der Zeile in der die Anweisung steht. Ab dieser Zeile stehen alle verfügbaren + Variablen in der aufgerufenen Datei im aufrufenden Skript zur Verfügung. + </simpara> + <para> + <example> + <title>Grundlegende <function>include</function> Beispiel</title> + <programlisting role="php"> <![CDATA[ +vars.php <?php -$retval = include ('test.inc'); -echo "Datei gibt zurück: '$retval'<br>\n"; + +$color = 'green'; +$fruit = 'appel'; + ?> -]]> - </programlisting> - </para> - <para> - Sobald <filename>main.html</filename> in PHP 3 aufgerufen wird, - wird ein Parse-Error in Zeile 2 angezeigt; Sie können in PHP 3 - also keinen Rückgabewert von <function>include</function> - erhalten. In PHP 4 wird das Ergebnis sein: - <screen> -Vor dem Return -Datei gibt zurück: '27' - </screen> - </para> - <para> - Die Datei <filename>main.html</filename> soll nun folgendes - enthalten: - <programlisting role="php"> -<![CDATA[ + +test.php <?php -include ('test.inc'); -echo "Zurück in main.html<br>\n"; + +echo "A $color $fruit"; // A + +include 'vars.php'; + +echo "A $color $fruit"; // A green apple + ?> ]]> - </programlisting> - </para> - <para> - In PHP 4 wird die Ausgabe sein: - <screen> -Vor dem Return -Zurück in main.html - </screen> - PHP 3 wird dagegen folgendes ausgeben: - <screen> -Vor dem Return -27Zurück in main.html - -Parse error: parse error in /home/torben/public_html/phptest/main.html on line 5 - </screen> - </para> - <para> - Der obige Parse-Error ist das Ergebnis der Tatsache, dass die - <literal>return</literal>-Anweisung innerhalb eines - Nicht-Funktions-Blocks von <filename>test.inc</filename> steht. - Wenn das return ausserhalb diese Blocks zu stehen kommt, wird - die Ausgabe wie folgt aussehen: - <screen> -Before the return -27Back in main.html - </screen> - </para> - <para> - Die '27' entsteht aus der Tatsache, dass PHP 3 keine solchen - Rückgabewerte unterstützt. - </para> - </example> + </programlisting> + </example> + </para> <simpara> - Wird eine Datei per <function>include</function> eingebunden, dann - "erbt" der darin enthaltene Code die bis zur Skriptzeile mit der - <function>include</function>-Anweisung definierten Variablen und - deren Inhalt. Alle innerhalb der eingebundenen Datei Definitionen - von Variablen stehen ab dieser Zeile zur Verfügung. Steht die - <function>include</function>-Anweisung innerhalb einer Funktion, - wird der darin stehende Code behandelt, als ob er innerhalb der - Funktion stehen würde. + Steht include im aufrufenden Skript innerhalb einer Funktion, + verhält sich der gesamte Code der aufgerufenen Datei genau so, + als ob Sie diesen Code innerhalb dieser Funktion definiert hätten. + Aus diesem Grund hat dieser Code den Geltungsbereich der Variablen + dieser Funktion. </simpara> <para> - Wird die mittels <function>include</function> einzubindende Datei - über HTTP (fopen wrapper) aufgerufen und sieht der Ziel-Server die - Ziel-Datei als PHP-Code ansieht, dann werden die Variablen an die - einzubindende Datei wie bei einem HTTP GET übergeben. Das - entspricht nicht genau der Einbindung einer lokalen Datei, da das - Skript auf dem entfernten Server ausgeführt wird und nur die - Ergebnisse in das lokale Skript eingebunden werden. - <informalexample> - <programlisting role="php"> + <example> + <title>Include innerhalb einer Funktion</title> + <programlisting role="php"> <![CDATA[ -/* Dieses Beispiel geht davon aus, dass ein beliebiger Server zum - * Parsen von *.php-Dateien konfiguriert ist. Also meint 'funkt' hier, - * dass die Variablen $vareins und $varzwei innerhalb der angeforderten - * Datei vorhanden sind. */ +<?php + +function foo() +{ +global $color; -/* Funkt. nicht; file.txt wird vom besagten Server nicht geparst. */ -include ("http://someserver/file.txt?vareins=1&varzwei=2"); + include 'vars.php'; -/* Funkt. nicht; schaut nach einer lokalen Datei namens -/* 'file.php?varone=1&vartwo=2' */ -include ("file.php?vareins=1&varzwei=2"); + echo "A $color $fruit"; +} + +/* vars.php ist im Geltungsbereich von foo(), * + * d.h. $fruit steht außerhalb dieses Bereichs * + * NICHT zur Verfügung. $color schon, da wir * + * diese Variable als global definiert haben */ -/* Funkt. */ -include ("http://someserver/file.php?vareins=1&varzwei=2"); +foo(); // A green apple +echo "A $color $fruit"; // A green -$vareins = 1; -$varzwei = 2; -include ("file.txt"); /* Funkt. */ -include ("file.php"); /* Funkt. */ +?> ]]> </programlisting> - </informalexample> + </example> </para> <simpara> - Lassen Sie sich nicht durch die Tatsache irritieren, dass Sie - Dateien auch über HTTP per require oder include einbinden können - (vgl. <link linkend="features.remote-files">Remote files</link>). - Das oben Gesagte behält seine Gültigkeit. - </simpara> - <simpara> - Siehe auch <function>require</function>, - <function>require_once</function>, - <function>include_once</function>, - <function>readfile</function> und <function>virtual</function>. + Beim Einbinden einer Datei wechselt der Parser vom PHP-Modus zu Beginn + der Zieldatei in den HTML-Modus und kehrt am Ende der eingebunden + Datei wieder in den PHP-Modus zurück. Deshalb muss jeglicher Code + innerhalb der eingebundenen Datei, der als PHP-Code ausgeführt werden + soll, von <link linkend="language.basic-syntax.phpmode">gültigen + PHP-Start- und Ende-Tags</link> eingefaßt sein. + </simpara> + <simpara> + Wenn "<link linkend="ini.allow-url-fopen">URL fopen wrappers</link>" + in PHP aktiviert sind (in der Standardkonfiguration ist das der Fall) + können Sie als Pfad der einzubindenden Datei auch eine URL (via HTTP oder + anderen unterstützen Wrappern - eine Liste der unterstützen Protokolle + finden Sie unter <xref linkend="wrappers"/>) statt einer lokalen + Pfadangabe angeben. Falls der Zielserver die Zieldatei als PHP-Code + interpretiert, können Sie an die einzubindende Datei Variablen in einem + Request-String übergeben, genauso wie bei HTTP GET. Streng genommen ist + das nicht das Gleiche, wie diese Datei einzubinden und diesem den + Geltungsbereich des Vater-Skripts zu vererben; das Skript wird auf dem + Remote-Server ausgeführt und danach wird das Ergebnis in das lokale Skript + eingebunden. </simpara> - </sect1> - - <sect1 id="function.require-once"> - <title><function>require_once</function></title> + &warn.no-win32-fopen-wrapper; <para> - Die <function>require_once</function>-Anweisung ersetzt sich selbst - durch die angegebene Datei (ähnlich der C-Preprozessor-Anweisung - <literal>#include</literal>), funktioniert also ähnlich wie die - <function>require</function>-Anweisung. Der Hauptunterschied dazu - liegt in der Tatsache, dass bei <function>require_once</function> - der einzubindende Code genau einmal in das Skript eingefügt wird. - </para> - <para> - Sie erzeugen beispielsweise die folgenden zwei Include-Dateien - <literal>utils.inc</literal> und <literal>foolib.inc</literal>: <example> - <title>utils.inc</title> + <title><function>include</function> über HTTP</title> <programlisting role="php"> <![CDATA[ <?php -define(PHPVERSION, floor(phpversion())); -echo "GLOBALE SIND GUT\n"; -function guterTee() { - return "Oolong-Tee schmeckt gut!"; -} + +/* Dieses Beispiel geht davon aus, dass www.example.com so konfiguriert * + * ist, dass .php-Dateien geparst werden und keine .txt Dateien. Also meint * + * 'Funkt' hier, dass die Variablen $foo und $bar innerhalb der * + * angeforderten Datei zur Verfügung stehen */ + +// Funkt. nicht; file.txt wird von www.example.com nicht als PHP geparst + +include 'http://www.example.com/file.txt?foo=1&bar=2'; + +// Funkt. nicht; schaut nach einer lokalen Datei namens +// 'file.php?foo=1&bar=2' im lokalen Dateisystem + +include 'file.php?foo=1&bar=2'; + +// Funkt +include 'http://www.example.com/file.php?foo=1&bar=2'; + +$foo = 1; +$bar = 2; +include 'file.txt'; // Funkt. +include 'file.php'; // Funkt. + ?> ]]> </programlisting> </example> + Siehe auch <link linkend="features.remote-files"> + Zugriff auf entfernte Dateien</link>, + <function>fopen</function> und <function>file</function> für verwandte + Informationen + </para> + <para> + Da <function>include</function> und <function>require</function> + spezielle Sprachkonstrukte sind, müssen Sie diese innerhalb einer + bedingten Anweisung in einen Anweisungsblock setzen. + </para> + <para> <example> - <title>foolib.inc</title> + <title>include() und bedingte Blöcke</title> <programlisting role="php"> <![CDATA[ <?php -require ("utils.inc"); -function zeigeVar($var) { - if (PHPVERSION == 4) { - print_r($var); - } else { - var_dump($var); - } + +// Das ist FALSCH und führt nicht zum gewünschten Ergebnis. + + +if ($bedingung) + include $datei; +else + include $andere_datei; + + +// Das ist KORREKT. +if ($bedingung) { + include $datei; +} else { + include $andere_datei; } -// es folgen weiter Funktionen ... ?> ]]> </programlisting> </example> - Nun schreiben Sie ein Skript - <literal>cause_error_require.php</literal>: + </para> + <simpara> + Der Umgang mit Returns: Es ist möglich eine <function>return</function> + -Anweisung innerhalb einer eingebunden Datei anzugeben, um die + Ausführung innerhalb dieser Datei abzubrechen und zum aufrufenden Skript + zurück zu kehren. Ebenso ist die Rückgabe von Werten aus einer + eingebunden Datei möglich. Sie können den Wert eines include-Aufrufs auf + die gleiche Art und Weise nutzen, wie Sie es bei einer Funktion machen + würden. + </simpara> + <note> + <simpara> + In PHP 3 darf eine return-Anweisung nicht innerhalb eines Blocks + auftreten, es sei denn, es ist ein Funktions-Block. In diesem Fall gilt + <function>return</function> für diese Funktion und nicht für die ganze + Datei. + </simpara> + </note> + <para> <example> - <title>cause_error_require.php</title> - <programlisting role="php"> + <title><function>include</function> und die <function>return</function> Anweisung</title> + <programlisting role="php"> <![CDATA[ +return.php <?php -require("foolib.inc"); -/* das Folgende erzeugt einen Fehler */ -require("utils.inc"); -$foo = array("1",array("complex","quaternion")); -echo "dies erfordert utils.inc, das auch\n"; -echo "in foolib.inc erforderlich ist\n"; -echo "Aufruf von guterTee: ".guterTee()."\n"; -echo "Ausgabe foo: \n"; -showVar($foo); + +$var = 'PHP'; + +return $var; + ?> -]]> - </programlisting> - </example> - Wenn Sie letzteres starten, wird folgende Ausgabe erzeugt (gilt für - PHP 4.01pl2): - <informalexample> - <programlisting> -<![CDATA[ -GLOBALE SIND GUT -GLOBALE SIND GUT -Fatal error: Cannot redeclare causeerror() in utils.inc on line 5 +noreturn.php +<?php +$var = 'PHP'; + +?> + +testreturns.php +<?php + +$foo = include 'return.php'; + +echo $foo; // gibt 'PHP' aus + +$bar = include 'noreturn.php'; + +echo $bar; // gibt 1 aus + +?> ]]> - </programlisting> - </informalexample> - Durch Umschreiben von <literal>foolib.inc</literal> und - <literal>cause_errror_require.php</literal> (Gebrauch von - <function>require_once</function> statt - <function>require</function>) und Umbenennung des letzten Skriptes - zu <literal>avoid_error_require_once.php</literal> haben wir nun: - <example> - <title>foolib.inc (fixed)</title> - <programlisting role="php"> -<![CDATA[ -... -require_once("utils.inc"); -function showVar($var) { -... -]]> - </programlisting> - </example> - <example> - <title>avoid_error_require_once.php</title> - <programlisting role="php"> -<![CDATA[ -... -require_once("foolib.inc"); -require_once("utils.inc"); -$foo = array("1",array("complex","quaternion")); -... -]]> - </programlisting> + </programlisting> </example> - Beim nachfolgenden Aufruf wird folgende Ausgabe erzeugt (bei PHP - 4.0.1pl2): - <informalexample> - <programlisting> -<![CDATA[ -GLOBALE SIND GUT -dies erfordert utils.inc, das auch -in foolib.inc erforderlich ist -Aufruf von guterTee: Oolong-Tee schmeckt gut!. -Ausgabe foo: -Array -( - [0] => 1 - [1] => Array - ( - [0] => complex - [1] => quaternion - ) - -) -]]> - </programlisting> - </informalexample> </para> + <simpara> + <literal>$bar</literal> hat den Wert <literal>1</literal>, weil include + erfolgreich war. Beachten Sie die Unterschiede in den obigen Beispielen. + Das erste nutzt <function>return</function> innerhalb der eingebundenen + Datei im Gensatzt zum zweiten Beispiel. + Weitere Möglichkeiten Dateien in Variablen "einzubinden" bieten ihnen die + Funktionen <function>fopen</function> und <function>file</function> oder + <function>include</function> im Zusammenspiel mit den + <link linkend="ref.outcontrol">Funktionen zur Ausgabesteuerung</link>. + </simpara> + + <simpara> + Siehe auch <function>require</function>, <function>require_once</function>, + <function>include_once</function>, <function>readfile</function>, + <function>virtual</function>und + <link linkend="ini.include-path">include_path</link>. + </simpara> + </sect1> + + <sect1 id="function.require-once"> + <title><function>require_once</function></title> + <para> + Die <function>require_once</function>-Anweisung bindet eine Datei ein + und führt diese zur Laufzeit des Skripts aus. + Das Verhalten ist ähnlich der <function>require</function>-Anweisung mit + dem einzigen Unterschied, dass einmal eingebundener Code aus einer Datei + nicht nocht einmal eingebunden wird. Lesen Sie die Dokumentation zu + <function>require</function> um mehr Informationen über die Arbeitsweise + dieser Anweisung zu erhalten. + </para> + <para> + <function>require_once</function> sollten Sie in den Fällen benutzen, + wenn die gleiche Datei in einem bestimmten Bereich mehrmals eingebunden + und interpretiert werden soll und Sie sicher stellen wollen, dass diese + Datei nur exakt einmal eingebunden wird, um Probleme mit Wiederholungen + bei Funktions-Definitionen und Wertzuweisungen zu Variablen zu vermeiden, + usw. + </para> + <para> + Weitere Beispiele zu <function>require_once</function> und + <function>include_once</function> können Sie dem + <ulink url="&url.php.pear;">PEAR</ulink>-Code entnehmen, welcher + im aktuellsten PHP-Source-Code enthalten ist. + </para> + <note> <para> - Beachten Sie, dass analog zum Verhalten von - <literal>#include</literal> im C-Preprozessor diese Anweisung zur - Zeit der Skript-"Compilierung" ausgewertet wird; sollten Sie also - z.B. das Skript vor dessen Ausführung parsen und bei der Ausführung - keinen Gebrauch machen wollen von dynamisch einzuschließenden - Teilen, sollten Sie <function>include_once</function> oder - <function>include</function> verwenden. - </para> - <para> - Weiter Beispiele zu <function>require_once</function> und - <function>include_once</function> können Sie dem PEAR-Code - entnehmen, welcher im aktuellsten PHP-Source-Code enthalten ist. + <function>require_once</function> steht ab PHP 4.01pl2 zur + Verfügung. </para> + </note> + <note> + <para> + Beachten Sie, dass auf auf einem Betriebssystem, das nicht zwischen + Groß- und Kleinschreibung unterschiedet (wie z.B. Windows) das Verhalten + von <function>require_once</function> und + <function>include_once</function> nicht unbedingt ihren Erwartungen + entspricht. + <example> + <title><function>require_once</function> und Groß-/Kleinschreibung</title> + <programlisting role="php"> +<![CDATA[ +require_once("a.php"); // bindet a.php ein +require_once("A.php"); // bindet a.php auf Windows nochmal ein! +]]> + </programlisting> + </example> + </para> + </note> + &warn.no-win32-fopen-wrapper; <para> Siehe auch: <function>require</function>, <function>include</function>, <function>include_once</function>, <function>get_required_files</function>, <function>get_included_files</function>, - <function>readfile</function>, + <function>readfile</function> und <function>virtual</function>. </para> </sect1> - + <sect1 id="function.include-once"> <title><function>include_once</function></title> <para> - Die Anweisung <function>include_once</function> schließt zur - Ausführungszeit das angegebene Skript ein und führt es aus. Dies + Die Anweisung <function>include_once</function> schließt zur + Ausführungszeit die angegebene Datei ein und wertet diese aus. Dies ist ähnlich der <function>include</function>-Anweisung; mit dem - Unterschied, dass einmal "includierter" Code nicht nochmals - eingebunden wird. + Unterschied, dass einmal eingebundener Code nicht nochmals + eingebunden wird. Wie der Name vermuten lässt, wird ie Datei nur ein + einziges Mal eingebunden. </para> <para> - Wie in der Beschreibung zu <function>require_once</function> - bereits angemerkt, soll <function>include_once</function> in den - Fällen verwendet werden, wo die selbe Datei mehr als einmal - während der Ausführung eingebunden werden soll und Sie - Wiederholungen bei den Funktions-Definitionen und Wertzuweisungen - zu Variablen usw. vermeiden müssen. + <function>include_once</function> sollten Sie in den Fällen benutzen, + wenn die gleiche Datei in einem bestimmten Bereich mehrmals eingebunden + und interpretiert werden soll und Sie sicher stellen wollen, dass diese + Datei nur exakt einmal eingebunden wird, um Probleme mit Wiederholungen + bei Funktions-Definitionen und Wertzuweisungen zu Variablen zu vermeiden, + usw. </para> <para> - Weiter Beispiele zu <function>require_once</function> und - <function>include_once</function> können Sie dem PEAR-Code - entnehmen, welcher im aktuellsten PHP-Source-Code enthalten ist. + Weitere Beispiele zu <function>require_once</function> und + <function>include_once</function> können Sie dem + <ulink url="&url.php.pear;">PEAR</ulink>-Code entnehmen, welcher + im aktuellsten PHP-Source-Code enthalten ist. </para> + <note> <para> <function>include_once</function> steht ab PHP 4.01pl2 zur Verfügung. </para> + </note> + <note> + <para> + Beachten Sie, dass auf auf einem Betriebssystem, das nicht zwischen + Groß- und Kleinschreibung unterschiedet (wie z.B. Windows) das Verhalten + von <function>include_once</function> und + <function>require_once</function> nicht unbedingt ihren Erwartungen + entspricht. + <example> + <title><function>include_once</function> und Groß-/Kleinschreibung</title> + <programlisting role="php"> +<![CDATA[ +include_once("a.php"); // bindet a.php ein +include_once("A.php"); // bindet a.php auf Windows nochmal ein! +]]> + </programlisting> + </example> + </para> + </note> + &warn.no-win32-fopen-wrapper; <para> - Siehe auch: <function>require</function>, - <function>include</function>, <function>require_once</function>, - <function>get_required_files</function>, - <function>get_included_files</function>, - <function>readfile</function> und <function>virtual</function>. + Siehe auch <function>include</function>, + <function>require</function>, <function>require_once</function>, + <function>get_required_files</function>, + <function>get_included_files</function>, <function>readfile</function> + und <function>virtual</function>. </para> </sect1>