119
ENTWURF PHP - Grundlagen dynamischer Webseitenprogrammierung 1 Hakan Küçükyılmaz <hakan at lisas dot de> 2. Juli 2005 1 http://bwpc050.fht-esslingen.de:8080/˜hakubw00/file/einfuehrung_php4.pdf

ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

PHP - Grundlagen dynamischerWebseitenprogrammierung1

Hakan Küçükyılmaz<hakan at lisas dot de>

2. Juli 2005

1http://bwpc050.fht-esslingen.de:8080/˜hakubw00/file/einfuehrung_php4.pdf

Page 2: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFCopyright c© 2001-2002 Hakan Küçükyılmaz.

Permission is granted to copy, distribute and/or modify this document un-der the terms of the GNU Free Documentation License, Version1.1 or anylater version published by the Free Software Foundation; with the InvariantSections being Page II, with no Front-Cover Texts, and with no Back-CoverTexts. A copy of the license is included in the section entitled “GNU FreeDocumentation License”.

Teil 2: Sprachreferenzc© 1997-2002 von der PHP-DokumentationsgruppeAutoren: Stig Sther Bakken, Alexander Aulbach, Egon Schmid, Jim Wins-tead, Lars Torben Wilson, Rasmus Lerdorf, Andrei Zmievski,Jouni AhtoHerausgegeben von:Egon SchmidBei der Übersetzung wirkten mit: Sebastian Bergmann, Cornelia Boenigk,Wolfgang Drews, Ralf Ebert, Thomas Fromm, Johann-Peter Hartmann, Hart-mut Holzgraefe, Martin Jansen, Michael Kaiser, Mark Kronsbein, HakanKüçükyılmaz, Sven Lauer, Jan Lehnardt, Sebastian Nohn, Catharina Paul-sen, Peter Petermann, Georg Richter, Stefan Saasen, MartinSamesch, EgonSchmid, Thomas Schöfbeck, Holger Schranz, Thomas Schürmann, Uwe Stein-mann, Christian Ullrich1

Verbessert und angepasst von Hakan Küçükyılmaz.

Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungenusw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zuder Annahme, dass solche Namen im Sinne der Warenzeichen - und Marken-schutz - Gesetzgebung als frei zu betrachten wären und dahervon jedermannbenutzt werden dürften.Wir übernehmen keine Gewähr für die Funktion einzelner Programme odervon Teilen derselben. Insbesondere übernehmen wir keinerlei Haftung füreventuelle, aus dem Gebrauch resultierende Folgeschäden.

Vielen Dank an:Nurcan Çeri, Stefan Sontheimer, Thomas Haas, Bülent Tıknas, Egon Schmid,Mark Kronsbein

1Vgl.: http://www.php.net/manual/de/langref.phpVersion vom 30. Dez., 2001

ii

Page 3: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFInhaltsverzeichnis

I Einleitung 3

1 Vorwort 5

2 Geschichte 7

3 Technik dynamischer Webseiten 11

II Sprachreferenz 15

4 Syntax 174.1 Den HTML-Bereich der Datei verlassen. . . . . . . . . . . . . . . . . . 174.2 Abgrenzung von Anweisungen. . . . . . . . . . . . . . . . . . . . . . . 184.3 Kommentare. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5 Typen 195.1 Boolscher Typ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

5.1.1 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205.1.2 Umwandlung nach boolean. . . . . . . . . . . . . . . . . . . . . 20

5.2 Integer-Typen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215.2.1 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215.2.2 Integer Überlauf . . . . . . . . . . . . . . . . . . . . . . . . . . 215.2.3 Umwandlung nach Integer. . . . . . . . . . . . . . . . . . . . . 22

5.3 Fließkomma-Zahlenwerte. . . . . . . . . . . . . . . . . . . . . . . . . . 235.4 Strings / Zeichenketten. . . . . . . . . . . . . . . . . . . . . . . . . . . 23

5.4.1 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245.4.2 Einfache Anführungszeichen. . . . . . . . . . . . . . . . . . . . 245.4.3 Doppelte Anführungszeichen (Double quoted). . . . . . . . . . 255.4.4 Heredoc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255.4.5 Variablen-Analyse (parsing). . . . . . . . . . . . . . . . . . . . 26

5.4.5.1 Einfache Syntax. . . . . . . . . . . . . . . . . . . . . 265.4.5.2 Komplexe (geschweifte) Syntax. . . . . . . . . . . . . 27

5.4.6 Zugriff auf Zeichen in Strings. . . . . . . . . . . . . . . . . . . 275.4.7 Nützliche Funktionen. . . . . . . . . . . . . . . . . . . . . . . . 285.4.8 Umwandlung von Zeichenketten / Strings. . . . . . . . . . . . . 29

5.5 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

iii

Page 4: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF5.5.1 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

5.5.2 Eindimensionale Arrays. . . . . . . . . . . . . . . . . . . . . . 305.5.3 Mehrdimensionale Arrays. . . . . . . . . . . . . . . . . . . . . 31

5.6 Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.7 Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

5.7.1 Freigabe von Resourcen. . . . . . . . . . . . . . . . . . . . . . 335.8 NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

5.8.1 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345.9 Typen-Tricks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345.10 Typumwandlung (cast). . . . . . . . . . . . . . . . . . . . . . . . . . . 35

6 Variablen 376.1 Grundlegendes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376.2 Geltungsbereich von Variablen. . . . . . . . . . . . . . . . . . . . . . . 386.3 Variable Variablen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416.4 Variablen ausserhalb von PHP. . . . . . . . . . . . . . . . . . . . . . . 42

6.4.1 HTML-Formulare (GET and POST). . . . . . . . . . . . . . . . 426.4.2 IMAGE SUBMIT Variablenbezeichner. . . . . . . . . . . . . . 42

6.5 HTTP-Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436.6 Umgebungs- / Environment-Variablen. . . . . . . . . . . . . . . . . . . 43

6.6.1 Punkte in eingelesenen Variablen-Bezeichnern. . . . . . . . . . 446.7 Bestimmung des Variablen-Typs. . . . . . . . . . . . . . . . . . . . . . 44

7 Ausdrücke 45

8 Operatoren 498.1 Arithmetische Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . 498.2 Zuweisungsoperatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . 498.3 Bit - Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508.4 Vergleichs-Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . 508.5 Fehler-Kontroll-Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . 518.6 Operatoren zur Programmausführung. . . . . . . . . . . . . . . . . . . 518.7 Inkrementierungs- bzw. Dekrementierungsoperatoren. . . . . . . . . . . 528.8 Logische Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . . 528.9 Operator-Rangfolge. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538.10 Zeichenketten-Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . 54

9 Kontroll-Strukturen 559.1 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559.2 else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569.3 elseif. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569.4 Alternative Syntax für Kontroll-Strukturen. . . . . . . . . . . . . . . . . 579.5 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579.6 do..while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589.7 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599.8 foreach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

iv

Page 5: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF9.9 break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

9.10 continue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629.11 switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639.12 require(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659.13 include(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669.14 require_once(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699.15 include_once() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

10 Funktionen 7310.1 Vom Nutzer definierte Funktionen. . . . . . . . . . . . . . . . . . . . . 7310.2 Funktionsparameter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

10.2.1 Verweise als Parameter übergeben. . . . . . . . . . . . . . . . . 7310.2.2 Vorgabewerte für Parameter. . . . . . . . . . . . . . . . . . . . 74

10.3 Rückgabewerte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7510.4 Variablenfunktionen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

11 Klassen/Objekte 77

12 Referenzen in PHP 8112.1 Was Referenzen sind. . . . . . . . . . . . . . . . . . . . . . . . . . . . 8112.2 Was Referenzen leisten. . . . . . . . . . . . . . . . . . . . . . . . . . . 8112.3 Was Referenzen nicht sind. . . . . . . . . . . . . . . . . . . . . . . . . 8212.4 Referenzen zurückgeben. . . . . . . . . . . . . . . . . . . . . . . . . . 8212.5 Referenzen aufheben. . . . . . . . . . . . . . . . . . . . . . . . . . . . 8312.6 Referenzen entdecken. . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

12.6.1 global References. . . . . . . . . . . . . . . . . . . . . . . . . . 8312.6.2 $this. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

III Datenbankanbindung 85

13 DB Verbindung 87

14 DB Abfrage 89

IV Formulare 91

15 Formulargenerierung 9315.1 Formulargenerierung mit HTML. . . . . . . . . . . . . . . . . . . . . . 9315.2 Formulargenerierung mit HTML/Form.php. . . . . . . . . . . . . . . . 94

16 Formularauswertung 9516.1 Einfache Formularauswertung. . . . . . . . . . . . . . . . . . . . . . . 9516.2 Formularauswertung mit Datenbankanbindung. . . . . . . . . . . . . . 96

v

Page 6: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFA GNU Free Documentation License 99

A.1 Applicability and Definitions. . . . . . . . . . . . . . . . . . . . . . . . 99A.2 Verbatim Copying. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100A.3 Copying in Quantity . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101A.4 Modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101A.5 Combining Documents. . . . . . . . . . . . . . . . . . . . . . . . . . . 103A.6 Collections of Documents. . . . . . . . . . . . . . . . . . . . . . . . . . 103A.7 Aggregation With Independent Works. . . . . . . . . . . . . . . . . . . 104A.8 Translation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104A.9 Termination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104A.10 Future Revisions of This License. . . . . . . . . . . . . . . . . . . . . . 104

B Links und weitere Quellen 107B.1 Quellen PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107B.2 Quellen HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107B.3 Quellen SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107B.4 Quellen Freie Projekte. . . . . . . . . . . . . . . . . . . . . . . . . . . 107

vi

Page 7: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFAbbildungsverzeichnis

3.1 Grundlegende Technik dynamischer WebseitengenerierungQuelle: Eigen. 123.2 Dynamische Webseitengenerierung mit PHPQuelle: http://www.zend.com/apidoc/figures/Extending_Zend

vii

Page 8: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 9: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFTabellenverzeichnis

5.1 Nicht ausgewertete / Übergangene Zeichen. . . . . . . . . . . . . . . . 25

8.1 Arithmetische Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . 498.2 Bit-Operatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508.3 Vergleichs-Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . 518.4 Inkrement- und Dekrementoperatoren. . . . . . . . . . . . . . . . . . . 528.5 Logische Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . . 538.6 Operator-Rangfolge. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

ix

Page 10: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 11: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Zusammenfassung

PHP (rekursives Akronym für “PHP:HypertextPreprocessor“) ist eine serverseitig inter-pretierte Open-Source Skriptsprache2 zur Gestaltung von dynamischen Webseiten für dene-Commerce und anderen webbasierten Anwendungen. Der PHP-Code wird in HTMLeingebettet und ist in seiner Syntax vergleichbar mit C, Java und Perl. HerausragendeEigenschaften sind die Funktionen zur Integration einer Vielzahl von Datenbanken. Daselegante und durchdachte Design gibt dem Anwendungsentwickler ein einfach zu erler-nendes und gleichzeitig mächtiges Werkzeug zur Hand.3

2Frei zu beziehen unterhttp://www.php.netundhttp://www.zend.com3Vgl.: http://www.zend.com/aboutphp.phpVersion vom: 07. Jan, 2002

Page 12: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 13: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Teil I

Einleitung

3

Page 14: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 15: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 1

Vorwort

Das Verhalten der Menschen bei der Informationsbeschaffung ist dynamischer Natur. Aufder Informationssuche im Web begegnet man aber heutzutage immer noch statischen Sei-ten, die diesem Grundsatz der Dynamik keinen Wert beimessen. Bei der Gestaltung vonWebauftritten sollte der Kundennutzen und damit auch das Kundenverhalten im Vorder-grund stehen. Mit PHP besteht die Möglichkeit und die ChanceWebauftritte dynamischzu gestalten, somit kann die Mensch Maschine Schnittstellein Richtung Mensch optimiertwerden.

PHP ist eine sogenannte “serverseitige Skriptsprache“ zurProgrammierung von dy-namischen Webseiten. Anders als bei bloßem HTML kann eine Webseite mit PHP aufvielfältige Weise auf den Besucher reagieren, von einer trivialen tageszeitabhängigen Be-grüßung bis zum Durchsuchen einer großen Datenbank ist vieles möglich.

Häufig sind es aber schon die kleinen Funktionen, die einer Webseite Attraktivitätverleihen: Abstimmungen, Foren, Mailinglisten, seiteninterne Suchmaschinen, Counter,Auktionen - die Liste der Möglichkeiten lässt sich beliebigfortsetzen. All dieses lässtsich mit PHP leicht und komfortabel programmieren, denn beiweit über zweitausend1

Befehlen und Funktionen2 findet sich zu jedem Problem schnell eine Lösung.Anders als z.B. Perl, wurde PHP anfangs nur für das Web programmiert. Das macht

sich an vielen Stellen bemerkbar: So wird der PHP-Code z.B. direkt an den passendenStellen zwischen den HTML-Code eingefügt - einfacher geht es nicht. Die Befehle sindfür jeden mit grundlegender Programmiererfahrung einfachzu erlernen. Trotzdem undgerade deshalb verwenden auch immer mehr der “großen Namen im Internet“ PHP - auchein Beweis für die Qualität von PHP.3

Für kommerzielle Anwender sind die Anbindung an alle gängingen (und weniger gän-gigen) Datenbanken4 und die Möglichkeit Dokumente im PDF Format “on the fly“ zu ge-nerieren herausragende Eigenschaften. So können z.B. Preislisten im Webauftritt immeraktuell gehalten oder ganze Produktkataloge als PDF angeboten werden.

Heute verfügt PHP über Objekt Orientierte (OO) Strukturen,Anbindungen zu Grafik-und PDF-Bibliotheken und Unterstützung für LDAP und IMAP. PHP kann auch client-seitig für Skriptprogramme oder sogar zur Programmierung von GUI’s verwendet wer-

1Vgl.: für die genau Zahlhttp://www.zugeschaut-und-mitgebaut.de/php/statistics.html2Vgl.: http://www.php.net/manual/de/funcref.php3Vgl.: http://www.phpbox.de/grundlagen/ueberphp.phpVersion vom: 13. Dez, 20014Liste unterhttp://www.php.net/manual/de/intro-whatcando.php

5

Page 16: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

6 KAPITEL 1. VORWORT

den. Mit PHP 5 wird eine vollständige OO Struktur angestrebt. Es können heute schonJAVA-Klassen über PHP instanziert werden, die Anbindung andas “.NET KomponentenFramework (Microsoft)“ wurde auf der International PHP-Conference 2001 in Frankfurterstmalig vorgestellt.

Page 17: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 2

Geschichte

PHP wurde irgendwann im Herbst des Jahres 1994 von Rasmus Lerdorf konzipiert. Frü-he, nicht veröffentlichte Versionen, wurden auf seiner Homepage genutzt, um die Leserseiner Online-Bewerbung festzustellen. Die erste Version, die von anderen genutzt wurde,war Anfang 1995 verfügbar und wurde unter dem Namen “Personal Home Page Tools“bekannt.

Sie bestand aus einem extrem simplifizierten Parser, der ausschließlich einige speziel-le Makros verstand, und einigen Werkzeugen, die damals häufig auf Homepages genutztwurden: ein Gästebuch, ein Counter und einige andere. Der Parser wurde Mitte 1995 neuprogrammiert und in PHP/FI umbenannt. Der Form Interpreter(FI) kam von einem an-deren Paket, dass Rasmus geschrieben hatte und das HTML Formulardaten interpretierte.Er kombinierte die “Personal Home Page Tools“-Skripte mit dem “Formular-Interpreter“,fügte noch mSQL-Unterstützung hinzu und PHP/FI war geboren. PHP/FI wuchs mit un-glaublicher Geschwindigkeit und immer mehr Leute begannenCode beizusteuern.1

Zeittafel:

• Herbst 1994 Rasmus Lerdorf loggt die Leser seines Online-Lebenslaufes.

• PHP/FI 1.0, Frühling 1995, PHP - “Personal Home Page Tool“

• PHP/FI 2.0, Sommer 1995, FI - “Form Interpreter“

– noch ohne echten Parser

• PHP 3.0, 1997-2000, “Personal Home Page“ oder “PHP HyperText Preprocessor“

– echter Parser

– Interpreter

– grundlegende OO Notation

1Vgl.: http://www.de.php.net/manual/de/intro-history.phpVersion vom 07. Jan, 2001

7

Page 18: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

8 KAPITEL 2. GESCHICHTE

• PHP 4.0, Frühling 2000

– Interpiler wie Perl 5

– neuer, schnellerer Sprachkern “Zend“ entwickelt vonZeev Suraski und AndiGutmans

– viele, neue Funktionen u.a. bei den Arrays

– in der Praxis: 2-5x schneller, im Einzelfall: 100x.

– Compiler “Encoder“, Debugger, Zend-Cache und IDE in Reichweite

• PHP 4.0.4, Herbst 2000

– rund 1800 Funktionen, Tendenz steigend

• PHP 4.1, Herbst 2001

– erhöhte Sicherheit

– allgemein schneller

– erheblich schneller unter Windows

– mehrere IDE für PHP auf dem Markt, ZendIDE,2 Maguma PHP 4EE Studio,3

PHPedit4 5

• Aktuelle Erweiterungen:

– PEAR - PHP Extension and Application Repository.

∗ PEAR ist ein Code-Archiv für PHP Erweiterungen und PHP Bibliothe-ken, inspiriert von TeX’s CTAN und Perl’s CPAN.

∗ Definiert Standards, um Entwickler beim Schreiben von portablem undwiederverwendbarem Code zu unterstützen.6

– PHP-GTK - GTK-Anbindung für Clientseitige Programme.7

– PHP .NET - PHP Anbindung an das “.NET Komponenten Framework“.8

– PHP Shellskripte - die CGI Version von PHP funtkioniert auchals Shellskript.

2http://www.zend.com/zend/products.php#ide3 http://www.maguma.com/deutsch/produkte_studiouberblick.html4http://www.phpedit.com/5Vgl.: http://www.ulf-wendel.de/schulung/core/geschichte.phpVersion vom 13. Dez, 20016Vgl.: http://pear.php.net/manual/en/introduction.phpaufgerufen am 22. Dez, 20017 http://gtk.php.net/8http://www.php4win.com/net/index.php

Page 19: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

9

• Ausblick PHP 5/Zend2

– Verbesserung der OO

∗ private Variablen

∗ Mehrfachvererbung

∗ “echte“ Instanzierung von Objekten

∗ Aggregation

∗ try und catch Fehlerroutinen

– noch schneller...9

9Vgl.: http://www.zend.com/zend/zend-engine-summary.phpaufgerufen am 22. Dez, 2001

Page 20: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 21: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 3

Technik dynamischer Webseiten

Zur Generierung dynamischer Webseiten stehen viele Techniken zur Verfügung. Klassi-sche Techniken wie z.B.:

• PHP (PHPHypertextPreprocessor)

• Perl (PracticalExtraction andReportingLanguage)

• C über CGI (CommonGatewayInterface) Anbindung

• VBScript/ASP (Visual Basic Script/Active Server Pages - Microsoft)

• ColdFusion (Macromedia)

• Websphere (IBM)

• JSP (JavaServerPages)

Allen gemeinsam ist eine “Mittelschicht“, die die Verknüpfung zwischen Webserverund den dynamischen Elementen erlaubt. Hierbei werden Inhalte aus Datenbanken aus-gelesen, Grafiken über Grafikbibliotheken erzeugt oder sogar PDF-Dateien generiert undan den anfragenden Browser über den Webserver zurück gesendet.

Die zugrundeliegende Technik ist dieselbe. Es gibt Unterschiede in Preis, Qualitätund Sprachumfang der jeweiligen Lösung. VBScript/ASP liegt den meisten WindowsBetriebssystemen bei, Coldfusion kostet schon einiges undPHP ist Open-Source unddamit frei verügbar.

Frei verfügbar bedeutet auch kostenlos. Der weitaus wichtigere Faktor bei Open Sour-ce Software ist aber der freie Quelltext, der einsehbar und somit bei genügender Program-mierkenntnis auch mehr oder weniger schnell den eigenen Ansprüchen angepasst werdenkann. Das kopieren, verändern und weitergeben der Softwareist erlaubt und auch er-wünscht.1

1Die Details der verschiedenen Open Source Lizenzbestimmungen kann unterhttp://www.osdn.com/historyeingesehen werden.

11

Page 22: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

12 KAPITEL 3. TECHNIK DYNAMISCHER WEBSEITEN

Grundsätzlich kann die Generierung dynamischer Webseitenschematisch folgender-maßen dargestellt werden:(Hierbei kann das Bindeglied PHP 4 durch Anfangs genannte Produkte ersetzt werden.)

EN

TWU

RF

dasBindeglied

PHP

als HTML

Webserver:

Clientseite Serverseite

Internet Explorer

http://fht.de/foo.php4

Webbrowser:Mozilla

Antwort

Anfrage

zurueck

z.B. Apache, IIS, Roxen

weiterreichen

Datenbank

Mailserver

Bibliothek

Antwort

Anfragen

������������

������������

������

������

��������

���������������

���������������

���������������

���������������

Abbildung 3.1: Grundlegende Technik dynamischer Webseitengenerierung

1. Auf der Clientseite (User) wird http://fht.de/foo.php4im Browser aufgerufen - eineAnfrage nach foo.php4 wird an fht.de geschickt.

2. Der Webserver erkennt an der Endung .php4 das es sich um eine PHP-Datei handeltund schickt die Anfrage an PHP weiter.

3. Je nach PHP-Code werden Datenbanken, Mailserver und/oder Bibliotheken ausge-lesen.

4. Aus dem PHP-Code wurde HTML generiert und an den Webserverzurückgeschickt.

5. Der Webserver schickt die Seite nun an den aufrufenden Client.

Mit PHP werden dynamische Webseiten nach folgender Grafik realisiert.

1. HTTP Anfrage vom Browser (Clientseite)

2. Der Webserver schickt die Anfrage an die Zend-Engine weiter

Page 23: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

13

Abbildung 3.2: Dynamische Webseitengenerierung mit PHP

3. Die Datei wird geparst

4. Der Bytecode wird ausgelesen und unter evtl. zur Hilfe nahme weiterer Moduleverarbeitet

5. Die verarbeitete Datei wird an den Webserver geschickt

6. Der Webserver schickt die Datei an den aufrufenden Client.

Page 24: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 25: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Teil II

Sprachreferenz

15

Page 26: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 27: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Kapitel 4

Syntax

4.1 Den HTML-Bereich der Datei verlassen

PHP-Skripte werden direkt in HTML Dokumente eingebettet. Damit PHP zwischen HTML-Code und PHP-Skript unterscheiden kann, wird das PHP-Skript speziell markiert. Es gibtvier Möglichkeiten, den HTML-Bereich einer Skript-Datei zu verlassen und in den “PHP-Modus“ zu wechseln:Beispiel 2.1: Möglichkeiten, den HTML-Bereich zu verlassen

1. <? echo ("Das ist die einfachste Moeglichkeit:Eine SGML-Steueranweisung\n");?>

2. <?php echo("Um XML-konforme Dokumente herzustellen,benutzt man diese Syntax\n"); ?>

3. <script language="php">echo ("Manche Editoren (z. B. Frontpage) moegen keineSteueranweisungen\n");

</script>

4. <% echo ("Optional koennen auch Tags im ASP-Stil verwende t werden"); %><%= $variable; # Das ist ein Abkuerzung fuer "<%echo .." %>

Die erste Methode ist nur verfügbar, wenn ’short tags’ aktiviert sind. Dies kann durchdie short_tags() - Funktion geschehen, durch Aktivieren der short_open_tag- Einstel-lung in der PHP Konfigurationsdatei oder durch das Übergebender ’–enable-short-tags’-Option an den configure-Befehl beim Kompilieren des PHP-Parsers.Die vierte Methode ist nur verfügbar, wenn Tags im ASP-Stil (ASP-style tags) aktiviertsind.Die zweite Methode ist die sicherste und am weitesten verbreitete Methode.

Der schließende Tag für den PHP-Block schließt eine sofort folgende Zeilenschaltungmit ein, falls diese vorhanden ist.Außerdem beinhaltet derschließende Tag ein implizitesSemikolon; Sie müssen also die letzte Zeile eines PHP-Blocks nicht mit einem Semikolonbeenden.

17

Page 28: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

18 KAPITEL 4. SYNTAX

4.2 Abgrenzung von Anweisungen

Einzelne Anweisungen werden genauso voneinander abgetrennt wie in C oder Perl - jedeAnweisung wird mit einem Semikolon beendet.Auch der schließende Tag (?>) bedeutet das Ende einer Anweisung, deshalb sind diefolgenden Beispiele gleichwertig:Beispiel 2.2: Abgrenzung von Anweisungen

<?phpecho "Dies ist ein PHP Skript";

?>

<?php echo "Ein weiteres PHP Skript" ?>

<?php echo "Und noch ein PHP Skript"; ?>

4.3 Kommentare

PHP unterstützt ’C’, ’C++’ und ’Unix-Shell’-artige Kommentare.Beispiel 2.3: Kommentare

<?phpecho "Dies ist ein Test"; // Ein einzeiliger Kommentar im C++ -Stil./* Dies ist ein mehrzeiliger Kommentar

und noch eine Kommentar-Zeile */echo "Dies ist noch ein Test";echo "... und ein abschliessender Test"; # Ein einzeiliger K ommentar.

?>

Die einzeiligen Kommentar-Arten kommentieren sämtlichenText bis zum Zeilenendeoder bis zum Ende des aktuellen PHP-Blocks aus, je nachdem, was zuerst eintritt.Beispiel 2.4: einzeilige Kommentare

<?php<h1>Dies ist ein <?# echo "einfaches";?> Beispiel.</h1><p>Obige Ueberschrift wird lauten: ’Dies ist ein Beispiel. ’.?>

Man sollte darauf achten, nicht mehrere ’C’-artigen Kommentare ineinander zu set-zen, was vorkommen kann, wenn man große Blöcke auskommentiert.Beispiel 2.5: verschachtelte Kommentare

<?php/*echo "Dies ist ein Test"; /* Dieser Kommentar wird ein Proble mverursachen. */*/

?>

Page 29: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 5

Typen

PHP unterstützt die folgenden Typ-Deklarationen:

• Boolean

• Integer (Ganzahl)

• Fließkommazahl (float)

• String / Zeichenkette

Zwei zusammengesetzte Typen:

• Array

• Object

Und zuletzt zwei spezielle Typen:

• Resource

• NULL

Der Typ einer Variablen wird in PHP normalerweise nicht vom Programmierer be-stimmt; vielmehr wird dies zur Laufzeit von PHP entschieden, abhängig vom Zusam-menhang in dem die Variable benutzt wird.

Tipp: Um den Typ und den Wert eines bestimmten Ausdrucks (Expression) zu Über-prüfen, können Sievar_dump() benutzen. Wenn Sie zur Fehlersuche einfach nur einelesbare Darstellung eines Typs benötigen, benutzen Siegettype() . Um auf einen be-stimmten Typ zu prüfen, sollten Sie nichtgettype() benutzen. Stattdessen sollten Siedie is_type() Funktionen verwenden.

Wenn sie die Umwandlung in einen bestimmten Variablen-Typ erzwingen wollen,können sie dies entweder per cast oder durch Gebrauch der Funktion settype() bewerk-stelligen.

Beachten Sie, dass eine Variable je nach Gebrauch und Situation auf unterschiedlicheArt und Weise typisiert sein kann.

Achtung: Ergebnisse aus Datenbankabfragen haben in PHP immer den TypString,auch wenn sie in der Datenbank als Integer oder Float typisiert sind. Weitere Informatio-nen sehen Sie unter Typ - Veränderung.

19

Page 30: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

20 KAPITEL 5. TYPEN

5.1 Boolscher Typ

Das ist der einfachste Typ. Einboolean drückt einen Wahrheitswert aus. Dieser kannentweder TRUE oder FALSE sein.Anmerkung: Der boolsche Typ wurde in PHP 4 eingeführt.

5.1.1 Syntax

Um einen boolschen Typ wörtlich anzugeben, benutzen Sie entweder das SchlüsselwortTRUE oder FALSE. Beide unterscheiden sich nicht bezüglich der Groß- und Kleinschrei-bung.

$foo = True; // $foo wird der Wert TRUE zugewiesen

Üblicherweise verwenden Sie einen der Operatoren, der Ihnen einen boolean Wertliefert, den Sie dann an eine der Kontroll-Struktur weiterreichen.

// == ist ein Vergleichs-Operator der einen boolschen Wert l iefertif ($action == "show_version") {

echo "Die Version ist 1.23";}

// Das ist nicht notwendig:if ($show_separators == TRUE) {

echo "<hr>\n";}

// weil Sie einfach folgendes schreiben koennen:if ($show_separators) {

echo "<hr>\n";}

5.1.2 Umwandlung nach boolean

Um einen Wert ausdrücklich nachboolean zu konvertieren benutzen Sie entweder dieUmwandlung mittels(bool) oder (boolean) . In den allermeisten Fällen ist es jedochnicht notwendig die Umwandlung selbst vorzunehmen. Ein Wert wird automatisch kon-vertiert, falls ein Operator, eine Funktion oder eine Kontrollstruktur ein boolean Argumenterfordert.Siehe auch Typ-Veränderung.

Bei der Umwandlung nach boolean werden folgende Werte als FALSE angesehen:

• das boolean FALSE

• die Integer 0 (Null)

• die Fließkommazahl 0.0 (Null)

• die leere Zeichenkette und die Zeichenkette “0“

• ein Array ohne Elemente

Page 31: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

5.2. INTEGER-TYPEN 21

• ein Objekt ohne Elemente

• der spezielle Type NULL (einschließlich nicht definierter Variablen)

Jeder andere Wert wird als TRUE angesehen (einschließlich jeder Resource).WARNUNG-1 wird als TRUE angesehen, wie jede andere Zahl ungleich Null (egal ob negativ oderpositiv)!

5.2 Integer-Typen

Ein Integer ist eine Nummer aus der Menge der ZahlenZ = {..., -2, -1, 0, 1, 2, ... }.

5.2.1 Syntax

Ganzzahlen können in dezimaler (10-basierter), hexadezimaler (16-basierter) oder oktaler(8-basierter) Schreibweise angegeben werden, wahlweise mit einem Vorzeichen (- oder+).

Wenn Sie die oktale Schreibweise verwenden, müssen Sie die Zahl mit einer voran-gestellten Null ’0’ schreiben; in hexadezimaler Schreibweise müssen Sie vor die Zahl ein’0x’ schreiben.

Integer-Typen können durch Gebrauch einer der folgenden Zuweisungsarten angege-ben werden:Beispiel 2.6: Integer Literale

<?php$a = 1234; # Dezimalzahl$b = -123; # ein negativer Zahlenwert$c = 0123; # Oktalzahl (83 im dezimal-Format) Achtung:

# Fehlerquelle bei Strings mit fuehrenden Nullen!$d = 0x12; # Hexadezimalzahl

# (entspricht 18 dezimal)

echo $a."<br>".$b."<br>".$c."<br>".$d;?>

Die Größe einesInteger - Wertes ist plattformabhängig, ein Wertebereich von ca.+/- 2 Milliarden ist aber üblich (Vorzeichenbehafteter 32-Bit-Wert). PHP unterstützt keinevorzeichenlose Integer-Werte.

5.2.2 Integer Überlauf

Wenn Sie eine Zahl jenseits der Grenzen des TypsInteger angeben, wird diese stattdes-sen als Typfloat interpretiert. Wenn Sie eine Operation ausführen, deren Ergebnis eineZahl jenseits der Grenzen des TypsInteger ist, wird ebenso eine Zahl vom Typfloatzurückgegeben.

Page 32: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

22 KAPITEL 5. TYPEN

$large_number = 2147483647;var_dump($large_number);// Ausgabe: int(2147483647)

$large_number = 2147483648;var_dump($large_number);// Ausgabe: float(2147483648)

// das gilt auch fuer Integer in hexadezimaler Schreibweise :var_dump( 0x80000000 );// Ausgabe: float(2147483648)

$million = 1000000;$large_number = 50000 * $million;var_dump($large_number);// Ausgabe: float(50000000000)

Warnung:Bedauerlicherweise gab es einen Bug in PHP, der die korrekteFunktionsweise verhin-derte, wenn negative Zahlen verwendet wurden. Ein Beispiel: Bei der Ausführung von-50000 * $million war das Ergebnis -429496728. Sind beide Operanden positiv gibt gibtes keine Probleme.Dieses Problem ist in PHP 4.1.0 behoben.

In PHP gibt es keinen Operator für Integer Divisonen. 1/2 ergibt float 0.5.

var_dump(25/7);// Ausgabe: float(3.5714285714286)

5.2.3 Umwandlung nach Integer

Um einen Wert ausdrücklich nachinteger zu konvertieren benutzen Sie entweder dieUmwandlung mittels(int) oder (integer) . In den allermeisten Fällen ist es jedochnicht notwendig die Umwandlung selbst vorzunehmen. Ein Wert wird automatisch kon-vertiert, falls ein Operator, eine Funktion oder eine Kontrollstruktur einInteger Argu-ment erfordert.Siehe auch Typ-Veränderung.

• Von BooleansFALSE ergibt 0 (Null), und TRUE ergibt 1 (eins).

• Von FließkommzahlenBei der Umwandlung vonfloat nach Integer wird die Zahl in Richtung Nullgerundet. Wenn derfloat jenseits der Grenzen vonInteger liegt (üblicherweise+/−2.15∗1031), ist das Ergebnis nicht definiert, weilfloat nicht genug Präzisionbesitzt um ein genauesinteger Ergebnis zu liefern. Keine Warnung, nicht einmaleine Notiz wird in diesem Fall ausgegeben.Warnung:Wandeln Sie nie ein Teil eines Ausdrucks nachInteger um, da dies manchmal zuunerwarteten Ergebnissen führen kann.

echo (int) ((0.1+0.7) * 10 ); // Ausgabe: 7!

Page 33: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

5.3. FLIESSKOMMA-ZAHLENWERTE 23

Für mehr Informationen schauen Sie unter Warnung über float-Präzision nach.

• Von Zeichenketten / StringsSiehe String Umwandlung

• Von anderen TypenAchtung:Das Verhalten bei der Umwandlung nachInteger ist für andere Typen nicht de-finiert. Zum gegenwärtigen Zeitpunkt ist das Verhalten so, als ob der Wert zuerstnachboolean konvertiert wird. Auf jeden Fall sollten Sie sich auf diesesVerhaltennicht verlassen. Es kann sich ohne Ankündigung ändern.

5.3 Fließkomma-Zahlenwerte

Fließkomma-Zahlenwerte (“floats“, “doubles“oder “reelleZahlen“) können durch eineder folgenden Anweisungen zugewiesen werden:Beispiel 2.7: Fließkomma-Zahlenwerte

<?php$a = 1.234;$b = 1.2e3;$c = 7E-10;echo $a."<br>".$b."<br>".$c;?>

Die Größe einer Fließkommazahl ist plattformabhängig, dennoch stellt ein Maximumvon ~1.8e308 mit einer Genauigkeit von 14 Nachkommastellen einen üblichen Wert dar(das ist 64-Bit im IEEE-Format).Warnung:Es ist normal, dass einfache Dezimalzahlen wie 0.1 oder 0.7 nicht in ihre internen bi-nären Entsprechungen konvertiert werden können, ohne einen Teil ihrer Genauigkeit zuverlieren. Das kann zu verwirrenden Ergebnissen führen. Sowird floor ((0.1 + 0.7)* 10) normalerweise 7 statt des erwarteten Wertes 8 zurück geben (als Ergebnis der in-ternen Entsprechung von 7.9999999999....

Da es unmöglich ist, periodische Dezimal-Zahlen durch einebegrenzte Anzahl anNachkomma-Stellen darzustellen, ist dies ein Fakt. Dem Wert 1/3 entspricht z.B. der in-terne Wert von 0.3333333.....

Deshalb sollten Sie nie den Ergebnissen von Fließkomma-Operationen bis auf dieletzte Nachkommastelle glauben oder solche auf Gleichheitprüfen. Sollten Sie eine grö-ßere Genauigkeit brauchen, so könnten Sie die mathematischen Funktionen beliebigerGenauigkeit benutzen.

5.4 Strings / Zeichenketten

Ein String ist eine Folge von Zeichen. In PHP entspricht ein Zeichen einem Byte, dasheißt, dass exakt 256 verschiedene Zeichen möglich sind. Das impliziert auch, dass PHPkeine native Unterstützung für Unicode bietet.

Page 34: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

24 KAPITEL 5. TYPEN

Anmerkung:Für einenString stellt die Länge kein Problem dar. Von PHP-Seite aus gibt es keinepraktische Grenze für die Größe eines Strings. Daher gibt eskeinen Grund sich Sorgenüber lange Strings zu machen.

5.4.1 Syntax

Ein String kann auf drei verschiedene Weisen geschrieben werden.

• Einfache Anführungszeichen (single quoted)

• Doppelte Anführungszeichen (double quoted)

• Heredoc Syntax

5.4.2 Einfache Anführungszeichen

Der leichteste Weg einen einfachen String zu schreiben, istder Einschluss in einfacheAnführungszeichen (das Zeichen ’).

Um ein einfaches Anführungszeichen wörtlich auszugeben, muss dieses mit einemBackslash (\) escaped werden, wie in vielen anderen Programmiersprachen auch. Es-capen bedeutet vor ein Zeichen mit einer speziellen Bedeutung (z. B.: das $ Zeichen)für die Programmiersprache ein “\“ zu setzen, um das Zeichen wörtlich (literal) anzuge-ben. Wenn Sie innerhalb eines Strings einen Backslash vor einem einfachen Anführungs-zeichen oder am Ende eines Strings ausgeben wollen, müssen Sie diesen verdoppeln.Beachten Sie: wenn Sie versuchen irgendwelche anderen Zeichen zu escapen, wird derBackslash ebenfalls ausgegeben! Daher besteht für gewöhnlich keine Notwendigkeit denBackslash selbst zu escapen.

Achtung: Anders als bei den zwei anderen Schreibweisen werden Variablen innerhalbvon single-quoted Stringsnicht ausgewertet.

echo ’Das ist ein einfacher String’;

echo ’Arnold sagte einmal: "I\’ll be back"’;// Ausgabe: ... "I’ll be back"

echo ’Sind Sie sicher, dass Sie C:\\*.* loeschen wollen?’;// Ausgabe: ... dass Sie C:\*.* loeschen wollen?

echo ’Sind Sie sicher, dass Sie C:\*.* loeschen wollen?’;// Ausgabe: ... dass Sie C:\*.* loeschen wollen?

echo ’Ich versuche einen Zeilenumbruch an diesem Punkt: \n e in Zeilenumbruch’;// Ausgabe: ... diesem Punkt: \n ein Zeilenumbruch’

$var = "nur zum Vergnuegen";echo ’Das mache ich $var’;// Ausgabe: Das mache ich $var

Page 35: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

5.4. STRINGS / ZEICHENKETTEN 25

5.4.3 Doppelte Anführungszeichen (Double quoted)

Wenn der String von doppelten Anführungszeichen (“) eingeschlossen ist, werden die Va-riablen innerhalb der Zeichenkette ausgewertet (begrenztdurch einige Einschränkungenbeim “Parsen“ (Syntaxanalyse) des PHP - Skripts). Wie in C und Perl kann das Backslash-Zeichen (“\“) zur An- und Ausgabe spezieller Zeichen benutzt werden, hier versteht PHPmehr Escape - Folgen für spezielle Zeichen als bei einfachenAnführungszeichen:

Zeichenfolge Bedeutung

\n neue Zeile (LF oder 0x0A (10) als ASCII-Code)\r Wagenrücklauf (CR oder 0x0D (13) als ASCII-Code)\t horizontaler Tabulator (HT oder 0x09 als ASCII-Code\\ Backslash (Rückstrich)\$ Dollar-Symbol\“ doppelte Anführungszeichen\[0-7]{1,3} die Zeichenfolge, die dem regulären Ausdruck entspricht, ist

in Oktal-Schreibweise (z.B.\007)\x[0-9A-Fa-f]{1,2} die Zeichenfolge, die dem regulären Ausdruck entspricht, ist

in Hexadezimal-Schreibweise (z.B.\x0F)

Tabelle 5.1: Nicht ausgewertete / Übergangene Zeichen

Noch einmal: wenn Sie versuchen, irgend ein anderes Zeichenzu escapen wird derBackslash ebenfalls mit ausgegeben! Sie können ein beliebiges anderes Zeichen überge-hen bzw. von der Auswertung ausschliessen; in der höchsten Warn-Stufe wird aber eineWarnmeldung ausgegeben. Der wichtigste Vorteil von double-quoted Strings ist die Tat-sache, dass Variablennamen ausgewertet werden.

Für Details siehe String Analyse (parsing)

5.4.4 Heredoc

Eine andere Möglichkeit Strings einzufassen, besteht im Gebrauch der “here doc“-Syntax(“<<<“). Hierfür ist nach<<< ein Bezeichner zu setzen. Nun folgt der eigentlicheString und dann derselbe Bezeichner um den String abzuschliessen.

Der schliessende Bezeichnermuss in der ersten Spalte der Zeile beginnen. Die ver-wendeten Bezeichner müssen den gleichen Regeln entsprechen wie alle anderen PHP -Bezeichner auch. Sie dürfen lediglich aus alphanumerischen Zeichen oder dem Unter-strich bestehen.

Warnung:Es ist sehr wichtig zu beachten, dass die Zeile mit dem schliessenden Bezeichner keineanderen Zeichen enthält, ausgenommen möglicherweise ein Semikolon (;). Das bedeutedim Besonderen, dass der Bezeichner nicht eingerückt werdendarf und es dürfen keineLeerzeichen oder Tabulatoren vor oder nach dem Semikolon stehen.

Der mit am unangenehmste Umstand ist der, dass ebenso kein Wagenrücklauf (\r) amEnde dieser Zeile stehen darf, nur ein Zeilenvorschub (\n).

“Here doc“-Text funktioniert wie ein Text innnerhalb doppelter Anführungszeichen,nur ohne die Anführungszeichen. Anführungszeichen innerhalb von “here doc“-Texten

Page 36: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

26 KAPITEL 5. TYPEN

müssen also keiner Sonderbehandlung (escapen) unterzogenwerden. Sie können aber dieobigen Escape - Anweisungen verwenden. Variablen werden ausgewertet, aber besondereAufmerksamkeit muss komplexen Variablen gewidmet werden,genau wie Strings.Beispiel 2.8: Beispiel zur String-Festlegung per “here doc“-Methode:

<?php$str = <<<EODBeispiel eines Stringsueber mehrere Skript-Zeilendurch Gebrauch der here doc-Syntax.EOD;

/* komplexeres Beispiel, mit Variablen */class foo {

var $foo;var $bar;

function foo() {$this->foo = ’Foo’;$this->bar = array(’Bar1’, ’Bar2’, ’Bar3’);

}}

$foo = new foo();$name = ’Mein Name’;

echo <<<EOTMein Name ist "$name". Ich schreibe einige $foo->foo.Nun schreibe ich gerade einige {$foo->bar[1]}.Dies sollte ein grosses ’A’ schreiben: \x41EOT;?>

Anmerkung: Die “here-doc“ - Unterstützung wurde in PHP 4 eingeführt.

5.4.5 Variablen-Analyse (parsing)

Wird ein String in doppelten Anführungszeichen oder mit heredoc angegeben, werdenenthaltene Variablen ausgewertet (geparst).

Es gibt zwei Syntax-Typen, eine einfache und eine komplexe.Die einfache Syntax istdie geläufigste und bequemste. Sie bietet die Möglichkeit eine Variable, einen Array-Wertoder eine Objekteigenschaft auszuwerten (parsen).

Die komplexe Syntax wurde in PHP 4 eingeführt und ist an den geschweiften Klam-mern { } erkennbar, die den Ausdruck umschließen.

5.4.5.1 Einfache Syntax

Sobald ein Dollarzeichen ($) auftaucht, wird der Parser versuchen, gierig so viele Zeichenwie möglich zu nehmen, um einen gültigen Variablennamen zu bilden. Schließen SieIhren Variablennamen in geschweifte Klammern ein, wenn Sieausdrücklich das Endedes Namens angeben wollen.

Page 37: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

5.4. STRINGS / ZEICHENKETTEN 27

$beer = ’Heineken’;echo "$beer’s Geschmack ist grossartig"; // funktioniert, "’" ist kein gueltiges

// Zeichen fuer einen Variablennamenecho "Er hat einige $beers getrunken"; // funktioniert nich t, ’s’ ist ein

// gueltiges Zeichen fuer einen// Variablennamen

echo "Er hat einige ${beer}s getrunken"; // funktioniert

Auf ähnliche Weise können Sie erreichen, dass ein Array-Index oder eine Objektei-genschaft ausgewertet wird. Bei Array-Indizes markiert die schließende eckige Klam-mer (]) das Ende des Index. Für Objekteigenschaften gelten die gleichen Regeln wie beieinfachen Variablen, obwohl es bei Objekteigenschaften keinen Trick gibt, wie dies beiVariablen der Fall ist.

$fruechte = array( ’Erdbeere’ => ’rot’ , ’Banane’ => ’gelb’ ) ;

// Achtung: ausserhalb von String-Anfuehrungszeichen fun ktioniert das anders.echo "Eine Banane ist $fruechte[Banane].";

echo "Dieses Quadrat ist $quadrat->breite Meter breit.";

// Funktioniert nicht. Fuer eine Loesung siehe die komplexe Syntax.echo "Dieses Quadrat ist $quadrat->breite00 Zentimeter br eit.";

Für irgendetwas komplexeres sollten Sie die komplexe Syntax nutzen.

5.4.5.2 Komplexe (geschweifte) Syntax

Diese wird nicht komplex genannt, weil etwa die Syntax komplex ist, sondern weil Sieauf diesem Weg komplexe Ausdrücke einbeziehen können.

Tatsächlich können Sie jeden beliebigen Wert einbeziehen,der im Namensbereich inStrings gültig ist. Schreiben Sie den Ausdruck einfach auf die gleiche Art und Weise, wieaußerhalb des Strings, und umschließen diesen mit ’{’ und ’}’. Da Sie ’{’ nicht escapenkönnen, wird diese Syntax nur erkannt, wenn auf ’{’ unmittelbar ’$’ folgt. (BenutzenSie ’{\$’ oder ’\{$’ um ein wörtliches ’{$’ zu erhalten.) Einige Beispiele, um dies zuverdeutlichen:

$great = ’fantastisch’;echo "Das ist { $great}"; // funktioniert nicht, Ausgabe: Da s ist { fantastisch}echo "Das ist {$great}"; // funktioniert, Ausgabe: Das ist f antastischecho "Dieses Quadrat ist {$square->width}00 Zentimeter br eit.";echo "Das funktioniert: {$arr[4][3]}";

// Das ist aus dem gleichen Grund falsch// wie $foo[bar] ausserhalb eines Strings falsch ist.echo "Das ist falsch: {$arr[foo][3]}";

echo "So sollten Sie es machen: {$arr[’foo’][3]}";echo "Sie k"onnen sogar schreiben {$obj->values[3]->name }";echo "Das ist der Wert der Variable mit Namen $name: {${$name }}";

5.4.6 Zugriff auf Zeichen in Strings

Auf Zeichen innerhalb von Strings kann durch die Angabe des nullbasierten Index in ge-schweiften Klammern nach dem String, auf das gewünschte Zeichen zugegriffen werden.

Page 38: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

28 KAPITEL 5. TYPEN

Anmerkung: Für Abwärtskompatibilität können Sie immer noch die Array-Klammernverwenden. Diese Syntax wird jedoch seit PHP 4 missbilligt.

5.4.7 Nützliche Funktionen

Zeichenketten / Strings können mittels des ’.’-Operators miteinander verbunden werden.Beachten Sie, dass in PHP der ’+’ (Additions)-Operator nicht funktioniert. Bitte beachtenSie auch String-Operatoren für weitergehende Informationen. Zeichen in einem Stringkönnen wie ein nummerisch-indiziertes Array von Zeichen angesprochen werden. DieSyntax ist der von C ähnlich.

Für allgemeine Funktionen schauen Sie sich den Abschnitt über String Funktionen an,und für fortgeschrittenes Suchen & Ersetzen die Funktionenzu Regulären Ausdrücken (inzwei Ausführungen: Perl Kompatibel and POSIX erweitert).

Weiterhin gibt es auch noch Funktionen für URL-Strings, undFunktionen zum Ver-schlüsseln / Entschlüsseln von Strings (mcrypt und mhash).

Schließlich, falls Sie immer noch nicht das gefunden haben wonach Sie suchen, kön-nen Sie unter den Zeichen-Typen Funktionen nachschauen.Beispiel 2.9: Einige String-Beispiele:

<?php// Zuweisung eines Strings.$str = "Dies ist eine Zeichenkette";

// Erweiterung dieses Strings.$str = $str . " mit etwas zusaetzlichem Text";

// andere Moeglichkeit zum Erweitern incl. Anweisung fuer N eue-Zeile.$str .= " und einer neuen Zeile am Ende.\n";

/** Nach diesen drei Operationen enthaelt $str:* "Dies ist eine Zeichenkette mit etwas zusaetzlichem Text* und einer neuen Zeile am Ende.\n."*/

// Dieser String wird am Ende zu: ’<p>Nummer: 9</p>’$num = 9;$str = "<p>Nummer: $num</p>";

// Dieser wird zu ’<p>Nummer: $num</p>’$num = 9;$str = ’<p>Nummer: $num</p>’;

// Der Index faengt bei 0 an$str = "ABC"echo strlen($str); // sollte 3 ausgeben der Index geht von 0 - 2

// Das erste Zeichen eines Strings.$str = ’Das ist ein Test.’$first = $str{0}; // $first enthaelt "D"

// Das letzte Zeichen eines Strings.

Page 39: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

5.5. ARRAYS 29

$str = ’Das ist immer noch ein Test.’$last = $str{strlen($str)-1}; // $last enthaelt "."?>

5.4.8 Umwandlung von Zeichenketten / Strings

Sobald ein String als Zahlenwert angesehen wird, wird der resultierende Wert und Typwie folgt festgelegt:Der String wird als float ausgewertet, wenn er eines der Zeichen ’.’, ’e’ oder ’E’ enthält.Ansonsten wird er als Integer-Wert interpretiert.

Der Wert wird durch den Anfangsteil des Strings bestimmt. Sofern der String mitgültigen numerischen Daten beginnt, werden diese als Wert benutzt. Anderenfalls kannder Wert auch 0 (NULL) sein. Gültige numerische Daten sind ein optionales Vorzeichen,gefolgt von einer oder mehreren Zahlen (optional mit einem Dezimalpunkt). Wahlweisekann auch ein Exponent angegeben werden. Dieser besteht auseinem ’e’ oder ’E’, gefolgtvon einer oder mehreren Zahlen. Sobald der erste Ausdruck ein String ist, hängt der Typder Variablen vom zweiten Ausdruck ab.Beispiel 2.10: Umwandlung von Zeichenketten

<?php$foo[] = 1 + "10.5"; // $foo ist double (11.5)$foo[] = 1 + "-1.3e3"; // $foo ist double (-1299)$foo[] = 1 + "bob-1.3e3"; // $foo ist ein Integer-Wert (1)$foo[] = 1 + "bob3"; // $foo ist ein Integer-Wert (1)$foo[] = 1 + "10 Small Pigs"; // $foo ist ein Integer-Wert (11)$foo[] = 1 + "10 Little Piggies"; // $foo ist ein Integer-Wert (11)$foo[] = "10.0 pigs " + 1; // $foo ist ein Integer-Wert (11)$foo[] = "10.0 pigs " + 1.0; // $foo ist double (11)

print_r($foo);?>

Mehr Informationen über solche Umwandlungen können Sie im UNIX-Manual unterstrtod(3) finden.

5.5 Arrays

In einem Array können Sie mehrere Werte in einer Variablen speicher. Das ist in vielenFällen sinvoll, wenn Sie die gleiche Operation auf mehrerenVariable ausführen möchten.Ein Array in PHP ist eigentlich eine geordnete Abbildung. Eine Abbildung ist ein Typder Werte auf Schlüssel abbildet. Dieser Typ ist auf mehrereArten optimiert, so dassSie ihn auf verschiedene Weise benutzen können: als reales Array, als Liste (Vektor),als Hash-Tabelle (das ist eine praktische Anwendung einer Abbildung), als Verzeichnis,als Sammlung, als Stapel (Stack), als Warteschlange (Queue) und möglicherweise mehr.Da Sie ein weiteres Array als Wert benutzen können, ist es ziemlich einfach möglichBaumstrukturen zu simulieren.

Die Erklärung dieser Strukturen würde den Rahmen dieses Buches sprengen, da dieseStrukturen auch Themen der theoretischen Informatik berühren. Zumindest finden Sie

Page 40: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

30 KAPITEL 5. TYPEN

aber ein Beispiel für jede dieser Strukturen. Für weitergehende Informationen verweisenwir auf externe Literatur zu diesem breit gefächerten Thema.

5.5.1 Syntax

Ein Array kann mit Hilfe des Sparchkonstruktsarray() erzeugt werden. Es benötigt einebestimmte Anzahl von kommagetrennten’Schlüssel => Wert’ Paaren.

Ein Schlüssel ist entweder eine nichtnegative Zahl vom Typinteger oder einString . Wenn einSchlüssel die Standarddarstellung einer nichtnegativen integer Zahlist, wird es als solche interpretiert werden, (z.B. ’8’ wirdals 8 (Zahl) interpretiert während’08’ als ’08’ (String) interpretiert werden wird).

Weglassen von Schlüsseln. Falls Sie einen Schlüssel weglassen, wird das Maximumdes Integer- Indizes gennnommen und der neue Schlüssel wirddieses Maximum + 1 sein.Falls es bis dahin keine Integer-Indizes gibt, wird der Schlüssel zu 0 (Null). Falls Sie einenSchlüssel angeben dem schon ein Wert zugeordnet wurde, wirddieser Wert überschrie-ben.

array( [Schluessel =>] Wert, ...)

Schluessel ist entweder ein String oder eine nicht-negative integer Zahl. Wert kannein beliebiger Wert sein. Die eckigen Klammern bedeuten hier, dass ’[Schluessel =>]’optional ist.

5.5.2 Eindimensionale Arrays

PHP unterstützt sowohl skalare als auch assoziative Arrays. Unter einem Skalar verstehtman einen Wert (numerisch oder alphanumerisch), der nicht weiter teilbar ist, ohne dasser seine Semantik (Bedeutung) verliert. Letztendlich gibtes keinen Unterschied zwischenden beiden. Sie können ein Array erzeugen, indem sie dielist() oderarray() Funk-tionen benutzen, oder sie können explizit den Wert eines jeden Array-Elements festlegen.Beispiel 2.11: Eindimensionale Arrays

<?php$a[0] = "abc";$a[1] = "def";$b["foo"] = 13;?>

Sie können ein Array auch erzeugen, indem Sie einfach Werte einem Array hinzu-fügen. Wenn sie einer Array-Variablen einen Wert zuweisen,indem sie leere Klammernbenutzen, wird der Wert am Ende des Arrays hinzugefügt.Beispiel 2.12: Werte hinzufügen

<?php$a[] = "hallo"; // $a[2] == "hallo"$a[] = "welt"; // $a[3] == "welt"?>

Page 41: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

5.5. ARRAYS 31

Arrays können durch Gebrauch derasort() , arsort() , ksort() , rsort() , sort() ,uasort() , usort() unduksort() -Funktionen sortiert werden (in Abhängigkeit von dergewünschten Sortierung). Sie können die Anzahl der Elemente eines Arrays mittels dercount() - Funktion ermitteln.

Durchlaufen können sie ein Array pernext() undprev() - Funktion. Weitere Mög-lichkeiten sind die Funktioneneach() in Kombination mitlist() und foreach() .

5.5.3 Mehrdimensionale Arrays

Mehrdimensionale Arrays sind einfach. Für jede Dimension des Arrays fügen sie einenweiteren [Schlüssel]-Wert ans Ende an:Beispiel 2.13: Mehrdimensionale Arrays

<?php$a[1] = $f; # Ein-Dimensionales Beispiel$a["foo"] = $f; # Assoziatives Beispiel

$a[1][0] = $f; # Zwei-Dimensional$a["foo"][2] = $f; # (sie koennen numerische und

assoziative Indizes so mischen)$a[3]["bar"] = $f; # (oder so)

$a["foo"][4]["bar"][0] = $f; # Vier-Dimensional!?>

In PHP ist es nicht möglich, mehrdimensionale Arrays direktals Strings zu referen-zieren. Deshalb erzeugt auch das nachfolgende Beispiel nicht das gewünschte Ergebnis:Beispiel 2.14: Mehrdimensionale Arrays referenzieren

<?php$a[3][’bar’] = ’Bob’;echo "Dies funktioniert nicht: $a[3][bar]";?>

In PHP wird das obige Beispiel folgendes ausgeben: “Dies funktioniert nicht: Ar-ray[bar]“ . Jedoch kann der String-Verbindungs-Operator benutzt werden, um dies zuumgehen:Beispiel 2.15: Mehrdimensionales Array richtig referenzieren

<?php$a[3][’bar’] = ’Bob’;echo "Das funktioniert: " . $a[3][bar];?>

In PHP 4 kann das Problem umgangen werden, indem die Array-Referenz in ge-schweiften Klammern eingeschlossen wird:Beispiel 2.16: Mehrdimensionales Array in PHP 4

<?php$a[3][’bar’] = ’Bob’;echo "Das funktioniert in PHP 4: {$a[3][bar]}";?>

Page 42: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

32 KAPITEL 5. TYPEN

Man kann multidimensionale Arrays auf viele Arten füllen,aber der trickreichste Weggeht über das Verständnis, wie derarray() -Befehl für assoziative Arrays zu benutzenist. Die folgenden Code-Schnippsel füllen das eindimensionale Array über den gleichenWeg:Beispiel 2.17: Eindimensionales Array füllen

<?php# Beispiel 1:$a["farbe"] = "rot";$a["geschmack"] = "suess";$a["form"] = "rund";$a["name"] = "apfel";$a[3] = 4;

# Beispiel 2:$a = array("farbe" => "rot","geschmack" => "suess","form" => "rund","name" => "apfel",3 => 4);?>

Die array() -Funktion kann eingefügt werden für mehrdimensionale Arrays:Beispiel 2.18: Mehrdimensionales Array mit verschachteltemarray()

<?php$a = array(

"apfel" => array("farbe" => "rot","geschmack" => "suess","form" => "rund"),

"orange" => array("farbe" => "orange","geschmack" => "sauer","form" => "rund")

);

echo $a["apfel"]["geschmack"]; # dies wird "suess" ausgeg eben?>

Page 43: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

5.6. OBJEKTE 33

5.6 Objekte

Objekt-InitialisierungUm ein Objekt zu initialisieren benutzen Sie die Angabenew, dadurch wird das Objekteiner Variablen-Instanz zugewiesen.Beispiel 2.19: Dernew - Operator

<?phpclass foo{

function getFoo(){

echo "Doing foo.";}

}$bar = new foo;$bar->getFoo();}?>

Eine ausführliche Besprechung lesen Sie im Kapitel Klassenund Objekte nach.

5.7 Resource

Eine Resource ist eine spezielle Variable, die eine Referenz auf eine externe Resource ent-hält. Resourcen werden von bestimmten Funktionen erzeugt und benutzt. Eine Liste dieserFunktionen und der entsprechenden Resource-Typen finden Sie unter http://www.php.net/manual/de/resource.php.

Anmerkung: Der Resource-Typ wurde in PHP 4 eingeführt.

5.7.1 Freigabe von Resourcen

Aufgrund des Reference-Counting Systems, das mit PHP 4’s Zend-Egine eingeführt wur-de, wird automatisch entdeckt, wenn auf eine Resource nichtmehr zugegriffen wird (wiein Java). Wenn dies der Fall ist werden alle Resourcen, die für diese Resource in Gebrauchwaren, durch den “Müllsammler“ (garbage collector) freigegeben. Aus diesem Grund istes selten jemals notwendig, Speicher manuell durch Aufruf von free_result() Funktionenfreizugeben.

Anmerkung: Persistente Datenbank-Links stellen einen Sonderfall dar, sie werdendurch den gc (garbage collector) nicht zerstört.

5.8 NULL

Der spezielleNULL Wert steht dafür, dass eine Varaiable keinen Wert hat.NULL ist dereinzig mögliche Wert des TypsNULL.

Anmerkung: Der NULL-Typ wurde in PHP 4 eingeführt.

Page 44: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

34 KAPITEL 5. TYPEN

5.8.1 SyntaxEs gibt nur einen Wert des TypsNULL, das SchlüsselwortNULL. Groß- oder Kleinschrei-bung spielt keine Rolle.

$var = NULL;

5.9 Typen-Tricks

PHP erfordert (bzw. unterstützt) keine explizite Typdefinitionen bei der Deklaration vonVariablen; der Typ einer Variablen wird bestimmt durch den Zusammenhang in dem dieVariable benutzt wird. Das bedeutet, dass bei der Zuweisungeiner Zeichenkette / einesStrings zu einer Variablen$var diese Variable$var den Typ String erhält. Sollten siedananch der Variablen$var einen Integer-Wert zuweisen, wird sie zu einem Integer-Typ.

Ein Beispiel für die automatische Typ-Konvertierung von PHP ist der Plus-Operator’+’. Ist einer der zu addierenden Werte vom Typ double, werden alle Werte als double-Typ gehandhabt. Auch das Ergebnis der Addition wird vom Typ double sein. Ist diesnicht der Fall, werden Werte als Integer-Typen angesehen und das Ergebnis wird ebenfallsvom Typ Integer sein. Beachten sie, dass hierdurch nicht derTyp der Additions-Elementeselbst beeinflusst wird; der Unterschied liegt einzig und allein in der Auswertung dieserElemente.Beispiel 2.20: Automatische Typkonvertierung

<?php$foo = "0"; // $foo ist vom Typ String (ASCII 48)$foo++; // $foo ist immer noch vom Typ String,

Inhalt "1" (ASCII 49)$foo += 1; // $foo ist jetzt vom Typ Integer (2)$foo = $foo + 1.3; // $foo ist nun vom Typ double (3.3)$foo = 5 + "10 Little Piggies"; // $foo ist vom Typ Integer (15)$foo = 5 + "10 Small Pigs"; // $foo ist vom Typ Integer (15)?>

Wenn für Sie die letzten beiden Beispiele gleich sind, beachten Sie den AbschnittString-Umwandlung. Wenn Sie die Auswertung einer Variablen als ein spezieller Typerzwingen wollen, beachten Sie den Abschnitt in Typ-Umwandlung. Wenn Sie den Typeiner Variablen wechseln wollen, sehen Sie bitte beisettype() nach. Um die Beispieledieses Kapitels auszuprobieren, können sie die Funktionvar_dump() verwenden.

Anmerkung: Das Verhalten einer automatischen Umwandlung ist zur Zeit undefi-niert.Beispiel 2.21: Verhalten bei automatischer Typkonvertierung

<?php$a = 1; // $a ist ein Integer-Wert$a[0] = "f"; // $a wird zum Array, $a[0] enthaelt "f"?>

Weil das obige Beispiel so aussieht, als ob texttt$a ein Array wird, dessen erstes Ele-ment ein “f“ enthält, beachten sie folgendes:Beispiel 2.22: Undefiniertes Verhalten bei automatischer Typkonvertierung

Page 45: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

5.10. TYPUMWANDLUNG (CAST) 35

<?php$a = "1"; // $a ist ein String$a[0] = "f"; // Was ist mit den String-Offsets? Was passiert??>

Weil PHP die Indizierung innerhalb von Strings mittels der gleichen Syntax wie beider Array-Indizierung unterstützt, führt das obige Beispiel zu einem Problem: Soll$a zueinem Array werden, dessen erstes Element ein “f“ ist oder soll “f“ das erste Zeichen desStrings$a werden?

Aus diesem Grund ist das Ergebnis der automatischen Umwandlung seit PHP 3.0.12und auch in PHP 4.0b3-RC4 undefiniert. Lösungen werden noch diskutiert.

5.10 Typumwandlung (cast)Typumwandlung in PHP funktioniert vielfach wie in C: Der Name des geforderten Typswird vor der umzuwandelnden Variablen in Klammern gesetzt.Beispiel 2.23: Expliziete Typumwandlung

<?php$foo = 10; // $foo ist ein Integer-Wert$bar = (double) $foo; // $bar ist vom Typ double?>

Folgende Umwandlungen sind möglich:

• (int), (integer) - Umwandlung in Integer-Wert

• (real), (double), (float) - hin zu double

• (string) - hin zu String

• (array) - hin zum Array

• (object) - Wandlung zum Objekt

Beachten Sie, dass Tabulatoren und Leerzeichen innerhalb der Klammern erlaubt sind.Deshalb sind die folgenden Beispiel identisch:Beispiel 2.24: Tabulatoren und Leerzeichen

<?php$foo = (int) $bar;$foo = ( int ) $bar;?>

Es ist nicht immer offenkundig, was bei der Typ-Umwandlung geschieht. Zum besse-ren Verständnis sollte das Folgende beachtet werden: Bei der Umwandlung einer skalarenoder String-Variablen wird die Variable das erste Element des Arrays:Beispiel 2.25: Umwandlung in ein Array

<?php$var = ’ciao’;$arr = (array) $var;echo $arr[0]; // gibt ’ciao’ aus?>

Page 46: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

36 KAPITEL 5. TYPEN

Sobald eine skalare oder String-Variable in ein Objekt gewandelt wird, wird die Va-riable zu einem Attribut des Objekts; der Eigenschaftsnamewird “skalar“:Beispiel 2.26: Umwandlung in ein Objekt

<?php$var = ’ciao’;$obj = (object) $var;echo $obj->scalar; // gibt ’ciao’ aus?>

Page 47: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 6

Variablen

6.1 Grundlegendes

Variablen werden in PHP dargestellt durch ein Dollarzeichen “$“ gefolgt vom Namen derVariablen. Bei Variablennamen wird zwischen Groß- und Kleinschreibung unterschieden(case-sensitive).

Variablennamen werden in PHP nach den gleichen Regeln wie die andere Bezeichnererstellt. Ein gültiger Variablen-Name beginnt mit einem Buchstaben oder einem Unter-strich “_“, gefolgt von einer beliebigen Anzahl von Buchstaben, Zahlen oder Unterstri-chen. Als regulärer Ausdruck (regular expression) würde eswie folgt ausgedrückt:

’[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*’.

Anmerkung: Unserem Zweck entspricht also ein Buchstabe vona bis z bzw. A bis Zoder einem ASCII-Zeichen von 127 bis 255 (0x7f bis 0xff).Beispiel 2.27: Variablennamen

<?php$var = "Du";$vaR = "und";$Var = "ich";$vAr = "wir lernen PHP"echo "$var $vaR $Var, $vAr"; // gibt "Du und ich, wir lernen PH P" aus

$4site = ’nicht jetzt’; // ungueltig, da Anfang eine Zahl$_4site = ’nicht jetzt’; // gueltig, da Unterstrich am Anfan g?>

Variablen werden in PHP 3 durch ihren Wert bestimmt. Das heisst, wenn Sie einerVariablen einen Ausdruck zuweisen, wird der gesamte Inhaltdes Originalausdrucks in dieZielvariable kopiert. Die Folge ist, dass eine Variable, die ihren Inhalt von einer anderenVariablen erhalten hat, ihren Inhalt behält, auch wenn Sie danach den Inhalt der anderen(Quell- / Ursprungs-)Variablen ändern. Die Inhalte der Ziel- und Quellvariablen sind alsoinsoweit unabhängig voneinander. Für weitere Informationen lesen sie bitte Expressions/ Ausdrücke.

PHP 4 bietet eine andere Möglichkeit der Wertzuweisung bei Variablen: Zuweisungdurch Referenzierung. Das bedeutet, dass der Wert der neuenVariablen eine Referenz zur

37

Page 48: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

38 KAPITEL 6. VARIABLEN

Ursprungsvariablen darstellt (mit anderen Worten: Der Wert ist ein Alias bzw. Zeiger aufden Inhalt der Ursprungsvariablen). Beide Variablen zeigen also auf die selbe(n) Spei-cherstelle(n). Änderungen der neuen Variablen ändern auchderen Ursprungsvariable undumgekehrt. Der Wert / Inhalt wird also nicht kopiert. Die Übertragung geschieht dadurchauch schneller als in PHP 3. Dies wird sich aber nur bei umfangreichen Schleifen oderbei der Übertragung von grossen Arrays oder Objekten bemerkbar machen.

Für die Zuweisung per Referenz müssen Sie lediglich ein “&“ der (Ausgangs-, Quell-) Variablen voranstellen, die Sie einer anderen Variablen zuweisen wollen. Der folgendeSkriptausschnitt wird zweimal ’Sein Name ist Robert Paulsen’ ausgeben:Beispiel 2.28: Zuweisung per Referenz

<?php$foo = ’Robert Paulsen’; // ’Robert Paulsen’ der Variablen $ foo zuweisen.$bar = &$foo; // Referenz auf $foo in $bar erzeugen.$bar = "Sein Name ist $bar"; // $bar veraendern...echo $foo; // $foo wurde dadurch ebenfalls veraendert.echo $bar;?>

Zu beachten ist, dass nur Variablenbezeichner referenziert werden können.Beispiel 2.29: Ungültige Zuweisungen

<?php$foo = 25;$bar = &$foo; // Gueltige Zuweisung.$bar = &(24 * 7); // Ungueltig, da kein Variablenbezeichner

zugewiesen wird.function test() {

return 25;}

$bar = &test(); // Ungueltig.?>

6.2 Geltungsbereich von VariablenDer Geltungsbereich einer Variablen ergibt sich aus dem Zusammenhang, in dem sie de-finiert wurde. Meistens besteht dieser aus einem einzigen Bereich. Dieser beinhaltet auchden Bereich für Dateien, die perinclude() - oderrequire() -Anweisung eingebundenwurden.Beispiel 2.30: Geltungsbereich von Variablen

<?php$a = 1;include "b.inc";?>

Die Variable$a ist auch in der eingebundenen Datei b.inc verfügbar. In ’b.inc’ kannz. B. echo ’$a’; stehen. In benutzerdefinierten Funktionen wird ein auf die Funktionbeschränkter Geltungsbereich eingeführt. Jede in einer Funktion benutzte Variable ist zu-nächst auf den lokalen Bereich der Funktion beschränkt.Beispiel 2.31: Lokale Variable

Page 49: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

6.2. GELTUNGSBEREICH VON VARIABLEN 39

<?php$a = 1; /* globaler Bereich */

function test() {echo $a; /* Referenz auf einen lokalen Variablen-Bereich */

}

test();?>

Dieses Skript erzeugt keine Bildschirm-Ausgabe, da sich die echo() Anweisung aufeine lokale Variable namens$a bezieht und dieser kein Wert im lokalen Bezug zuge-wiesen worden ist. Dies ist ein kleiner Unterschied zu C, wo globale Variablen auch inFunktionen vorhanden sind, es sei denn, sie werden durch eine funktionsinterne Definiti-on überschrieben. Das kann zu Problemen führen, denn in PHP müssen global geltendeVariablen innerhalb von Funktionen als solche definiert werden.Beispiel 2.32: Globale Variablen

<?php$a = 1;$b = 2;

function sum() {global $a, $b;$b = $a + $b;

}

sum();echo $b;?>

Das obige Skript gibt “3“ aus. Durch das Deklararieren der Variablen$a und $b in-nerhalb der Funktion als global, weisen alle Referenzen zu beiden Variablen auf die nunglobalen Werte. Es gibt keine Beschränkungen bei der Anzahlan globalen Variablen, diedurch eine Funktion verändert werden können.

Eine weitere Möglichkeit besteht in der Verwendung des speziellen $GLOBALSPHP-Array. Das obige Beispiel kann damit auch so geschrieben werden.Beispiel 2.33: Globale Variablen mit$GLOBALS

<?php$a = 1;$b = 2;

function sum(){

$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];}

sum();echo $b;?>

Das $GLOBALS - Array ist ein assoziatives Array mit dem Bezeichner der globalenVariablen als Schlüssel und dem Inhalt dieser Variablen alsWert des Array-Elements. Einweiterer wichtiger Anwendungszweck von Variablen-Bereichen ist die static-Variable.

Page 50: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

40 KAPITEL 6. VARIABLEN

Eine statische Variable existiert nur in einem lokalen Funktions-Bereich, der Wert gehtbeim Verlassen dieses Bereichs aber nicht verloren.Beispiel 2.34: Statische Variablen

<?phpfunction test(){

$a = 0;echo $a;$a++;

}

test();test();test();?>

Diese Funktion ist sinnlos, da sie bei jedem Aufruf$a auf 0 setzt und “0“ ausgibt. DieAnweisung$a++ , welche den Wert erhöht, macht keinen Sinn, da der Wert von$a beimVerlassen der Funktion verloren geht. Um eine sinnvolle Zählfunktion zu implementieren,die ihren aktuell gesetzten Wert nicht vergisst, müssen Siedie $a-Variable als “static“deklarieren.Beispiel 2.35: Benutzung statischer Variablen

<?phpfunction test(){

static $a = 0;echo $a;$a++;

}

test();test();test();?>

Jetzt wird bei jedem Aufruf dertest() -Funktion der aktuelle Wert von$a ausgege-ben und dann um 1 erhöht. Static-Variablen ermöglichen aucheinen Weg des Umgangsmit rekursiven Funktionen. Das sind Funktionen, die sich selbst aufrufen. Hierbei bestehtdie Gefahr, so genannte Endlosschleifen zu programmieren.Sie müssen also einen Wegvorsehen, die Rekursion zu beenden. Die folgende einfache Funktion berechnet rekursivdie Fakultät einer Zahl. Die Variable$fak wird benutzt, um die Rekursion zu beenden.Beispiel 2.36: Rekursive Funktion

<?phpfunction fakultaet($fak){

if ($fak <= 1) {return 1;

} else {return($fak * fakultaet(--$fak));

}

Page 51: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

6.3. VARIABLE VARIABLEN 41

}

$erg = fakultaet($zahl);

echo "Fakultaet von ".($zahl)." = $erg <br>";?>

6.3 Variable Variablen

Manchmal ist es erforderlich, variable Variablenbezeichner zu benutzen. Das bedeutet,einen Variablennamen zu setzen und dynamisch zu gebrauchen. Eine normale Variablewird wie folgt gebildet:

$a = "hallo";

Eine variable Variable nimmt den Wert einer Variablen und behandelt ihn als Bezeich-ner der Variablen. Im obigen Beispiel kannhallo als Variablenname gebraucht werden,indem man zwei $-Zeichen benutzt, also schreibt:

$$a = "Welt";

Nun existieren in der PHP-Symbol-Struktur zwei definierte und gespeicherte Varia-blen: $a mit dem Inhalt “hallo“ und$hallo mit dem Inhalt “Welt“. Deshalb wird dieAnweisung:

echo "$a ${$a}";

zur gleichen Ausgabe führen wie:

echo "$a $hallo";

also zu:hallo Welt .Wenn Sie variable Variablen mit Arrays verwenden, müssen Sie eine Unklarheit be-

achten. Wenn Sie nämlich$$a[1] schreiben, dann muss der Parser wissen, ob Sie$a[1]als Variable oder$$a als Variable und dann [1] als Index dieser Variablen verwenden wol-len bzw. gemeint haben. Die Lösung: Verwenden Sie${$a[1]} für den ersten Fall und${$a}[1] für den zweiten.

Variable Variablen haben interessante Einsatzmöglichkeiten in Verbindung mit asso-ziativen Arrays. Einen kleinen Einblick bekommen Sie durchfolgendes Beispiel:Beispiel 2.36a: Variable Variablen mit assoziativen Array

<?php$arr = array(varname => "varinhalt", varname2 => "varinhal t2");

foreach ($arr as $key => $value) {$$key = $value;

}echo $varname.", ".$varname2;// Ausgabe: varinhalt, varinhalt2?>

Page 52: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

42 KAPITEL 6. VARIABLEN

6.4 Variablen ausserhalb von PHP

6.4.1 HTML-Formulare (GET and POST)

Sobald ein Formular an ein PHP-Skript übergeben wird, wird jede Variable dieses For-mulars dem Skript automatisch verfügbar gemacht. Dafür sorgt PHP.Beispiel 2.37: Einfache Formular-Variablen

<html><body>

<form action="foo.php" method="post">Name: <input type="text" name="name"><br><input type="submit">

</form></body>

</html>

Bei der Formularübergabe (hier per POST) erzeugt PHP die Variable$name, die ge-nau das enthält, was Sie in das Name: -Feld des Formulars eingegeben haben.Im Zusammenhang mit Formular-Variablen versteht PHP auch Arrays, aber nur eindi-mensionale. Deshalb müssen sie die betreffenden Variablenvorher gruppieren oder dasfolgende Beispiel auf Mehrfach-Auswahl-Bereiche anwenden:Beispiel 2.38: Komplexere Formular-Variablen

<html><form action="array.php" method="post">

Name: <input type="text" name="personal[name]"><br>Email: <input type="text" name="personal[email]"><br>Bier: <br><select multiple name="bier[]">

<option value="binding">Binding<option value="warsteiner">Warsteiner<option value="stauder">Stauder<option value="stuttgarter">Stuttgarter Schwabenbraeu

</select><input type="submit">

</form></html>

Ist das PHP-“track_vars“-Feature eingeschaltet (entweder durch track_vars Konfi-gurationseinstellung oder per<?php_track_vars?> Anweisung), können die durch diePOST- oder GET-Methode übertragenen Variablen in den globalen assoziativen Arrays$HTTP_POST_VARSund$HTTP_GET_VARSwieder gefunden werden.

6.4.2 IMAGE SUBMIT Variablenbezeichner

Zur Übertragung eines Formulars kann auch ein Bild (Image) statt eines Übertragungs-schalters (Submit - Button) benutzt werden, dessen Tag wie folgt aussieht:

<input type=image src="image.gif" name="sub">

Page 53: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

6.5. HTTP-COOKIES 43

Klickt der Benutzer irgendwo auf das Bild, wird der entsprechende Formularinhalt anden Web-Server übertragen. Hierbei sind zwei zusätzliche Variablen vorhanden, sub_xund sub_y. Diese enthalten die Koordinaten des Klickpunktes innerhalb des Bildes. DieErfahrenen HTML Programmierer werden sagen, dass die Variablen kein Unterstrich ha-ben (sondern ein Punkt, z.B. “sub.x“). Die Unterstriche werden aber automatisch von PHPerzeugt.

6.5 HTTP-Cookies

PHP unterstützt HTTP-Cookies, wie sie in Netscape’s Spec definiert sind. Cookies er-möglichen die Daten-Speicherung innerhalb der jeweiligenBrowser-Umgebung zur Wei-terleitung oder wiederholten Identifikation von Benutzern. Sie können Cookies erzeugen,indem Sie dieSetCookie() - Funktion benutzen. Cookies sind Teil des HTTP-Headers,deshalb muss dieSetCookie() -Funktion aufgerufen werden, bevor irgendeine Ausgabean den Browser gesendet wird. Dabei handelt es sich um die gleiche Einschränkung, dieauch für dieheader() -Funktion gilt. Alle an sie gesendeten Cookies werden in PHP-Variablen umgesetzt, genau wie die Daten bei den GET- und POST-Methoden.

Wenn Sie einem einzelnen Cookie verschiedene Wert zuweisenwollen müssen siedem Cookie-Namen [ ] hinzufügen. Z.B.:

SetCookie ("MeinCookie[]", "Ich teste", time()+3600);

Bedenken Sie, dass ein Cookie ein vorhergehendes Cookie gleichen Namens über-schreibt, es sei denn, der Pfad oder die Domain ist anders. Für eine Warenkorb-Anwendungmüssen Sie deshalb z.B. einen Zähler bilden und diesen weiter leiten. Beispiel 2.39:SetCookie-Beispiel

$Count++;SetCookie ("Count", $Count, time()+3600);SetCookie ("Cart[$Count]", $item, time()+3600);

6.6 Umgebungs- / Environment-Variablen

PHP sorgt automatisch für die Verfügbarkeit der Umgebungsvariablen als normale PHP-Variablen.Beispiel 2.40: Umgebungsvariablen

echo $HOME; /* Zeigt die HOME-Umgebungs-Variable(sofern gesetzt).*/

Da Informationen per GET, POST und Cookie-Mechanismen übergeben werden, ist esmanchmal das Beste, Umgebungs-Variablen explizit auszulesen. Dadurch wird die rich-tige Version eingelesen. Hierfür kann diegetenv() -Funktion genutzt werden. Den Werteiner Umgebungs-Variablen können Sie perputenv() - Funktion setzen.

Page 54: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

44 KAPITEL 6. VARIABLEN

6.6.1 Punkte in eingelesenen Variablen-BezeichnernNormalerweise verändert PHP nicht die Variablen-Bezeichner, wenn Sie einem Skriptübergeben werden. Es sollte aber beachtet werden, dass der Punkt (“.“) kein gültiger Be-standteil eines Variablen- Bezeichners ist. Deshalb achten Sie auf folgendes.Beispiel 2.41: Ungültige Variablenbezeichnung

$varname.ext;/* ungueltiger Variablen-Bezeichner */

Der PHP-Parser sieht eine Variable Namens$varname , gefolgt von einem Zeichen-ketten - Verbindungs - Operator, dieser wiederrum gefolgt von der offenen Zeichenket-te ’ext’ (also nicht eingegrenzt durch ’“’ und auch keinem Schlüssel oder reserviertemBezeichner entsprechend). Das kann natürlich nicht zum gewünschten Ergebnis führen.Deshalb ist es wichtig zu wissen, dass PHP in den ihm übergebenen Variablen alle Punkte(.) automatisch durch einen Unterstrich (_) ersetzt.

6.7 Bestimmung des Variablen-Typs

Da PHP den Typ einer Variablen bestimmt und grundsätzlich selbst eine entsprechendeUmformung vornimmt, ist es nicht immer klar, welchen Typ eine Variable momentanhat. PHP beinhaltet einige Funktionen, die dies herausfinden. Als da sind:gettype() ,is_long() , is_double() , is_string() , is_array() undis_object() . Beim debug-gen kann die Funktionprint_r() odervar_dump() zum schnellen Anzeigen des Varia-bleninhalts und -typs verwendet werden.

Page 55: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 7

Ausdrücke

Ausdrücke (Expressions) sind die wichtigsten Bausteine von PHP. In PHP ist fast alles,was geschrieben wird, ein Ausdruck. Die einfachste, aber auch zutreffenste Definition füreinen Ausdruck ist “alles, was einen Wert hat“.

Die grundlegendsten Formen von Ausdrücken sind Konstantenund Variablen. Wennman “$a = 5“ schreibt, weist man$a den Ausdruck’5’ zu. ’5’ hat offensichtlich denWert 5. Anders ausgedrückt:’5’ ist ein Ausdruck mit dem Zahlenwert 5 (in diesem Fallist ’5’ eine Integer-Konstante).

Nach dieser Zuweisung würde man erwarten, dass der Wert von$a nun ebenfalls 5ist, wenn man also $b = $a schreibt, sollte dasselbe dabei herauskommen, als hätte man$b = 5 geschrieben. Anders ausgedrückt:$a wäre ebenfalls ein Ausdruck mit dem Wert5. Wenn alles richtig funktioniert, wird genau das passieren.Etwas kompliziertere Beispiele für Ausdrücke sind Funktionen:

<?phpfunction foo() {

return 5;}foo();?>

Angenommen, Sie sind mit dem Konzept von Funktionen vertraut (wenn Sie es nichtsind, lesen Sie das Kapitel über Funktionen), dann würden Sie annehmen, dass die Ein-gabe von $c = foo() grundsätzlich dasselbe bedeutet, als würde man schreiben $c = 5,und genau das trifft zu. Funktionen sind Ausdrücke mit dem Wert ihres Rückgabewertes.Da foo() den Wert 5 zurückgibt, ist der Wert des Ausdruckes’foo()’ 5. Normalerweisegeben Funktionen nicht einfach einen statischen Wert zurück, sondern berechnen irgen-detwas.

Natürlich müssen Werte in PHP keine Integer-Zahlen sein, und oft sind sie es auchnicht. PHP unterstützt drei skalare Datentypen integer values (Integer-Zahlen), floatingpoint values (Fließkommazahlen) und string values (Zeichenketten). (Skalare sind Daten-typen, die man nicht in kleinere Stücke ’brechen’ kann, im Gegensatz zu Arrays). PHP un-sterstützt auch zwei zusammengesetzte (nicht-skalare) Datentypen: Arrays und Objekte.Jeder dieser Datentypen kann Variablen zugewiesen und von Funktionen zurückgegebenwerden.

45

Page 56: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

46 KAPITEL 7. AUSDRÜCKE

Bis hierhin sollten Benutzer von PHP/FI 2 keine Veränderungbemerkt haben. PHPfasst den Begriff ’Ausdruck’ aber noch viel weiter, wie es auch andere Programmier-sprachen tun. PHP ist in dem Sinne eine ausdrucksoriente Sprache, dass fast alles einAusdruck ist. Zurück zu dem Beispiel, mit dem wir uns schon beschäftigt haben: ’$a =5’. Es ist einfach zu erkennen, dass hier zwei Werte enthalten sind: Der Wert der Integer-Konstanten’5’ und der Wert von$a, der auf 5 geändert wird. In Wirklichkeit ist abernoch ein zusätzlicher Wert enthalten, nämlich der Wert der Zuweisung selbst. Die Zuwei-sung selbst enthält den zugewiesenen Wert, in diesem Fall 5.In der Praxis bedeutet dies,dass ’$a = 5’, egal was es tut, immer einen Ausdruck mit dem Wert 5 darstellt. Folglich ist’$b = ($a = 5)’ gleichbedeutend mit ’$a = 5; $b = 5;’ (ein Semikolon markiert das Endeeiner Anweisung). Da Wertzuweisungen von rechts nach linksgeparst werden, kann manauch ’$b = $a = 5’ schreiben.

Ein anderes gutes Beispiel für die Ausdrucksorientierung von PHP sind Prä- und Post-Inkremente sowie die entsprechenden Dekremente. Benutzervon PHP/FI 2 und vielenanderen Sprachen sind vermutlich mit den Notationen ’Variable++’ und ’Variable - -’ ver-traut. Dies sind Inkrement- und Dekrement-Operatoren. IN PHP/FI 2 hat das Statement’$a++’ keinen Wert (es ist kein Ausdruck) und daher kann man es nicht als Wert zuweisenoder in irgendeiner Weise benutzen. PHP erweitert die Eigenschaften von Dekrement undInkrement, indem es die beiden ebenfalls zu Ausdrücken macht. In PHP gibt es, wie inC, zwei Arten von Inkrementen - Prä-Inkrement und Post-Inkrement. Grundsätzlich er-höhen sowohl Prä- als auch Post-Inkrement den Wert der Variable, und der Effekt auf dieVariable ist derselbe. Der Unterschied ist der Wert des Inkrement-Ausdruckes. Das Prä-Inkrement, das ’++$Variable’ geschrieben wird, enthält als Wert den Wert der erhöhtenVariable (PHP erhöht den Wert der Variable, bevor es ihren Wert ausliest, daher der Na-me ’Prä-Inkrement’). Das Post-Inkrement, dass ’$Variable++’ geschrieben wird, enthältdagegen den ursprünglichen Wert der Variablen vor der Erhöhung (PHP erhöht den Wertder Variablen, nachdem es ihren Wert ausgelesen hat, daher der Name ’Post-Inkrement’).

Ein sehr gebräuchlicher Typ von Ausdrücken sind Vergleichsausdrücke. Diese Aus-drücke geben entweder 0 (=FALSCH) oder 1 (=WAHR) zurück. PHPunterstützt> (grö-ßer),>= (größer oder gleich),== (gleich),=== (Typ und Inhalt gleich), != (ungleich),< (kleiner) und<= (kleiner oder gleich). Diese Ausdrücke werden meistens in bedingtenAnweisungen, wie z.B. in if-Anweisungen, verwendet.

Im letzten Beispiel für Ausdrücke befassen wir uns mit kombinierten Zuweisungs-und Operator-Ausdrücken. Wir haben schon gezeigt, wie man den Wert von$a um 1 er-höht, nämlich indem man einfach ’$a++’ oder ’++$a’ schreibt. Aber was tut man, wennman den Wert um mehr als eins erhöhen will, z.B. um 3? Man könnte mehrer Male ’$a++’schreiben, aber das ist offensichtlich weder effizient nochsehr komfortabel. Viel Üblicherist es, einfach ’$a = $a + 3’ zu schreiben. ’$a + 3’ gibt den Wertvon $a plus 3 zurück,dieser wird wieder $a zugewiesen, was dazu führt, dass $a nunum 3 erhöht wurde. InPHP - wie in einigen anderen Programmiersprachen, z. B. in C -kann man dies aber nochkürzer schreiben, was mit der Zeit klarer wird und auch einfacher zu verstehen ist. Um 3zu dem aktuellen Wert hinzuzufügen, schreibt man ’$a += 3’. Das bedeutet exakt: “Nimmden Wert von $a, addiere 3 hinzu und weise $a den entstandenenWert zu“. Zusätzlichdazu, dass diese Schreibweise kürzer und klarer ist, resultiert sie auch in einer schnelle-ren Ausführung. Der Wert von ’$a += 3’ ist, wie der Wert einer regulären Zuweisung, der

Page 57: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

47

zugewiesene Wert. Es ist zu beachten, dass dieser Wert NICHT3, sondern dem kombi-nierten Wert von $a plus 3 entspricht (Das ist der Wert, der $azugewiesen wird). JederOperator, der zwei Elemente verbindet, kann in dieser Schreibweise verwendet werden,z. B. ’$a -= 5’ (vermindert den Wert von $a um 5) oder ’$a *= 7’ (multipliziert den Wertvon $a mit 7 und weist das Ergebnis $a zu), usw.

Es gibt einen weiteren Ausdruck, der Ihnen vielleicht seltsam vorkommt, wenn Sieihn bisher noch in keiner Programmiersprache kennengelernt haben, den dreifach kondi-tionalen Operator:

$eins ? $zwei : $drei

Wenn der Wert des ersten Sub-Ausdruckes (hier: $eins) wahr ist (d. h. nicht NULL),dann wird der Wert des zweiten Subausdrucks (hier: $zwei) zurückgeben und ist das Er-gebnis des konditionalen Ausdrucks. Andernfalls (d. h. wenn der erste Ausdruck falschist), wird der Wert des dritten Subausdruckes (hier: $drei)zurückgegeben.

Das folgende Beispiel sollte das Verständnis von Prä- und Post-Inkrement und vonAusdrücken im allgemeinen erleichtern:

function verdoppeln($i) {return $i*2;

}$b = $a = 5; /* Weise den Variablen $a und $b beiden den Wert 5 zu * /$c = $a++; /* Post-Inkrement, der urspruengliche Wert von $a (also 5)

wird $c zugewiesen. */$e = $d = ++$b; /* Prae-Inkrement, der erhoehte Wert von $b (= 6 ) wird

$d und $e zugewiesen. */

/* An diesem Punkt sind $d und $e beide gleich 6 */

$f = verdoppeln($d++); /* Weise $f den doppelten Wertvon $d vor der Erhoehung um eins zu, 2*6 = 12 */

$g = double(++$e); /* Weise $g den doppelten Wert von $e nachder Erhoehung zu, 2*7 = 14 to $g */

$h = $g += 10; /* Zuerst wie $g um 10 erhoeht und hat schliesslic h denWert 24. Der Wert dieser Zuweisung (24) wird dann$h zugewiesen, womit $h ebenfalls den Wert von 24hat. */

Am Anfang dieses Kapitels hatten wir gesagt, wir würden die verschiedenen Artenvon Anweisungen beschreiben und, wie versprochen, Ausdrücke können Anweisungensein. Trotzdem ist nicht jeder Ausdruck eine Anweisung. In diesem Fall hat eine Anwei-sung die Form ’Ausdr’ ’;’, d. h. ein Ausdruck gefolgt von einem Semikolon. In ’$b=$a=5;’ist $a=5 ein gültiger Ausdruck, aber für sich allein keine Anweisung. ’$b=$a=5;’ ist je-doch eine gültige Anweisung.

Ein letzter Punkt, der noch zu erwähnen ist, ist der ’wahr’-Wert von Ausdrücken. Invielen Fällen, hauptsächlich in bedingten Anweisungen undSchleifen, ist man nicht amspezifischen Wert eines Ausdrucks interessiert, sondern kümmert sich nur darum, ob erWAHR oder FALSCH bedeutet (PHP hat keinen speziellen boolean-Datentyp). Der Wahr-heitswert eines Ausdrucks in in PHP wird ähnlich bestimmt wie in Perl. Jeder numerischeWert, der nicht NULL ist, bedeutet WAHR, NULL bedeutet FALSCH. Es ist zu beachten,

Page 58: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

48 KAPITEL 7. AUSDRÜCKE

dass negative Werte nicht NULL sind und deshalb als WAHR aufgefasst werden! Eine lee-re Zeichenkette und die Zeichenkette “0“ sind FALSCH; alle anderen Zeichenketten sindWAHR. Nicht-skalare Datentypen (Arrays und Objekte) werden als FALSCH betrachtet,wenn sie keine Elemente enthalten, anderfalls geben sie WAHR zurück.

PHP stellt eine vollständige und mächtige Implementation von Ausdrücken bereit und,deren vollständige Dokumentation den Rahmen dieses Manuals sprengen würde. Die obi-gen Beispiele sollten Ihnen einen guten Eindruck darüber verschaffen, was Ausdrückesind und wie man nützliche Ausdrücke konstruieren kann. Im Rest dieses Manuals werdenwir ausdr schreiben, um auszudrücken, dass an dieser Stelle jeder gültige PHP-Ausdruckstehen kann.

Page 59: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 8

Operatoren

8.1 Arithmetische Operatoren

Erinnern Sie sich noch an die Grundrechenarten aus der Schule? Die arithmetischen Ope-ratoren funktionieren genauso:

Beispiel Name Ergebnis

$a + $b Addition Summe von $a und $b.$a - $b Subtraktion Differenz von $a und $b.$a * $b Multiplikation Produkt von $a und $b.$a / $b Division Quotient von $a und $b.$a % $b Modulus Rest von $a geteilt durch $b.

Tabelle 8.1: Arithmetische Operatoren

8.2 Zuweisungsoperatoren

Der einfachste Zuweisungsoperator ist “=“. Wahrscheinlich kommt man als erstes auf dieIdee, ihn mit “ist gleich“ zu bezeichnen. Das ist falsch. In Wirklichkeit bedeutet er, dassdem linken Operanden der Wert des rechten Operanden zugewiesen wird (man müssteihn also mit “wird gesetzt auf den Wert von“ übersetzen).

Der Wert eines Zuweisungs-Ausdruckes ist der zugewiesene Wert. D. h. der Wert desAusdruckes “$a = 3“ ist 3. Das erlaubt es, einige raffinierte Dinge zu tun:

$a = ($b = 4) + 5 // $a ist nun gleich 9// und $b wurde auf den Wert 4 gesetzt.

Zusätzlich zu dem oben genannten Zuweisungsoperator “=“ gibt es “kombinierte Ope-ratoren“ für alle binären, arithmetischen und String-Operatoren, die es erlauben, den Werteiner Variablen in einem Ausdruck zu benutzen, und dieser anschließend das Ergebnis desAusdrucks als neuen Wert zuzuweisen.

$a = 3;$a += 5; // setzt $a auf den Wert 8, als ob wir geschrieben

49

Page 60: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

50 KAPITEL 8. OPERATOREN

// haetten: $a = $a + 5;$b = "Hallo ";$b .= "Du!"; // setzt $b auf den Wert "Hallo Du!",

// aequivalent zu $b = $b . "Du!";

Man beachte, dass die Zuweisung nur den Wert der Ursprungsvariable der neuen Va-riable zuweist (assignment by value)(sie “kopiert“), weshalb sich Änderungen an dereinen Variablen nicht auf die andere auswirken werden. Das kann wichtig sein wennman einen großen Array o. ä. in einer Schleife kopieren muss.PHP 4 unterstützt ’assi-gnement by reference’ (Zuweisung als Verweis), mithilfe der $var = &$othervar;-Syntax,dies funktioniert jedoch nicht in PHP 3. ’Assignement by reference’ bedeutet, dass beideVariablen nach der Zuweisung die selben Daten repräsentieren. Nach der Zuweisung ver-ändert eine Änderung der Variable$var auch den Inhalt der Variable$othervar , nichtswird kopiert, stattdessen wird ein “Verweis“ auf die erste Variable angelegt.

8.3 Bit - Operatoren

Bit-Operatoren erlauben es, in einem Integer bestimmte Bits “ein- oder auszuschalten“(auf 0 oder 1 zu setzen).

Beispiel Name Ergebnis

$a & $b Und Die Bits sind in $a und in $b gesetzt.$a| $b Oder Die Bits sind entweder in $a oder in $b gesetzt.$a^ $b Entweder oder

(XOR)Die Bits sind in $a oder in $b gesetzt, aber nicht inbeiden.

~ $a Nicht Die Bits, die in $a nicht gesetzt sind, sind gesetzt, undumgekehrt.

$a<< $b Nach links ver-schieben

Verschiebung der Bits von $a um $b Stellen nach links(Jede Stelle entspricht einer Mulitplikation mit zwei.

$a>> $b Nach rechtsverschieben

Verschiebt die Bits von $a um $b Stellen nach rechts(jede Stelle entspricht einer Division durch zwei).

Tabelle 8.2: Bit-Operatoren

8.4 Vergleichs-Operatoren

Vergleichs-Operatoren erlauben es – wie der Name schon sagt– zwei Werte zu verglei-chen.

Ein weiter Vergleichs-Operator ist der “?:“- oder Trinitäts-Operator. Er arbeitet ge-nauso wie in C und vielen anderen Programmier-Sprachen.

(ausdr1) ? (ausdr2) : (ausdr3);

Dieser Ausdruck gibtausdr2 zurück, wennausdr1 “WAHR“ zurückgibt, undausdr3 ,wennausdr1 “FALSCH“ zurückgibt.

Page 61: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

8.5. FEHLER-KONTROLL-OPERATOREN 51

Beispiel Name Ergebnis

$a == $b Gleich Gibt “wahr“ zurück, wenn $a gleich $b ist.$a === $b Identisch Gibt “wahr“ zurück, wenn $a gleich $b ist und beide

vom gleichen Typ sind(funktioniert nur in PHP 4)$a != $b Ungleich Gibt “wahr“ zurück, wenn $a nicht gleich $b ist.$a< $b Kleiner Als Gibt “wahr“ zurück, wenn $a kleiner als $b ist.$a> $b Größer Als Gibt “wahr“ zurück, wenn $a größer als $b ist.$a<= $b Kleiner Gleich Gibt “wahr“ zurück, wenn $a kleiner oder gleich $b

ist.$a>= $b Größer Gleich Gibt “wahr“ zurück, wenn $a größer oder gleich $b

ist.

Tabelle 8.3: Vergleichs-Operatoren

8.5 Fehler-Kontroll-Operatoren

PHP unterstützt einen Operator zur Fehlerkontrolle: Das @-Symbol. Stellt man das @ inPHP vor einen Ausdruck werden alle Fehlermeldungen, die vondiesem Ausdruck erzeugtwerden könnten, ignoriert.

Ist das track_errors-Feature aktiviert, werden alle Fehlermeldungen, die von diesemAusdruck erzeugt werden, in der globalen Variablen$php_errormsg gespeichert. Da die-se Variable mit jedem neuen Auftreten eines Fehlers Überschrieben wird, sollte man siemöglichst bald nach Verwendung des Ausdrucks überprüfen, wenn man mit ihr arbeitenwill.

<?php

/* Beabsichtigter SQL-Fehler (zusaetzliches Anfuehrungs zeichen): */$res = @mysql_query( "select name, code from ’namelist" ) or

die( "SQL-Anfrage fehlgeschlagen: Fehlermeldung: ’$php_ errormsg’" );

?>

Siehe auch error_reporting().

8.6 Operatoren zur Programmausführung

PHP unterstützt einen Operator zur Ausführung externer Programme: Die sog. Backticks(’ ’).Achtung: Die Backticks sind keine einfachen Anführungszeichen, sondern entsprechenauf den meisten Tastaturen den Tasten für die frz. Accents. PHP versucht, den Text zwi-schen den Backticks als Kommandozeilen-Befehl auszuführen. Zurückgegeben wird dieAusgabe des aufgegebenen Programms (d. h. die Ausgabe wird nicht einfach gelöscht,sondern kann einer Variablen zugewiesen werden).

$output = ‘ls -al‘;echo "<pre>$output</pre>";

Siehe auchsystem() , passthru() , exec() , popen() undescapeshellcmd() .

Page 62: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

52 KAPITEL 8. OPERATOREN

8.7 Inkrementierungs- bzw. Dekrementierungsoperatoren

PHP unterstützt Prä- und Post-Inkrementierungs- und Dekrementierungsoperatoren imStil der Programmiersprache C.

Beispiel Name Ergebnis

++$a Prä-Inkrement Erhöht den Wert von $a um eins (inkrementiert $a), undgibt anschließend den neuen Wert von $a zurück.

$a++ Post-Inkrement Gibt zuerst den aktuellen Wert von $a zurück und er-höht dann den Wert von $a um eins.

−−$a Prä-Dekrement Vermindert den Wert von $a um eins (dekrementiert$a), und gibt anschließend den neuen Wert von $a zu-rück.

$a−− Post-Dekrement Gibt zuerst den aktuellen Wert von $a zurück und er-niedrigt dann den Wert von $a um eins.

Tabelle 8.4: Inkrement- und Dekrementoperatoren

Ein einfaches Beispiel-Skript:

<?phpecho "<h3>Post-Inkrement</h3>";$a = 5;echo "Sollte 5 sein: " . $a++ . "<br>\n";echo "Sollte 6 sein: " . $a . "<br>\n";

echo "<h3>Prae-Inkrement</h3>";$a = 5;echo "Sollte 6 sein: " . ++$a . "<br>\n";echo "Sollte 6 sein: " . $a . "<br>\n";

echo "<h3>Post-Dekrement</h3>";$a = 5;echo "Sollte 5 sein: " . $a-- . "<br>\n";echo "Sollte 4 sein: " . $a . "<br>\n";

echo "<h3>Predecrement</h3>";$a = 5;echo "Sollte 4 sein: " . --$a . "<br>\n";echo "Sollte 4 sein: " . $a . "<br>\n";

?>

8.8 Logische Operatoren

Der Grund dafür, dass es je zwei unterschiedliche Operatoren für die “Und“ - und die“Oder“ - Verknüpfung gibt ist, dass die beiden Operatoren jeweils einen unterschiedlichenPlatz in der Operator-Rangfolge haben. (siehe auch Operator - Rangfolge.)

Page 63: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

8.9. OPERATOR-RANGFOLGE 53

Beispiel Name Ergebnis

$a AND $b Und Wahr wenn sowohl $a als auch $b wahr ist.$a OR $b Oder Wahr wenn $a oder $b wahr ist.$a XOR $b Entweder Oder Wahr wenn entweder $a oder $b wahr ist, aber nicht

beide.! $a Nicht Wahr wenn $a nicht wahr ist.$a && $b Und Wahr wenn sowohl $a als auch $b wahr ist.$a|| $b Oder Wahr wenn $a oder $b wahr ist.

Tabelle 8.5: Logische Operatoren

8.9 Operator-Rangfolge

Die Operator-Rangfolge legt fest, wie “eng“ ein Operator zwei Ausdrücke miteinanderverbindet. Das Ergebnis des Ausdruckes 1 + 5 * 3 ist z. B. 16 undnicht 18, da derMulitiplikations-Operator (*) in der Rangfolge höher steht als der Additions-Operator(+).

Die folgende Tabelle zeigt die Rangfolge der Operatoren, oben steht der Operator mitdem niedrigsten Rang.

Assoziation Operator

links ,links ORlinks XORlinks ANDrechts printlinks ’=’ ’+=’ ’-=’ ’*=’ ’/=’ ’.=’ ’%=’ ’&=’ ’ | =’ ’ ^=’ ’ ~=’

’<<=’ ’ >>=’links ? :links ||links &&links |links ^links &keine Richtung ’==’ ’!=’ ’===’keine Richtung ’<’ ’ <=’ ’ >’ ’ >=’links ’<<’ ’ >>’links + - .links * / %rechts ! ˜ ++ −− (int) (double) (string) (array) (object) @rechts [keine Richtung new

Tabelle 8.6: Operator-Rangfolge

Page 64: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

54 KAPITEL 8. OPERATOREN

8.10 Zeichenketten-Operatoren

Es gibt in PHP zwei Operatoren für Zeichenketten. Der erste ist Vereinigungs-Operator(’.’), dessen Rückgabewert eine Zeichenkette, zusammengesetzt aus dem rechten und demlinken Argument, ist. Der zweite ist der Vereinigungs - Zuweisungsoperator (’.=’). SieheZuweisungs-Operatoren für weitere Informationen.

$a = "Hallo ";$b = $a . "Welt!"; // $b enthaelt jetzt den Text "Hallo Welt!"

$a = "Hallo ";$a .= "Welt!"; // $a enthaelt jetzt den Text "Hallo Welt!"

Page 65: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 9

Kontroll-Strukturen

Jedes PHP-Skript besteht aus einer Reihe von Anweisungen. Eine Anweisung kann auseinem Funktions-Aufruf, einer Schleife, einer bedingten Anweisung oder einem Befehl,der nichts macht (eine leere Anweisung), bestehen. Jeder Befehl endet gewöhnlich miteinem Semikolon. Darüber hinaus können Befehle zu einer Anweisungsgruppe zusam-mengefasst werden, welche durch geschweifte Klammern begrenzt wird. Eine Anwei-sungsgruppe ist auch eine Anweisung. Die unterschiedlichen Arten von Anweisungenwerden in diesem Abschnitt erläutert.

9.1 if

Der if -Befehl ist eine der wichtigsten Möglichkeiten vieler Programmiersprachen, umden Programmfluß zu kontrollieren, PHP eingeschlossen. Er erlaubt die bedingte Ausfüh-rung von Programmteilen. PHP beinhaltet eineif -Struktur, die ähnlich der C-Programmierspracheist:

if (ausdr)Anweisung

Wie im Abschnitt über Expressions / Ausdrücke beschrieben,wird ausdr auf seinenwirklichen Wertinhalt ausgewertet. Wennausdr TRUE entspricht, wird PHPAnweisungausführen, falls nicht - sie also FALSE ist - wirdAnweisung übergangen.

Das folgende Beispiel wird “a ist grösser als b“ anzeigen, wenn $a grösser ist als $b:

if ($a > $b)print "a ist groesser als b";

Oft werden Sie die bedingte Ausführung von mehr als einer Anweisung wollen. Selbst-verständlich ist es nicht erforderlich, jede Anweisung miteiner if -Bedingung zu verse-hen. Statt dessen können Sie mehrere Anweisungen in Gruppenzusammenfassen. Z.B.wird der folgende Programm-Code “a ist grösser als b“ anzeigen, wenn$a grösser ist als$b. Danach wird der Wert von$a in $b gespeichert:

if ($a > $b) {print "a ist groesser als b";$b = $a;

}

55

Page 66: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

56 KAPITEL 9. KONTROLL-STRUKTUREN

if -Anweisungen können ohne Einschränkung innerhalb andererif -Anweisungen de-finiert werden. Das ermöglicht ihnen völlige Flexibilität bei der bedingten Ausführungverschiedenster Programmteile.

9.2 else

Häufig ist es erforderlich, eine Anweisung auszuführen, wenn eine bestimmte Bedingungerfüllt ist und eine andere Anweisung, falls sie nicht erfüllt ist. Dafür gibt eselse . elseerweitert eineif -Anweisung um die Ausführung von Anweisungen, sobald der Ausdruckderif -Anweisung als FALSE angesehen wird. Der folgende Code wirdz.B. “a ist grösserals b“ anzeigen, wenn$a grösser ist als$b, anderenfalls “a ist NICHT grösser als b“:

if ($a > $b) {print "a ist groesser als b";

} else {print "a ist NICHT groesser als b";

}

Die else -Anweisung wird nur ausgeführt, wenn der if-Ausdruck als FALSE ausge-wertet wurde und wenn bei vorhandenenelseif -Ausdrücken diese ebenfalls FALSE sind(sieheelseif ).

9.3 elseif

elseif ist, wie der Name schon sagt, eine Verbindung vonif und else.Wieelse erwei-tert sie eineif -Anweisung um die Ausführung anderer Anweisungen, sobald die normaleif -Bedingung als FALSE angesehen wird. Anders als beielse wird die Ausführung die-ser anderen Anweisungen nur durchgeführt, wenn die beielseif angegebene alternativeBedingung als TRUE angesehen wird. Der folgende Code wird z.B. “a ist grösser als b“,“a ist gleich b“ oder “a ist kleiner als b“ ausgeben:

if ($a > $b) {print "a ist groesser als b";

} elseif ($a == $b) {print "a ist gleich b";

} else {print "a ist kleiner als b";

}

Es kann mehrereelseif -Anweisungen innerhalb einerif -Anweisung geben. Die ers-teelseif -Bedingung (falls vorhanden), die TRUE ist, wird ausgeführt. In PHP kann manauch ’else if ’ schreiben (zwei Wörter). Das Verhalten ist identisch zu ’elseif ’ (einWort), genau wie in C.

Die elseif -Anweisung wird nur ausgeführt, wenn die vorausgehendeif -Bedingungsowie jede vorherigeelseif -Bedingung FALSE ist und die aktuelleelseif -BedingungTRUE ist.

Page 67: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

9.4. ALTERNATIVE SYNTAX FÜR KONTROLL-STRUKTUREN 57

9.4 Alternative Syntax für Kontroll-Strukturen

PHP bietet eine alternative Syntax für einige seiner Kontroll-Strukturen, als da sindif ,while , for , foreach undswitch . Dabei muss immer die öffnende Klammer durch einenDoppelpunkt “:“; und die schließende Klammer durch einendif; , endwhile; , endfor; ,endforeach; bzw.endswitch; ersetzt werden.

<?php if ($a == 5): ?>A ist gleich 5<?php endif; ?>

Im obigen Beispiel ist der HTML-Bereich eingebettet in eineif -Anweisung mit al-ternativer Syntax. Der HTML-Bereich wird nur ausgegeben, wenn$a gleich 5 ist.

Die alternative Syntax kann auch aufelse undelseif angewendet werden. Es folgteineif -Struktur mitelseif undelse im alternativen Format:

<?phpif ($a == 5):

print "a ist gleich 5";print "...";

elseif ($a == 6):print "a ist gleich 6";print "!!!";

else:print "a ist weder 5 noch 6";

endif;?>

Siehe auchwhile , for und if für weitere Beispiele.

9.5 whilewhile -Schleifen sind die einfachste Form von Schleifen in PHP. Sie funktionieren genauwie in C. Die Grundform einerwhile -Anweisung lautet:

while (expr) Anweisung

Die Bedeutung einerwhile -Anweisung ist einfach. Sie weist PHP an, einen in ihreingebetteten Befehl so lange zu wiederholen, bis diewhile -Bedingung TRUE gewor-den ist. Der Wert der Bedingung wird immer am Anfang der Schleife geprüft. Wird derWert während der Ausführung der Befehle innerhalb derwhile -Schleife geändert, endetdie Ausführung dieses Befehls-Blocks nicht vor einem neuemSchleifen-Durchlauf (Ite-ration). Jeder Schleifendurchlauf ist eine Iteration. Falls diewhile -Bedingung bereits zuBeginn FALSE ist, werden die Anweisungen derwhile -Schleife nicht ein einziges Maldurchlaufen.

Wie bei derif -Anweisung kann man mehrere Befehle innerhalb einer Schleife ange-ben, indem man sie mit geschweiften Klammern umschliesst oder die alternative Syntaxgebraucht:

while (expr): statement ... endwhile;

Page 68: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

58 KAPITEL 9. KONTROLL-STRUKTUREN

Die folgenden Beispiele sind identisch; beide geben Zahlenvon 1 bis 10 aus:

/* Beispiel 1 */

$i = 1;while ($i <= 10) {

print $i++; /* es wird erst $i ausgegeben,bevor der Wert erhoeht wird(Post-Inkrement) */

}

/* Beispiel 2 */

$i = 1;while ($i <= 10):

print $i;$i++;

endwhile;

9.6 do..while

do..while - Schleifen sind denwhile - Schleifen sehr ähnlich, ausser dass die Erfüllungdes Ausdrucks am Ende jedes Durchlaufs geprüft wird (statt am Anfang). Der Hauptun-terschied zu gewöhnlichenwhile - Schleifen ist, dass der erste Schleifen-Durchlauf beido..while in jedem Fall statt findet, wogegen es beiwhile -Schleifen durchaus passierenkann, dass die Schleife nie durchlaufen wird, wenn die am Anfang zu prüfende Bedingungschon zu Beginn FALSE ist. Es gibt nur eine Syntax fürdo..while -Schleifen:

<?php$i = 0;do {

print $i;} while ($i>0);?>

Die obige Schleife wird genau einmal durchlaufen, da nach der ersten Wiederholungdie Erfüllung der Bedingung geprüft wird. Da diese aber nicht erfüllt, also FALSE ist ($iist nicht grösser als 0), wird die Schleifenausführung beendet.

Erfahrene C-Anwender kennen auch die Möglichkeit, Programmblöcke mitdo..while(0)einzuschliessen und dann diebreak Anweisung zu benutzen. Der folgende Programm-Ausschnitt zeigt dies:

<?phpdo {

if ($i < 5) {print "i ist nicht gross genug";break;

}$i *= $factor;if ($i < $minimum_limit) {

break;

Page 69: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

9.7. FOR 59

}print "i ist ok";

...process i...

} while(0);?>

Es ist nicht weiter tragisch, wenn Sie dieses Beispiel nichtoder nur zum Teil verste-hen. Sie können auch ohne dieses Feature effektive PHP-Programme und Skripte schrei-ben.

9.7 for

for -Schleifen sind die komplexesten Schleifen in PHP. Sie funktionieren wie ihr Gegen-stück in C. Die Syntax einerfor -Schleife sieht so aus:

for (ausdr1; ausdr2; ausdr3) Anweisung

Der erste Parameterausdr1 wird beim Schleifenbeginn geprüft bzw. ausgeführt (ohnejegliche Vorbedingung).

Zu Beginn jedes Durchlaufs wird nunausdr2 geprüft. Wenn dieser TRUE ist, führtdie Schleife weiter fort mit der Ausführung der nachfolgenden Befehle. Wenn das Ergeb-nis FALSE lautet, wird die Schleife beendet.

Am Ende jedes Durchlaufs wird nun auch nochausdr3 geprüft / ausgeführt.Jeder der Parameter kann leer sein (optional). Istausdr2 leer, wird die Schleife unbe-

stimmt 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 bedingtebreak- Anweisung statt durch eine unwahr werdendefor -Bedingung beenden möchte.

Beachten Sie die folgenden Beispiele. Alle geben Zahlen von1 bis 10 aus:

<?php/* Beispiel 1 */for ($i = 1; $i <= 10; $i++) {

print $i;}

/* Beispiel 2 */

for ($i = 1;;$i++) {if ($i > 10) {

break;}print $i;

}

/* Beispiel 3 */

$i = 1;for (;;) {

Page 70: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

60 KAPITEL 9. KONTROLL-STRUKTUREN

if ($i > 10) {break;

}print $i;$i++;

}

/* Beispiel 4 */

for ($i = 1; $i <= 10; print $i, $i++) ;?>

Selbstverständlich sieht das erste (oder das vierte) Beispiel am besten aus, aber Siewerden noch feststellen, dass es oftmals ganz nützlich seinkann, leere Parameter infor -Schleifen zu verwenden.

PHP unterstützt auch bei for-Schleifen die alternative “Doppelpunkt-Syntax“.

for (ausdr1; ausdr2; ausdr3): Anweisung; ...; endfor;

Andere Programmiersprachen haben für das Durchlaufen eines Hashs oder Arrayseineforeach - Anweisung. PHP 3 hat dies nicht; im Gegensatz zu PHP 4 (vgl.foreach ).In PHP 3 kann man dafür eine Kombination vonwhile mit der list() - undeach() -Funktion einsetzen. Beispiele finden Sie in der Dokumentation zu diesen Funktionen.

9.8 foreach

PHP 4 (nicht PHP 3) enthält eineforeach() -Funktion, genau wie Perl und andere Spra-chen. Diese ermöglicht es, auf einfache Weise ein Array zu durchlaufen. Es gibt zweiSyntax-Formen; die zweite ist eine unbedeutende aber sinnvolle Erweiterung der erstenSyntax:

foreach(array_expression as $value) Anweisungforeach(array_expression as $key => $value) Anweisung

Die erste Form durchläuft dasarray_expression -Array. Bei jedem Durchgang wirdder Wert des aktuellen Elements$value zugewiesen und der interne Array-Zeiger um 1erhöht. Dadurch wird beim nächsten Durchgang automatisch das nächste Element ausge-wertet.

Die zweite Form arbeitet genauso, ausser dass bei jedem Durchlauf auch der aktuelleSchlüssel der Variablen$key zugewiesen wird.

Anmerkung: Sobaldforeach() zum ersten Mal ausgeführt wird, wird der interneArray-Pointer automatisch auf das erste Element des Arrayszurück gesetzt. Das heisst,dass Sie nichtreset() vor einem Durchlauf vonforeach() aufrufen müssen.

Anmerkung: Beachten Sie auch, dassforeach() mit einer Kopie des angegebenenArrays arbeitet. Deshalb wird auch der Array-Pointer nichtwie bei demeach -Konstruktverändert.

Beachten Sie, dass die folgenden Beispiele in ihrer Funktionalität identisch sind:

Page 71: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

9.8. FOREACH 61

<?phpreset ($arr);while (list(, $value) = each ($arr)) {

echo "Wert: $value<br>\n";}

foreach ($arr as $value) {echo "Wert: $value<br>\n";

}?>

Auch hier funktioniert alles gleich:

<?phpreset ($arr);while (list($key, $value) = each ($arr)) {

echo "Schluessel: $key; Wert: $value<br>\n";}

foreach ($arr as $key => $value) {echo "Schluessel: $key; Wert: $value<br>\n";

}?>

Noch einige Beispiele, die die Anwendung verdeutlichen:

<?php/* foreach Beispiel 1: Nur der Wert */

$a = array(1, 2, 3, 17);

foreach ($a as $v) {print "Aktueller Wert von \$a: $v.\n";

}

/* foreach Beispiel 2: Wert (mit Ausgabe des Array-Schluess els) */

$a = array(1, 2, 3, 17);

$i = 0; /* nur fuer Anschauungs-Zweck */

foreach($a as $v) {print "\$a[$i] => $k.\n";

}

/* foreach Beispiel 3: Schluessel und Wert */

$a = array("eins" => 1,"zwei" => 2,"drei" => 3,"siebzehn" => 17

);

foreach($a as $k => $v) {

Page 72: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

62 KAPITEL 9. KONTROLL-STRUKTUREN

print "\$a[$k] => $v.\n";}?>

9.9 break

break bricht die Ausführung der aktuellenfor , while oderswitch Anweisungs-Sequenzab.

Einem break kann optional ein numerisches Argument angehängt werden, das dieAnzahl der abzubrechenden Befehls-Sequenzen enthält.

<?php$arr = array(’eins’, ’zwei’, ’drei’, ’stop’, ’vier’);while (list ( , $val) = each ($arr)) {

if ($val == ’stop’) {break; /* Man kann hier auch ’break 1;’ schreiben. */

}echo "$val<br>\n";

/* Benutzung des optionalen Argumentes. */$i = 0;

while (++$i) {switch ($i) {

case 5:echo "Bei 5<br>\n";break 1; /* Beendet nur switch. */

case 10:echo "Bei 10; quitting<br>\n";break 2; /* Beendet switch und while. */

default:break;

}}?>

9.10 continue

continue wird innerhalb von Schleifen gebraucht. Die Schleife wird an der aktuellenStelle abgebrochen und es wird der nächste Durchlauf begonnen.

continue kann optional ein nummerisches Argument erhalten, das die Anzahl der zuüberspringenden Schleifendurchläufe beinhaltet.

<?phpwhile (list ($key, $value) = each ($arr)) {

if ($key % 2) { // Ueberspringe ungerade Wertecontinue;

}tue_was_mit_ungerade ($value);

}

Page 73: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

9.11. SWITCH 63

$i = 0;while ($i++ < 5) {

echo "Aussen<br>\n";while (1) {

echo " Mitte<br>\n";while (1) {

echo " Innen<br>\n";continue 3;

}echo "Das wird nie ausgegeben.<br>\n";

}echo "Dies auch nicht.<br>\n";

}?>

9.11 switch

Die switch -Anweisung ist gleichbedeutend einer Reihe vonif -Anweisungen mit demgleichen Parameter. Häufig wollen Sie ein und die selbe Variable (bzw. den selben Aus-druck) mit verschiedensten Werten vergleichen und in Abhängigkeit vom Auswertungser-gebnis verschiedene Programmteile ausführen. Genau das ermöglicht dieswitch -Anweisung.

Die folgenden zwei Beispiele zeigen zwei verschiedene Wege, das gleiche zu bewir-ken; eins gebraucht mehrereif -Befehle, das andere eineswitch -Anweisung:

<?phpif ($i == 0) {

print "i ist gleich 0";}if ($i == 1) {

print "i ist gleich 1";}if ($i == 2) {

print "i ist gleich 2";}

switch ($i) {case 0:

print "i ist gleich 0";break;

case 1:print "i ist gleich 1";break;

case 2:print "i ist gleich 2";break;

}?>

Es ist wichtig, die Ausführung einerswitch -Anweisung zu verstehen, um Fehler zuvermeiden. Die switch-Anweisung wird Zeile für Zeile (alsoAnweisung für Anweisung)

Page 74: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

64 KAPITEL 9. KONTROLL-STRUKTUREN

abgearbeitet. Zu Beginn wird nichts ausgeführt. Erst wenn bei einemcase -Teil eine Ent-sprechung zumswitch -Ausdruck vorliegt, werden die darin enthaltenen Befehle ausge-führt. PHP fährt dann mit der Abarbeitung des restlichen Codes innerhalb desswitch -Blocks fort (oder bis zum ersten Auftreten einerbreak -Anweisung). Ohnebreak amEnde einescase -Teils werden also noch die folgendencase -Blöcke ausgeführt. Z.B.:

<?phpswitch ($i) {

case 0:print "i ist gleich 0";

case 1:print "i ist gleich 1";

case 2:print "i ist gleich 2";

}?>

Wenn hier$i gleich 0 ist, würde PHP alle print-Anweisungen ausführen. Ist$i gleich1, würden die letzten beiden print-Befehle ausgeführt und wenn$i gleich 2 ist, würdenur der letzte print-Befehl ausgeführt. Deshalb ist es wichtig, bei der ersten gefundenenÜbereinstimmung einebreak -Anweisung zu setzen (abgesehen von bestimmten Fällen,wo genau dieses Verhalten gefordert wird).

Bei einerswitch -Anweisung wird die Bedingung also nur einmal überprüft unddasErgebnis mit jedercase -Anweisung verglichen. Bei einemelseif -Befehl wird die Be-dingung neu geprüft. Eineswitch -Anweisung kann schneller als mehrereif -Befehlesein, z.B. bei komplizierteren Bedingungen als einem einfachen Vergleich.

Der Anweisungsteil voncase kann auch leer sein. Dann wird die Kontrolle einfachan den nächstencase -Teil übergeben.

<?phpswitch ($i) {

case 0:case 1:case 2:

print "i ist kleiner als 3 aber nicht negativ";break;

case 3:print "i ist gleich 3";

}?>

Ein Spezialfall ist die Anweisungdefault . Diese trifft auf alles zu, was nicht von denvoranstehendencase -Ausdrücken erfasst wurde, wie z.B.:

<?phpswitch ($i) {

case 0:print "i ist gleich 0";break;

case 1:print "i ist gleich 1";

Page 75: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

9.12. REQUIRE() 65

break;case 2:

print "i ist gleich 2";break;

default:print "i ist weder 0, 1 noch 2";

}?>

Der case -Ausdruck kann eine Prüfung einfacher Typen sein, also von Integer- oderFließkomma-Zahlen oder von Strings / Zeichenketten. Arrays oder Objekte können nichtbenutzt werden, es sei denn, sie werden auf einfache Typen herunter gebrochen.

Die alternative Syntax gilt auch fürswitch -Sequenzen. Mehr Informationen dazuunter Alternative Syntax für Kontroll-Strukturen.

9.12 require()

Der require() -Befehl setzt an seine Stelle den Inhalt der angegebenen Datei (ähnlichdem#include von C).

Wenn die PHP-Konfigurations-Option “URL fopen wrappers“ auf enabled (per default)steht, können Sie für die mittelsrequire() eingebundene Datei statt einer lokalen Pfa-dangabe auch eine URL angeben. Sehen Sie hierzu unter Remote-Dateien undfopen()für weitere Informationen nach.

Wichtig: PHP kehrt zu Beginn der perinclude() oder require() eingebundenenDateien vom PHP- in den HTML-Modus und am Schluss der Datei wieder vom HTML- inden PHP-Modus zurück. Falls innerhalb dieser Dateien also PHP-Code ausgeführt werdensoll, muss dieser eingeschlossen werden von gültigen PHP-Start- und PHP-Ende-Marken(siehe gültige PHP-Start- und Ende-Tags).

require() ist keine PHP-Anweisung, sondern eine spezielle Sprachanweisung. Sieist anderen Regeln unterworfen als Funktionen. Einerseitsunterliegt sie keinen Kontroll-strukturen, andererseits gibt sie keinen Wert zurück. Der Versuch, von einemrequire() -Aufruf einen Rückgabewert zu erhalten, führt zu einem Parse-Fehler.

Anders alsinclude() wird require() immer die angegebene Datei einlesen, auchdann, wenn die Programmzeile, in der sie steht, nicht ausgeführt wird. Wenn Sie eineDatei nur bedingt einlesen wollen, benutzen Sieinclude() . Die bedingte Anweisungwürderequire() nicht davon abhalten, die Datei zu laden.

Innerhalb von Schleifen tritt der Effekt auf, dass, obwohl die denrequire() -Befehlenthaltende Zeile mehrfach angesprungen wird, die entsprechende Datei trotzdem nurgenau einmal eingelesen (ausgefürt) wird.

Sie können alsorequire() nicht innerhalb von Programm-Schleifen einsetzen. Des-halb, und wenn Sie verschiedene Dateien einlesen wollen, müssen Sie in Schleifen denBefehl include() benutzen.

require (’header.inc’);

Wird eine Datei perrequire() eingebunden, dann “erbt“ der darin enthaltene Codedie bis zur Skriptzeile mit derrequire() -Anweisung definierten Variablen und deren In-halt. Alle innerhalb der eingebundenen Datei Definitionen von Variablen stehen ab dieser

Page 76: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

66 KAPITEL 9. KONTROLL-STRUKTUREN

Zeile zur Verfügung. Steht dierequire() -Anweisung innerhalb einer Funktion, wird derdarin stehende Code behandelt, als ob er innerhalb der Funktion stehen würde.

Wird die mittelsrequire() einzubindende Datei über HTTP (fopen wrapper) aufge-rufen und sieht der Ziel-Server die Ziel-Datei als PHP-Code, dann werden die Variablenan die einzubindende Datei wie bei einem HTTP GET übergeben.Das entspricht nichtgenau der Einbindung einer lokalen Datei, da das Skript auf dem entfernten Server aus-geführt wird und nur die Ergebnisse in das lokale Skript eingebunden werden.

<?php/* Dieses Beispiel geht davon aus, dass ein beliebiger Serve r zum

* Parsen von *.php-Dateien konfiguriert ist. Also meint ’fu nkt’ hier,* dass die Variablen $vareins und $varzwei innerhalb der ang eforderten* Datei vorhanden sind. */

/* Funkt. nicht; file.txt wird vom besagten Server nicht gep arst. */require ("http://someserver/file.txt?vareins=1&varzw ei=2");

/* Funkt. nicht; schaut nach einer lokalen Datei namens/* ’file.php?varone=1&vartwo=2’ */require ("file.php?vareins=1&varzwei=2");

/* Funkt. */require ("http://someserver/file.php?vareins=1&varzw ei=2");

$vareins = 1;$varzwei = 2;require ("file.txt"); /* Funkt. */require ("file.php"); /* Funkt. */?>

In PHP 3 ist es möglich, einereturn -Anweisung innerhalb einer perrequire()eingebundenen Datei auszuführen, solange diese Anweisungim Hauptteil dieser Dateisteht. Diereturn -Anweisung darf nicht in Blöcken (also innerhalb von geschwungenenKlammern “{}“ stehen. In PHP 4 existiert diese Möglichkeit nicht mehr. Wenn Sie diesedennoch benötigen, sehen Sie unterinclude() nach.

Siehe auchinclude() , require_once() , include_once() , readfile() undvirtual() .

9.13 include()

Die include() -Anweisung liest die angegebene Datei ein und wertet sie aus.Wenn die PHP-Konfigurations-Option “URL fopen wrappers“ auf enabled (per default)

steht, können Sie für die mittelsinclude() eingebundene Datei statt einer lokalen Pfa-dangabe auch eine URL angeben. Sehen Sie hierzu unter Remote-Dateien undfopen()für weitere Informationen nach.

Wichtig ist, dass beiminclude() - oderrequire() -Befehl vom PHP-Parsing-Modusin den HTML-Modus geschaltet wird und bei Rückkehr in das aufrufende Skript wiederzurück vom HTML- in den PHP-Modus. Deshalb muss jeder PHP-Code innerhalb dereingebundenen Dateien umschlossen werden von gültigen PHP-Start- und Ende-Tags.

Page 77: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

9.13. INCLUDE() 67

Das passiert jedes Mal, sobald dieinclude() -Anweisung auftritt. Deshalb könnenSie include() auch sehr gut innerhalb von Schleifen verwenden, um eine Anzahl unter-schiedlicher Dateien einzubinden.

<?php$files = array(’first.inc’, ’second.inc’, ’third.inc’);for ($i = 0; $i < count($files); $i++) {

include $files[$i];}?>

include() unterscheidet sich vonrequire() dadurch, dass dieinclude -Anweisungjedesmal neu ausgewertet wird, sobald sie auftritt (und nurzur Ausführungszeit). Dagegenwird die require() -Anweisung beim ersten Auftreten mit der angegebenen Dateiersetzt,egal ob sie einzubinden ist oder nicht (innerhalb von bedingten Anweisungen, z.B. beiifauch dann, wenn das ausgewertete Argument FALSE ergeben hat).

Da include() ein spezieller Sprach-Konstrukt ist, müssen Sie ihn innerhalb einerbedingten Anweisung in einen Anweisungsblock setzen.

<?php/* Das ist falsch und fuehrt nicht zum gewuenschten Ergebnis . */

if ($Bedingung)include($diesedatei);

elseinclude($anderedatei);

/* Diese ist korrekt. */

if ($Bedingung) {include($diesedatei);

} else {include($anderedatei);

}?>

Sowohl in PHP 3 als auch in PHP 4 ist es möglich, einereturn - Anweisung innerhalbeinerinclude() eten Datei anzugeben, um die Ausführung dieser Datei abzubrechen undzum aufrufenden-Skript zurück zu kehren. Es gibt aber ein paar Unterschiede in der Ar-beitsweise. Der erste ist, dass bei PHP 3 diereturn -Anweisung nicht innerhalb einesBlocks auftreten darf, es sei denn, es ist ein Funktions-Block. In diesem Fall giltreturnfür diese Funktion und nicht für die ganze Datei. In PHP 4 gibtes diese Beschränkungnicht. PHP 4 erlaubt Ihnen auch die Rückgabe von Werten beiinclude() eten Dateien.Sie können den Wert desinclude() -Aufrufs nutzen, als wenn Sie eine Funktion aufge-rufen hätten. Das wird in PHP 3 einen Parse-Error ergeben.Beachten Sie, dass die folgende Datei (genannt test.inc) imgleichen Verzeichnis wie dieHauptdatei stehen muss:

<?phpecho "Vor dem Return <br>\n";if (1) {

Page 78: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

68 KAPITEL 9. KONTROLL-STRUKTUREN

return 27;}echo "Nach dem Return <br>\n";?>

Die Datei main.html enthält folgendes:

<?php$retval = include (’test.inc’);echo "Datei gibt zurueck: ’$retval’<br>\n";?>

Sobald main.html in PHP 3 aufgerufen wird, wird ein Parse-Error in Zeile 2 angezeigt;Sie können in PHP 3 also keinen Rückgabewert voninclude() erhalten. In PHP 4 wirddas Ergebnis sein:

Vor dem ReturnDatei gibt zurueck: ’27’

Die Datei main.html soll nun folgendes enthalten:

<?phpinclude (’test.inc’);echo "Zurueck in main.html<br>\n";?>

In PHP 4 wird die Ausgabe sein:

Vor dem ReturnZurueck in main.html

PHP 3 wird dagegen folgendes ausgeben:

Vor dem Return27Zurueck in main.html

Parse error: parse error in /var/www/phptest/main.html on line 5

Der obige Parse-Error ist das Ergebnis der Tatsache, dass die return -Anweisung in-nerhalb eines Nicht-Funktions-Blocks von test.inc steht.Wenn dasreturn ausserhalbdiese Blocks zu stehen kommt, wird die Ausgabe wie folgt aussehen:

Before the return27Back in main.html

Die ’27’ entsteht aus der Tatsache, dass PHP 3 keine solchen Rückgabewerte unter-stützt.

Wird eine Datei perinclude() eingebunden, dann “erbt“ der darin enthaltene Codedie bis zur Skriptzeile mit derinclude() -Anweisung definierten Variablen und deren In-halt. Alle innerhalb der eingebundenen Datei Definitionen von Variablen stehen ab dieserZeile zur Verfügung. Steht dieinclude() -Anweisung innerhalb einer Funktion, wird derdarin stehende Code behandelt, als ob er innerhalb der Funktion stehen würde.

Page 79: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

9.14. REQUIRE_ONCE() 69

Wird die mittelsinclude() einzubindende Datei über HTTP (fopen wrapper) auf-gerufen und der Ziel-Server die Ziel-Datei als PHP-Code ansieht, dann werden die Va-riablen an die einzubindende Datei wie bei einem HTTP GET übergeben. Das entsprichtnicht genau der Einbindung einer lokalen Datei, da das Skript auf dem entfernten Serverausgeführt wird und nur die Ergebnisse in das lokale Skript eingebunden werden.

<?php/* Dieses Beispiel geht davon aus, dass ein beliebiger Serve r zum

* Parsen von *.php-Dateien konfiguriert ist. Also meint ’fu nkt’ hier,* dass die Variablen $vareins und $varzwei innerhalb der ang eforderten* Datei vorhanden sind. */

/* Funkt. nicht; file.txt wird vom besagten Server nicht gep arst. */include ("http://someserver/file.txt?vareins=1&varzw ei=2");

/* Funkt. nicht; schaut nach einer lokalen Datei namens/* ’file.php?vareins=1&varzwei=2’ */include ("file.php?vareins=1&varzwei=2");

/* Funkt. */include ("http://someserver/file.php?vareins=1&varzw ei=2");

$vareins = 1;$varzwei = 2;include ("file.txt"); /* Funkt. */include ("file.php"); /* Funkt. */?>

Lassen Sie sich nicht durch die Tatsache irritieren, dass Sie Dateien auch über HTTPper require oderinclude einbinden können (vgl. Remote files). Das oben Gesagte be-hält seine Gültigkeit.

Siehe auchrequire() , require_once() , include_once() , readfile() und it vir-tual().

9.14 require_once()

Die require_once() -Anweisung ersetzt sich selbst durch die angegebene Datei (ähnlichder C-Preprozessor-Anweisung#include ), funktioniert also ähnlich wie dierequire() -Anweisung. Der Hauptunterschied dazu liegt in der Tatsache, dass beirequire_once()der einzubindende Code genau einmal in das Skript eingefügtwird.

Sie erzeugen beispielsweise die folgenden zwei Include-Dateien utils.inc und foo-lib.inc:

<?phpdefine(PHPVERSION, floor(phpversion()));echo "GLOBALE SIND GUT\n";function guterTee() {

return "Oolong-Tee schmeckt gut!";}?>

Page 80: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

70 KAPITEL 9. KONTROLL-STRUKTUREN

Beispiel 2.42: foolib.inc

<?phprequire ("utils.inc");function zeigeVar($var) {

if (PHPVERSION == 4) {print_r($var);

} else {var_dump($var);

}}

// es folgen weitere Funktionen ...?>

Nun schreiben Sie ein Skript cause_error_require.php:

Beispiel 2.43: cause_error_require.php

<?phprequire("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);?>

Wenn Sie letzteres starten, wird folgende Ausgabe erzeugt (gilt für PHP 4.01pl2):

GLOBALE SIND GUTGLOBALE SIND GUTFatal error: Cannot redeclare causeerror() in utils.inc on line 5

Durch Umschreiben von foolib.inc und cause_error_require.php (Gebrauch vonrequire_once()stattrequire() ) und Umbenennung des letzten Skriptes zu require_once_io.php habenSie nun:

Beispiel 2.44: foolib.inc (fixed)

...require_once("utils.inc");function showVar($var) {...

Beispiel 2.45: require_once_io.php

...require_once("foolib.inc");require_once("utils.inc");$foo = array("1",array("complex","quaternion"));...

Page 81: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

9.15. INCLUDE_ONCE() 71

Beim nachfolgenden Aufruf wird folgende Ausgabe erzeugt (bei PHP 4.0.1pl2):

GLOBALE SIND GUTdies erfordert utils.inc, das auchin foolib.inc erforderlich istAufruf von guterTee: Oolong-Tee schmeckt gut!.Ausgabe foo:Array(

[0] => 1[1] => Array

([0] => complex[1] => quaternion

)

)

Beachten Sie, dass analog zum Verhalten von#include im C-Preprozessor dieseAnweisung zur Zeit der Skript-“Compilierung“ ausgewertetwird; sollten Sie also z.B.das Skript vor dessen Ausführung parsen und bei der Ausführung keinen Gebrauch ma-chen wollen von dynamisch einzuschließenden Teilen, sollten Sieinclude_once() oderinclude() verwenden.

Weiter Beispiele zurequire_once() und include_once() können Sie dem PEAR-Code entnehmen, welcher im aktuellsten PHP-Source-Code enthalten ist.

Siehe auch:require() , include() , include_once() , get_required_files() ,readfile() , get_included_files() , undvirtual() .

9.15 include_once()

Die Anweisunginclude_once() schließt zur Ausführungszeit das angegebene Skriptein und führt es aus. Dies ist ähnlich derinclude() -Anweisung; mit dem Unterschied,dass einmal “includierter“ Code nicht nochmals eingebunden wird.

Wie in der Beschreibung zurequire_once() bereits angemerkt, sollinclude_once()in den Fällen verwendet werden, wo dieselbe Datei mehr als einmal während der Ausfüh-rung eingebunden werden soll und Sie Wiederholungen bei denFunktions-Definitionenund Wertzuweisungen zu Variablen usw. vermeiden müssen.

Weitere Beispiele zurequire_once() undinclude_once() können Sie dem PEAR-Code entnehmen, welcher im aktuellsten PHP-Source-Code enthalten ist.

include_once() steht ab PHP 4.01pl2 zur Verfügung.Siehe auch:require() , include() , require_once() , get_required_files() ,

get_included_files() , readfile() undvirtual() .

Page 82: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 83: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 10

Funktionen

10.1 Vom Nutzer definierte Funktionen

Eine Funktion kann wie folgt definiert werden:

function foo ($arg_1, $arg_2, ..., $arg_n) {echo "Beispielfunktion.\n";return $retval;

}

Jeder beliebige korrekte PHP-Code kann in einer Funktion vorkommen, sogar andereFunktionen und Klassen- Definitionen.

In PHP 3 müssen Funktionen definiert sein, bevor man auf sie verweist. In PHP 4 istdas nicht mehr erforderlich.

10.2 Funktionsparameter

Mit einer Parameterliste kann man Informationen an eine Funktion übergeben. Die Para-meterliste ist eine kommagetrennte Liste von Variablen und/oder Konstanten.

PHP unterstützt die Weitergabe von Parametern als Werte (das ist der Standard), alsVerweise und als Vorgabewerte. Die Übergabe einer beliebigen Parameterzahl ist nichtmöglich, einen ähnlichen Effekt kann man aber durch die Übergabe von Arrays erreichen.

function rechne_array($eingabe) {echo "$eingabe[0] + $eingabe[1] = ", $eingabe[0]+$eingabe [1];

}

10.2.1 Verweise als Parameter übergeben

Normalerweise werden den Funktionen Werte als Parameter übermittelt. Wenn man denWert dieses Parameters innerhalb der Funktion ändert, bleibt der Parameter ausserhalbder Funktion unverändert. Wollen Sie aber genau das erreichen, dann müssen Sie dieParameter als Verweise übergeben.

Wenn eine Funktion einen Parameter generell als Verweis behandeln soll, setzt manein kaufmännisches Und (&) in der Funktionsdefinition vor den Parameternamen:

73

Page 84: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

74 KAPITEL 10. FUNKTIONEN

<?phpfunction fuege_etwas_anderes_an (&$string) {

$string .= ’und nun zu etwas voellig anderem.’;}$str = ’Dies ist ein String, ’;fuege_etwas_anderes_an ($str);echo $str; // Ausgabe ’Dies ist ein String, und nun zu etwas vo ellig anderem.’?>

Wenn Sie eine Variable andererseits als Verweis an eine Funktion übergeben wollen,die dies nicht tut, können Sie das kaufmännische Und (&) auchbeim Aufruf der Funktionverwenden:

<?phpfunction bla ($fasel) {

$fasel .= ’ und nun zu etwas voellig anderem.’;}$str = ’Dies ist ein String, , ’;bla ($str);echo $str; // outputs ’Dies ist ein String, ’bla (&$str);echo $str; // outputs ’Dies ist ein String, und nun zu etwas vo ellig anderem.’?>

10.2.2 Vorgabewerte für Parameter

Eine Funktion kann C++-artige Vorgabewerte für skalare Parameter wie folgt definieren:

<?phpfunction machkaffee ($typ = "Cappucino") {

return "Ich mache eine Tasse $typ.\n";}echo machkaffee ();echo machkaffee ("Espresso");?>

Die Ausgabe von diesem kleinen Skript ist: Ich mache eine Tasse Cappucino. Ichmache eine Tasse Espresso.

Der Vorgabewert muß eine Konstante sein, darf also (zum Beispiel) keine Variableoder Element einer Klasse sein.

Bitte beachten Sie, dass alle Vorgabewerte rechts von den Nicht-Vorgabeparameternstehen sollten; - sonst wird es nicht funktionieren. Betrachten Sie folgendes Beispiel:

<?phpfunction mach_joghurt ($typ = "rechtsdrehenden", $geschm ack) {

return "Mache einen Becher $typ $geschmack-joghurt.\n";}

echo mach_joghurt ("Brombeer"); // arbeitet nicht wie erwa rtet?>

Die Ausgabe dieses Beispiels ist:

Page 85: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

10.3. RÜCKGABEWERTE 75

Warning: Missing argument 2 in call to makeyogurt() in/usr/local/etc/httpd/htdocs/php3test/functest.html o n line 41Mache einen Becher Brombeer-joghurt.

Nun vergleichen Sie bitte oberes Beispiel mit folgendem:

<?phpfunction mach_joghurt ($geschmack, $typ = "rechtsdrehend en") {

return "Mache einen Becher $typ $geschmack-joghurt.\n";}

echo mach_jogurt ("Brombeer"); // arbeitet wie erwartet.?>

... und jetzt ist die Ausgabe:

Mache einen Becher rechtsdrehenden Brombeer-Joghurt.

10.3 Rückgabewerte

Sie können Werte mit dem optionalen Befehl “return“ zurückgeben. Es können Variablenjedes Typs zurückgegeben werden, auch Listen, Arrays oder Objekte.

<?phpfunction quadrat ($zahl) {

return $zahl * $zahl;}echo quadrat (4); // gibt ’16’ aus.?>

Es ist leider nicht möglich, mehrere Werte von einer Funktion zurückgeben zu lassen.Ein ähnliches Resultat kann man aber durch die Rückgabe von Listen bekommen.

<?phpfunction kleine_zahlen() {

return array(0, 1, 2);}list ($null, $eins, $zwei) = kleine_zahlen();echo ($null $eins $zwei);?>

10.4 Variablenfunktionen

PHP unterstützt das Konzept der Variablenfunktionen. WennSie an das Ende einer Varia-blen Klammern hängen, versucht PHP eine Funktion aufzurufen, deren Name der aktuelleWert der Variable ist. Diese Möglichkeit kann für Callbacks, Funktionstabellen usw. be-nutzt werden.

Variablenfunktionen funktionieren nicht mit Sprachkonstrukten wieecho() , unset() ,isset() undempty() . Das ist eins der Hauptunterschiede zwischen PHP Funktionen undSprachkonstruktenBeispiel 2.46: Beispiel für Variablenfunktionen

Page 86: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

76 KAPITEL 10. FUNKTIONEN

<?phpfunction blah() {

echo "In blah()<br>\n";}

function fasel($arg = ’’) {echo "In fasel(); ist der Parameter ’$arg’.<br>\n";

}

$func = ’blah’;$func();$func = ’fasel’;$func(’test’);?>

Page 87: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 11

Klassen/Objekte

Eine Klasse ist eine Sammlung von Variablen und von Funktionen, die mit diesen Varia-blen arbeiten. Eine Klasse wird folgendermaßen definiert:

<?phpclass Einkaufswagen {

var $produkte; // Produkte in Ihrem Einkaufswagen

// Fuege dem Einkaufswagen $anzahl Artikel der Sorte $artnr zu

function fuege_hinzu ($artnr, $anzahl) {$this->produkte[$artnr] += $anzahl;

}

// Nimm $anzahl von Artikel wieder aus dem Einkaufswagen

function nimm_heraus ($artnr, $anzahl) {if ($this->produkte[$artnr] > $anzahl) {

$this->produkte[$artnr] -= $anzahl;return true;

} else {return false;

}}

}?>

In diesem Beispiel wird eine Klasse “Einkaufswagen“ definiert. Sie besteht aus einemassoziativen Array von Produkten im Einkaufswagen und zweiFunktionen zum Zufügenund Entfernen von Einkäufen.

Klassen sind Typen, dass heisst die Blaupausen für reale Variablen. Um sie zu nutzen,muss zunächst eine Variable mit dem Operatornew angelegt werden.

$einkaufswagen = new Einkaufswagen;$einkaufswagen->fuege_hinzu("10", 1);

Hier wird das Objekt$einkaufswagen aus der Klasse Einkaufswagen geschaffen.Dann wird die enthaltene Funktionfuege_hinzu() aufgerufen, um ein Produkt mit derArtikelnummer 10 in den Einkaufswagen zu tun.

77

Page 88: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

78 KAPITEL 11. KLASSEN/OBJEKTE

Klassen können ebenfalls Erweiterungen von anderen Klassen sein. Die erweiterte,oder auch abgeleitete Klasse enthält alle Funktionen der ursprünglichen Klasse, und dazudie eigenen Ergänzungen. Das geschieht mit dem Schlüsselwort “extends“. Mehrfachver-erbung wird von PHP nicht unterstützt.

class Mein_Einkaufswagen extends Einkaufswagen {var $besitzer;

function setze_besitzer ($name) {$this->besitzer = $name;

}}

In diesem Beispiel wird eine KlasseMein_Einkaufswagen definiert. Sie enthält al-le Funktionen der Klasse Einkaufswagen, eine zusätzliche Variable$besitzer und diezusätzliche Funktionsetze_besitzer() . Man kann den Einkaufswagen auch weiterhinwie oben erzeugen, nur kann man jetzt auch den Besitzer setzen oder herausfinden. Diealten Funktionen der Klasse Einkaufswagen können ebenfalls weiterverwendet werden.

$meinkaufswagen = new Mein_Einkaufswagen; // Kreiere eine n Einkaufswagen$meinkaufswagen->setze_besitzer ("kris"); // Name diese r Klasseprint $meinkaufswagen->besitzer; // schreibe den Namen de s Besitzers$meinkaufswagen->fuege_hinzu ("10", 1); // (Siehe oben, v ererbt

// von Einkaufswagen)

Innerhalb der Funktionen einer Klasse bezeichnet die Variable$this das aktuelle Ob-jekt. Sie können mit$this- >irgendwas auf dessen Variablen und Funktionen zugreifen.

Konstruktoren sind Funktionen einer Klasse, die beim Erschaffen eines neuen Objek-tes automatisch aufgerufen werden. Eine Funktion wird zu einem Konstruktor, wenn Sieden gleichen Namen wie die Klasse trägt.

class Auto_Einkaufswagen extends Einkaufswagen {function Auto_Einkaufswagen () {

$this->fuege_hinzu ("10", 1);}

}

Die Klasse Auto_Einkaufswagen entspricht der Klasse Einkaufswagen plus einenKonstruktor, der bereits für eine erste Füllung (1 Artikel der Nummer 10) gesorgt hat.Jeder neu erzeugte Auto_Einkaufswagen enthält so von vorneherein diesen Artikel. Kon-struktoren können auch Parameter enthalten. Aber diese Parameter sind optional, undkönnen so nützlicher eingesetzt werden.

class Konstruktor_Einkaufswagen extends Einkaufswagen {function Konstruktor_Einkaufswagen ($produkt = "10", $an zahl = 1) {

$this->fuege_hinzu ($produkt, $anzahl);}

}

// Kaufe wieder den gleichen alten Kram ein.

Page 89: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

79

$standard_einkaufswagen = new Konstruktor_Einkaufswage n;

// Kaufe etwas bestimmtes ein ...

$anderer_Einkaufswagen = new Konstruktor_Einkaufswagen ("20", 17);

Achtung:

Bei abgeleiteten Klassen wird der Konstruktor der Vaterklasse nicht automatisch auf-gerufen, wenn der Konstruktor der abgeleiteten Klasse aufgerufen wird. Der Konstruk-tor der Vaterklasse kann in der abgeleiteten Klasse mit dem folgenden Befehl $this->Konstruktor_der_Vaterklasse aufgerufen werden.

Page 90: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 91: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 12

Referenzen in PHP

12.1 Was Referenzen sind

Referenzen sind in PHP ein Mechanismus um verschiedene Namen für den gleichen In-halt von Variablen zu ermöglichen. Sie sind nicht mit Zeigern in C zu vergleichen, sondernAliasdefinitionen für die Symboltabelle. PHP unterscheidet zwischen Variablenname undVariableninhalt, wobei der gleiche Variableninhalt unterschiedliche Namen besitzen kann.Der bestmögliche Vergleich ist der mit Dateinamen und Dateien im Dateisystem von Unix- Variablennamen sind Verzeichniseinträge, während der Variableninhalt die eigentlicheDatei darstellt. Referenzen können nun als Hardlinks im Dateisystem verstanden werden.

12.2 Was Referenzen leisten

PHP Referenzen erlauben es, zwei Variablennamen sich auf den gleichen Variableninhaltbeziehen zu lassen. Das heisst im folgenden Beispiel, dass sich $a und $b auf dieselbeVariable beziehen:

$a =& $b

Anmerkung:$a und$b sind hier gleichwertig, und$a ist nicht nur ein Zeiger auf$boder umgekehrt, sondern$a und$b zeigen auf den selben Inhalt.

Seit PHP 4.0.4 kann & auch in Verbindung mitnew verwendet werden.

$bar =& new fooclass();$foo =& find_var ($bar);

Anmerkung: Wenn der & Operator nicht verwendet wird, erzeugt PHP eine Kopie desObjekts. Wenn nun$this innerhalb der Klasse verwendet wird, bezieht es sich auf dieaktuelle Instanz der Klasse. Die Zuordnung ohne & erzeugt eine Kopie der Instanz (d.h.des Objekts) und$this wird sich auf die Kopie beziehen. In der Regel will man ausPerformance- und Speicherverbrausgründen nur eine einzige Instanz einer Klasse erzeu-gen. Dafür stellt PHP den & bereit.

Eine weitere Einsatzmöglichkeit von Referenzen ist die Übergabe von Parametern aneine Funktion mit “pass-by-reference“. Hierbei beziehen sich der lokale Variablennameals auch der Variablenname der aufrufenden Instanz auf denselben Variableninhalt:

81

Page 92: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

82 KAPITEL 12. REFERENZEN IN PHP

<?phpfunction foo (&$var) {

$var++;}

$a=5;foo($a);echo $a;?>

Nach der Ausführung hat$a den Wert 6, da sich in der Funktionfoo() der Variablen-name$var auf denselben Variableninhalt bezieht wie$a in der aufrufenden Instanz (hierdas Hauptprogramm).

Daneben besteht die Möglichkeit aus Funktionen heraus Werte mit “return by-reference“zurückzugeben.

12.3 Was Referenzen nicht sind

Wie bereits gesagt: Referenzen sind keine Zeiger. Das bedeutet, der folgende Code tutnicht, was zum Beispiel ein C Programmierer erwarten würde:

function foo(&$var) {$var =& $GLOBALS["baz"];

}foo($bar);

Folgendes wird passieren:$var in foo() wird zunächst an$bar aus der aufrufendenInstanz, dann aber an$GLOBALS[“baz“] , gebunden. Es gibt keine Möglichkeit,$bar ausder aufrufenden Instanz mittels Referenz-Mechanismen an etwas anderes zu binden, da$bar in der Funktion foo() nicht zur Verfügung steht ($bar wird durch$var repräsentiert;$var verfügt nur über Variableninhalt, besitzt aber keinen “name-to-value“ Eintrag in derSymboltabelle der aufrufenden Instanz).

12.4 Referenzen zurückgeben

Das Zurückgeben von Ergebnissen per Referenz aus Funktionen heraus kann manchmalrecht nützlich sein. Hierbei ist folgende Syntax zu beachten:

function &find_var($param) {...code...return $found_var;

}

$foo =& find_var($bar);$foo->x = 2;

Page 93: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

12.5. REFERENZEN AUFHEBEN 83

In diesem Beispiel wird also die Eigenschaft des vonfind_var() gelieferten Objek-tes gesetzt, nicht die der Kopie, wie es der Fall wäre, wenn die Funktionfind_var() ihrErgebnis nicht per Referenz liefern würde.

Anmerkung: Im Gegensatz zur Parameterübergabe per Referenz ist bei derRückgabemittels Referenz an beiden Stellen die Angabe des & notwendig.

12.5 Referenzen aufheben

Wird eine Referenz aufgehoben, so wird nur die Bindung zwischen einem Variablenna-men und dem Variableninhalt entfernt. Der Inhalt der Variablen wird hierbei nicht ge-löscht. Betrachten wir folgendes Beispiel:

$a = 1;$b =& $a;unset ($a);

Die Variable $b wird nicht gelöscht, sondern es wird nur die Bindung des Variablen-namen $a an den Variableninhalt aufgehoben. Dieser Variableninhalt ist immer noch über$b verfügbar.

Wiederum sieht man die Analogie zwischen Unix und den Referenzen: Das Aufhebeneiner Referenz entspricht einem Aufruf vonunlink unter Unix.

12.6 Referenzen entdecken

Viele Sprachelemente von PHP sind intern mit der Benutzung von Referenzen implemen-tiert, daher gilt alles bisher gesagte auch für diese Konstrukte:

12.6.1 global References

Die Verwendung vonglobal $var erzeugt im aktuellen Geltungsbereich eine Referenzauf die globale Variable$var , sie ist also äquivalent zu folgendem:

$var =& $GLOBALS["var"];

Dies hat zur Folge, dass das Anwenden vonunset() auf$var keinen Einfluss auf dieglobale Variable hat.

12.6.2 $this

In einer Objektmethode ist$this immer eine Referenz auf die aufrufende Objektinstanz.

Page 94: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 95: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Teil III

Datenbankanbindung

85

Page 96: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 97: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 13

DB Verbindung

PHP 4 unterstützt eine Vielzahl von Datenbankverbindungen. Zuerst wird Kontakt zueiner Datenbank (DB) hergestellt, danach kann man über diese Verbindung SQL-Befehlean die DB abschicken und die Ergebnisse an entsprechenden Stellen im HTML Dokumentausgeben lassen.

Für eine Datenbankverbindung brauchen Sie folgende Daten:

• Datenbanktyp: mysql, pgsql, msql...

• Server: DB-Server Name oder IP-Nummer (134.108.12.14)

• Benutzer: DB-Nutzer

• Passwort: DB-Passwort

• Datenbankname: DB-Name

Diese Daten schreiben Sie am besten in eine Datei und speichern sie aus Sicherheits-gründen außerhalb des “DocumentRoot“ Ihres Webservers.Beispiel 3.1: Verbindungsdaten

<?php //Dateiname server_ip.php

$server = "servername.de";$dbuser = "derBenutzer";$dbpass = "supergeheim123";

?>

Die Verbindung zur DB baut man dann wie folgt auf.Beispiel 3.2: Verbindungsaufbau

<?php

require_once ’server_ip.php’;$int = mysql_connect("$server", "$dbuser", "$dbpass");

?>

87

Page 98: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

88 KAPITEL 13. DB VERBINDUNG

Leider sind die Befehle zwischen verschiedenen DB (MySQL, PostgreSQL, ..) nichteinheitlich. Z.B. benutzt man bei PostgreSQL

pg_exec()

statt

mysql_db_query().

Um sich bei einem DB-Wechsel oder verschiedenen Projekten leichter zu tun, kannman eine DB-Abstraktion verwenden. Bei PHP 4 kann die KlasseDB.php aus PEARbenutzt werden.

Für die DB-Anbindung mit PEAR brauchen Sie folgende Datei, die Sie wieder in eineseperate Datei schreiben.Beispiel 3.3: Verbindungsdaten unter PEAR

<?php // Dateiname Database.phprequire_once ’DB.php’;

$user = ’user’;$pass = ’pass’;$host = ’localhost’;$dbase = ’database’;

$dsn = "$base://$user:$pass@$host/$dbase";$db = DB::connect("$dsn");

if (DB::isError($db)) {die ($db->getMessage());

}?>

Page 99: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 14

DB Abfrage

Nachdem Sie eine Verbindug zu einem DBMS hergestellt haben (klassisch oder OO)können Sie nun Abfragen (Queries) an die DB schicken und die Ergebnisse auf IhrerSeite anzeigen lassen.

Im ersten Fall erhalten Sie mit$int einen “Database Handler“. Mit diesem Handlerkönnen Sie Abfragen an die DB schicken. Mit mysql_db_query() schicken Sie eine Ab-frage an die DB und bekommen eine “Ressource ID“ zurück. Mit der “Ressource ID“können Sie über die Funktionmysql_fetch_row() sukzessive Zeile für Zeile als Arrayauslesen.Beispiel 3.4: DB-Abfrage klassisch

<?php

$db = "Datenbankname";$res = mysql_db_query ("$db","SELECT * FROM t_test")

or die ("Ein Fehler ist aufgetreten!");$num = mysql_num_rows($res);echo $num."<BR>";

for ($i = 1; $row = mysql_fetch_row($res); $i++) {//print_r($row);//echo "<BR>";echo $row[0]." ".$row[1]."<BR>";

}?>

Wie im vorherigen Abschnitt schon erwähnt ändern sich die Funktionen von DBMSzu DBMS. In PEAR wurde darum mit DB.php eine einheitliche DBMS-Abstraktion ge-schaffen, die es dem Programmierer erlaubt unabhängig von speziellen Funktionen, fürverschiedene DBMS zu programmieren.Beispiel 3.5: DB-Abfrage unter PEAR

<?php

require_once ’Database.php’;

$sql = "SELECT * FROM t_test";$res = $db->query($sql);if (DB::isError($res)) {

die ($res->getMessage());

89

Page 100: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

90 KAPITEL 14. DB ABFRAGE

}

while ($row = $res->fetchRow()) {// print_r($row);// echo "<BR>";echo $row[0]." ".$row[1]."<BR>";

}?>

Page 101: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Teil IV

Formulare

91

Page 102: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 103: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFKapitel 15

Formulargenerierung

Einfache Formulare kann man mit HTML generieren. Die Auswertung von Formular-daten hingegen ist mit HTML nicht realisierbar. Dafür gibt es PHP. Einfache Formularewerden meisten von Hand generiert, größere und komplexere Formulare sollte man mitder Hilfe von PHP erstellen.

15.1 Formulargenerierung mit HTML

Die Formulargenerierung mit HTML lässt am besten anhand eines kleines Beispiels zei-gen. Das Beispiel wird in diesem Kapitel dann zu einem erweiterbaren Gästebuch ver-vollständigt.Beispiel 4.1: Formulargenerierung mit HTML

<html><body>

<h1>Guestbook Beispiel</h1><form action="<?php echo $PHP_SELF ?>" method=post>

<table><tr>

<td>email:</td><td><input name=email></td>

</tr><tr>

<td>text: </td><td><textarea name=nachricht cols=50 rows=5></textarea ></td>

</tr><tr>

<td colspan=2 align=center><input type=submit value=Abs chicken></td></tr>

</table><br><br>

</form></body>

</html>

Dieses Beispiel sollten Sie z.B. alsguestbook.php4 speichern. Wenn Sie diesesSkript ausführen und den generierten HTML-Code genauer anschauen, werden Sie erken-nen was PHP aus dem$PHP_SELFerzeugt hat; den eigenen Dateinamen. Dieses Formular

93

Page 104: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

94 KAPITEL 15. FORMULARGENERIERUNG

wird also an sich selbst geschickt. So lassen sich die Formulardaten einfacher verarbeiten,wie Sie später im Abschnitt Formularauswertung sehen werden.

15.2 Formulargenerierung mit HTML/Form.phpFür größere Formulare bieten sich die Klasse Form.php aus PEAR an. Es kann auchOOH_Forms verwendet werden, das bei komplexen Formularhandlings seine Stärken hat.Das gleiche Formular wird mit Form.php wie folgt generiert.Beispiel 4.2: Formulargenerierung mit Form.php

<html><body>

<h1>Guestbook Beispiel</h1><?phprequire_once ’HTML/Form.php’;$form = new HTML_Form($PHP_SELF, post);$form->addText(email, ’email:’,’’);$form->addTextarea(nachricht, Nachricht,’’, 50, 5);$form->addSubmit(submit, Abschicken);

$form->display();?>

</body></html>

An diesem Beispiel sieht man deutlich wieviel Tipparbeit Form.php abnimmt. Leiderbeherrscht Form.php zur Zeit nur die einspaltige Ausrichtung der Formularfelder. Fürnoch komplexere Formulare können Sie sich HTML_OOH_FORM1 anschauen.

1 http://cvs.php.net/cvs.php/pear/HTML_OOH_Form

Page 105: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Kapitel 16

Formularauswertung

16.1 Einfache Formularauswertung

Das generierte Formular wird in diesem Abschnitt nun ausgelesen. Zunächst wird dasFormular aus dem Beispiel 4.1 ausgelesen und die Werte einfach ausgegeben. In einemweiteren Beispiel werden die Werte in eine DB geschrieben. Dannach wird das Formularaus Beispiel 4.2 ausgewertet und auch in eine DB geschrieben. Abschließend wird dannein Rohgerüst für ein Gästebuch vorgestellt.Beispiel 4.3: einfache Formularauswertung

<html><body>

<h1>Guestbook Beispiel</h1><?phpif (!$i) {?>

<form action="<?php echo $PHP_SELF ?>" method=post><input type="hidden" name="i" value=1>

<table><tr>

<td>email:</td><td><input name=email></td>

</tr><tr>

<td>text: </td><td><textarea name=nachricht cols=50 rows=5></textarea ></td>

</tr><tr>

<td colspan=2 align=center><input type=submit value=Abs chicken></td></tr>

</table><br><br>

</form><?php} else {echo $name."<br>";echo $email."<br>";echo $nachricht."<br>";}?>

95

Page 106: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

96 KAPITEL 16. FORMULARAUSWERTUNG

</body></html>

Das Auslesen des Formulars geschieht in der gleichen Datei aus Gründen der einfa-cheren Handhabung des Codes. Um zwischen Formulardarstellung und Formularauswer-tung zu unterscheiden, wurde die Variable$i eingeführt. Wenn das Formular zum erstenmal aufgerufen wird wird das versteckte Formularfeldi mit dem Wert ’1’ belegt, so dassbeim zweiten Aufruf des Formulars (nach dem Abschicken) der} else { - Teil abge-arbeitet wird. Die Formularauswertung beginnt ab} else { ; hier werden einfach dieeingegeben Daten wieder ausgegeben. Meistens will man aberdie eingegebenen Daten inirgendeiner Form festhalten. Hierzu eignet sich in den meisten Fällen eine Datenbank.

16.2 Formularauswertung mit Datenbankanbindung

Um die Formulardaten festzuhalten kann man die Daten in eineDatenbank schreiben. ImBeispiel muss der} else { - Teil erweitert werden.Beispiel 4.4: Formularauswertung mit Datenbankanbindung

<html><body>

<h1>Guestbook Beispiel</h1><?phprequire_once ’Database.php’;

function pd_timestamp_pretty() {return date("d.M.Y H:i:s");

}if (!$i) {?>

<form action="<?php echo $PHP_SELF ?>" method=post><input type="hidden" name="i" value=1>

<table><tr>

<td>email:</td><td><input name=email></td>

</tr><tr>

<td>text: </td><td><textarea name=nachricht cols=50 rows=5></textarea ></td>

</tr><tr>

<td colspan=2 align=center><input type=submit value=Abs chicken></td></tr>

</table></form>

<br><br><table>

<tr><td>Email</td><td>Eintrag</td><td>Datum</td>

</tr>

Page 107: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

16.2. FORMULARAUSWERTUNG MIT DATENBANKANBINDUNG 97

<tr><td colspan=3>&nbsp;</td></tr><?php

$sql = "SELECT email, nachricht, datum FROM t_guest ORDER BY id DESC";$res = $db->query($sql);while ($row = $res->fetchRow())) {

echo "<tr>

<td>$row[0]</td><td>$row[1]</td><td>$row[2]</td>

</tr>";}

?></table><?php} else { // Nachricht in Datenbank eintragen

// Datum erzeugen$date = pd_timestamp_pretty();// Zeilenumbruch in <br> wandeln$nachricht = nl2br($nachricht);$sql = "INSERT INTO t_guest

VALUES(’’, ’$date’, ’$email’, ’$nachricht’)";if ($res = $db->query($sql)) {

echo "Ihr Eintrag war erfolgreich";}

}?></body></html>

Page 108: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 109: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Anhang A

GNU Free Documentation License

Version 1.1, March 2000

Copyright c© 2000 Free Software Foundation, Inc.59 Temple Place, Suite 330, Boston, MA 02111-1307 USAEveryone is permitted to copy and distribute verbatim copies of this license document,but changing it is not allowed.

Preamble

The purpose of this License is to make a manual, textbook, or other written document“free” in the sense of freedom: to assure everyone the effective freedom to copy andredistribute it, with or without modifying it, either commercially or noncommercially.Secondarily, this License preserves for the author and publisher a way to get credit fortheir work, while not being considered responsible for modifications made by others.

This License is a kind of “copyleft”, which means that derivative works of the docu-ment must themselves be free in the same sense. It complements the GNU General PublicLicense, which is a copyleft license designed for free software.

We have designed this License in order to use it for manuals for free software, becausefree software needs free documentation: a free program should come with manuals provi-ding the same freedoms that the software does. But this License is not limited to softwaremanuals; it can be used for any textual work, regardless of subject matter or whether itis published as a printed book. We recommend this License principally for works whosepurpose is instruction or reference.

A.1 Applicability and Definitions

This License applies to any manual or other work that contains a notice placed by thecopyright holder saying it can be distributed under the terms of this License. The “Docu-ment”, below, refers to any such manual or work. Any member ofthe public is a licensee,and is addressed as “you”.

99

Page 110: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

100 ANHANG A. GNU FREE DOCUMENTATION LICENSE

A “Modified Version” of the Document means any work containing the Document ora portion of it, either copied verbatim, or with modifications and/or translated into anotherlanguage.

A “Secondary Section” is a named appendix or a front-matter section of the Documentthat deals exclusively with the relationship of the publishers or authors of the Document tothe Document’s overall subject (or to related matters) and contains nothing that could falldirectly within that overall subject. (For example, if the Document is in part a textbookof mathematics, a Secondary Section may not explain any mathematics.) The relationshipcould be a matter of historical connection with the subject or with related matters, or oflegal, commercial, philosophical, ethical or political position regarding them.

The “Invariant Sections” are certain Secondary Sections whose titles are designated,as being those of Invariant Sections, in the notice that saysthat the Document is releasedunder this License.

The “Cover Texts” are certain short passages of text that arelisted, as Front-CoverTexts or Back-Cover Texts, in the notice that says that the Document is released underthis License.

A “Transparent” copy of the Document means a machine-readable copy, representedin a format whose specification is available to the general public, whose contents can beviewed and edited directly and straightforwardly with generic text editors or (for imagescomposed of pixels) generic paint programs or (for drawings) some widely available dra-wing editor, and that is suitable for input to text formatters or for automatic translationto a variety of formats suitable for input to text formatters. A copy made in an otherwiseTransparent file format whose markup has been designed to thwart or discourage sub-sequent modification by readers is not Transparent. A copy that is not “Transparent” iscalled “Opaque”.

Examples of suitable formats for Transparent copies include plain ASCII without mar-kup, Texinfo input format, LATEX input format, SGML or XML using a publicly availableDTD, and standard-conforming simple HTML designed for human modification. Opaqueformats include PostScript, PDF, proprietary formats thatcan be read and edited only byproprietary word processors, SGML or XML for which the DTD and/or processing toolsare not generally available, and the machine-generated HTML produced by some wordprocessors for output purposes only.

The “Title Page” means, for a printed book, the title page itself, plus such followingpages as are needed to hold, legibly, the material this License requires to appear in the titlepage. For works in formats which do not have any title page as such, “Title Page” meansthe text near the most prominent appearance of the work’s title, preceding the beginningof the body of the text.

A.2 Verbatim Copying

You may copy and distribute the Document in any medium, either commercially or non-commercially, provided that this License, the copyright notices, and the license noticesaying this License applies to the Document are reproduced in all copies, and that youadd no other conditions whatsoever to those of this License.You may not use technicalmeasures to obstruct or control the reading or further copying of the copies you make

Page 111: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

A.3. COPYING IN QUANTITY 101

or distribute. However, you may accept compensation in exchange for copies. If you dis-tribute a large enough number of copies you must also follow the conditions in section3.

You may also lend copies, under the same conditions stated above, and you may pu-blicly display copies.

A.3 Copying in Quantity

If you publish printed copies of the Document numbering morethan 100, and the Do-cument’s license notice requires Cover Texts, you must enclose the copies in covers thatcarry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, andBack-Cover Texts on the back cover. Both covers must also clearly and legibly identifyyou as the publisher of these copies. The front cover must present the full title with allwords of the title equally prominent and visible. You may addother material on the coversin addition. Copying with changes limited to the covers, as long as they preserve the titleof the Document and satisfy these conditions, can be treatedas verbatim copying in otherrespects.

If the required texts for either cover are too voluminous to fit legibly, you should putthe first ones listed (as many as fit reasonably) on the actual cover, and continue the restonto adjacent pages.

If you publish or distribute Opaque copies of the Document numbering more than 100,you must either include a machine-readable Transparent copy along with each Opaque co-py, or state in or with each Opaque copy a publicly-accessible computer-network locationcontaining a complete Transparent copy of the Document, free of added material, whichthe general network-using public has access to download anonymously at no charge usingpublic-standard network protocols. If you use the latter option, you must take reasonablyprudent steps, when you begin distribution of Opaque copiesin quantity, to ensure thatthis Transparent copy will remain thus accessible at the stated location until at least oneyear after the last time you distribute an Opaque copy (directly or through your agents orretailers) of that edition to the public.

It is requested, but not required, that you contact the authors of the Document wellbefore redistributing any large number of copies, to give them a chance to provide youwith an updated version of the Document.

A.4 Modifications

You may copy and distribute a Modified Version of the Documentunder the conditionsof sections 2 and 3 above, provided that you release the Modified Version under preciselythis License, with the Modified Version filling the role of theDocument, thus licensingdistribution and modification of the Modified Version to whoever possesses a copy of it.In addition, you must do these things in the Modified Version:

• Use in the Title Page (and on the covers, if any) a title distinct from that of theDocument, and from those of previous versions (which should, if there were any,

Page 112: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

102 ANHANG A. GNU FREE DOCUMENTATION LICENSE

be listed in the History section of the Document). You may usethe same title as aprevious version if the original publisher of that version gives permission.

• List on the Title Page, as authors, one or more persons or entities responsible forauthorship of the modifications in the Modified Version, together with at least fiveof the principal authors of the Document (all of its principal authors, if it has lessthan five).

• State on the Title page the name of the publisher of the Modified Version, as thepublisher.

• Preserve all the copyright notices of the Document.

• Add an appropriate copyright notice for your modifications adjacent to the othercopyright notices.

• Include, immediately after the copyright notices, a license notice giving the publicpermission to use the Modified Version under the terms of thisLicense, in the formshown in the Addendum below.

• Preserve in that license notice the full lists of Invariant Sections and required CoverTexts given in the Document’s license notice.

• Include an unaltered copy of this License.

• Preserve the section entitled “History”, and its title, andadd to it an item stating atleast the title, year, new authors, and publisher of the Modified Version as given onthe Title Page. If there is no section entitled “History” in the Document, create onestating the title, year, authors, and publisher of the Document as given on its TitlePage, then add an item describing the Modified Version as stated in the previoussentence.

• Preserve the network location, if any, given in the Documentfor public access toa Transparent copy of the Document, and likewise the networklocations given inthe Document for previous versions it was based on. These maybe placed in the“History” section. You may omit a network location for a workthat was publishedat least four years before the Document itself, or if the original publisher of theversion it refers to gives permission.

• In any section entitled “Acknowledgements” or “Dedications”, preserve the sec-tion’s title, and preserve in the section all the substance and tone of each of thecontributor acknowledgements and/or dedications given therein.

• Preserve all the Invariant Sections of the Document, unaltered in their text and intheir titles. Section numbers or the equivalent are not considered part of the sectiontitles.

• Delete any section entitled “Endorsements”. Such a sectionmay not be included inthe Modified Version.

Page 113: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

A.5. COMBINING DOCUMENTS 103

• Do not retitle any existing section as “Endorsements” or to conflict in title with anyInvariant Section.

If the Modified Version includes new front-matter sections or appendices that qualifyas Secondary Sections and contain no material copied from the Document, you may atyour option designate some or all of these sections as invariant. To do this, add their titlesto the list of Invariant Sections in the Modified Version’s license notice. These titles mustbe distinct from any other section titles.

You may add a section entitled “Endorsements”, provided it contains nothing but en-dorsements of your Modified Version by various parties – for example, statements of peerreview or that the text has been approved by an organization as the authoritative definitionof a standard.

You may add a passage of up to five words as a Front-Cover Text, and a passage of upto 25 words as a Back-Cover Text, to the end of the list of CoverTexts in the ModifiedVersion. Only one passage of Front-Cover Text and one of Back-Cover Text may be addedby (or through arrangements made by) any one entity. If the Document already includesa cover text for the same cover, previously added by you or by arrangement made by thesame entity you are acting on behalf of, you may not add another; but you may replacethe old one, on explicit permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by thisLicense give permissionto use their names for publicity for or to assert or imply endorsement of any ModifiedVersion.

A.5 Combining Documents

You may combine the Document with other documents released under this License, underthe terms defined in section 4 above for modified versions, provided that you include inthe combination all of the Invariant Sections of all of the original documents, unmodified,and list them all as Invariant Sections of your combined workin its license notice.

The combined work need only contain one copy of this License,and multiple identicalInvariant Sections may be replaced with a single copy. If there are multiple Invariant Sec-tions with the same name but different contents, make the title of each such section uniqueby adding at the end of it, in parentheses, the name of the original author or publisher ofthat section if known, or else a unique number. Make the same adjustment to the sectiontitles in the list of Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections entitled “History” in the variousoriginal documents, forming one section entitled “History”; likewise combine any sec-tions entitled “Acknowledgements”, and any sections entitled “Dedications”. You mustdelete all sections entitled “Endorsements.”

A.6 Collections of Documents

You may make a collection consisting of the Document and other documents releasedunder this License, and replace the individual copies of this License in the various docu-

Page 114: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

104 ANHANG A. GNU FREE DOCUMENTATION LICENSE

ments with a single copy that is included in the collection, provided that you follow therules of this License for verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, anddistribute it indivi-dually under this License, provided you insert a copy of thisLicense into the extracteddocument, and follow this License in all other respects regarding verbatim copying of thatdocument.

A.7 Aggregation With Independent Works

A compilation of the Document or its derivatives with other separate and independentdocuments or works, in or on a volume of a storage or distribution medium, does not as awhole count as a Modified Version of the Document, provided nocompilation copyright isclaimed for the compilation. Such a compilation is called an“aggregate”, and this Licensedoes not apply to the other self-contained works thus compiled with the Document, onaccount of their being thus compiled, if they are not themselves derivative works of theDocument.

If the Cover Text requirement of section 3 is applicable to these copies of the Docu-ment, then if the Document is less than one quarter of the entire aggregate, the Docu-ment’s Cover Texts may be placed on covers that surround onlythe Document within theaggregate. Otherwise they must appear on covers around the whole aggregate.

A.8 Translation

Translation is considered a kind of modification, so you may distribute translations ofthe Document under the terms of section 4. Replacing Invariant Sections with translationsrequires special permission from their copyright holders,but you may include translationsof some or all Invariant Sections in addition to the originalversions of these InvariantSections. You may include a translation of this License provided that you also include theoriginal English version of this License. In case of a disagreement between the translationand the original English version of this License, the original English version will prevail.

A.9 Termination

You may not copy, modify, sublicense, or distribute the Document except as expressly pro-vided for under this License. Any other attempt to copy, modify, sublicense or distributethe Document is void, and will automatically terminate yourrights under this License.However, parties who have received copies, or rights, from you under this License willnot have their licenses terminated so long as such parties remain in full compliance.

A.10 Future Revisions of This License

The Free Software Foundation may publish new, revised versions of the GNU Free Do-cumentation License from time to time. Such new versions will be similar in spirit to

Page 115: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

A.10. FUTURE REVISIONS OF THIS LICENSE 105

the present version, but may differ in detail to address new problems or concerns. Seehttp://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number. If the Documentspecifies that a particular numbered version of this Licenseör any later versionäppliesto it, you have the option of following the terms and conditions either of that specifiedversion or of any later version that has been published (not as a draft) by the Free SoftwareFoundation. If the Document does not specify a version number of this License, you maychoose any version ever published (not as a draft) by the FreeSoftware Foundation.

ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the License in thedocument and put the following copyright and license notices just after the title page:

Copyright c© YEAR YOUR NAME. Permission is granted to copy, distributeand/or modify this document under the terms of the GNU Free Documenta-tion License, Version 1.1 or any later version published by the Free SoftwareFoundation; with the Invariant Sections being LIST THEIR TITLES, with theFront-Cover Texts being LIST, and with the Back-Cover Textsbeing LIST. Acopy of the license is included in the section entitled “GNU Free Documen-tation License”.

If you have no Invariant Sections, write “with no Invariant Sections” instead of sayingwhich ones are invariant. If you have no Front-Cover Texts, write “no Front-Cover Texts”instead of “Front-Cover Texts being LIST”; likewise for Back-Cover Texts.

If your document contains nontrivial examples of program code, we recommend re-leasing these examples in parallel under your choice of freesoftware license, such as theGNU General Public License, to permit their use in free software.

Page 116: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 117: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFAnhang B

Links und weitere Quellen

B.1 Quellen PHP

• http://php.net

• http://de.php.net

• http://zend.com

• http://www.koehntopp.de/php PHP FAQ

B.2 Quellen HTML

• http://selfhtml.teamone.de

B.3 Quellen SQL

• http://www.little-idiot.de/mysql/

• http://www.de.postgresql.org/users-lounge/index.html

B.4 Quellen Freie Projekte

• http://www.freshmeat.net

• http://www.sourceforge.net

107

Page 118: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RF

Page 119: ENTWURF - lisas.delisas.de/~hakan/file/einfuehrung_php4.pdf · programmiert und in PHP/FI umbenannt. Der Form Interpreter (FI) kam von einem an- Der Form Interpreter (FI) kam von

EN

TWU

RFIndex

AArray

füllen, 32Schlüssel,30

ASP,11

CCGI, 11

JJSP,11

LLerdorf, Rasmus,ii , 7

OOpen Source,11

PPEAR,8Perl,11PHP,11

Akronym,1Geschichte,7

SSkalar,30

TTag

ASP-Stil,17PHP,17

ZZend,8

109