Home
2 Erweiterte Syntax
Contents
1. case FT_ZIP_ARCHIVE han break le ZIPs here Q Hinweis Mit dem Begriff spezielle Werte meinen wir magische Num mern oder spezielle Zeichenfolgen Wenn Sie beispielsweise aus Ihrem Programm auf eine GIF Datei zugreifen wollen und Ihr Programm intern GIF durch die magische Nummer 6 erkennt weil dies der Programmie rer so festgelegt hatte es k nnte auch 1234 sein k nnen Sie mit define GIF_FILE 6 f r diesen Wert eine Definition erzeugen und k nftig auf Ihre magische Nummer mit dem Schl sselwort GIF_FILE zugreifen 64 Definition von Konstanten Dieser Programmabschnitt liest einen Bezeichner aus einer Eingabedatei und entscheidet dann wie er auf diesen Bezeichner reagiert Der Bezeichner gibt an ob es sich bei den folgenden Daten um ein GIF Bild ein PNG Bild oder ein ZIP Archiv handelt Er k nnte folgenderma en aussehen GIF Bild GIF_IMG PNG Bild PNG_IMG ZIP Archiv ZIP_ARC Diese Bezeichner w rden in einer include Datei folgenderma en definiert werden define FT_GIF_IMAGE GIF_IMG define FT_PNG_IMAGE PNG_IMG define FT_ZIP_ARCHIVE ZIP_ARC Diese Einrichtung hat den Vorteil dass Sie alle Bezeichner an einer zentralen Stelle sammeln k nnen Wenn Sie einen Bezeichner ndern m ssen brauchen Sie nur seine Definition ndern Andernfalls m ssten Sie den gesamten Pro grammcode durchsuchen und jede dieser Zeichenfolgen manuell ersetzen
2. return this gt item_list L item function get_contents return this gt item_list you can instantiate shopping_cart the regular way cart new shopping_cart you can make use of the variable arguments of the constructor cart new shopping_cart Cap 2 you can also use extended_cart which in turn calls the constructor of shopping_cart implicitly cart new extended_cart or you can use the inherited features of the constructor cart new extended_cart Cap 2 of course you can also use the inherited functions cart gt pick Mug 1 or use any functions in the object itself while list item quantity each cart gt get_contents print We have quantity of item Listing 2 1 Einkaufswagen Quellcode 87 2 Erweiterte Syntax 2 5 Verknupfte Listen Verkn pfte Listen eine Sonderform der Baumstrukturen geh ren zu den typischen Datenstrukturen f r die Organisation von dynamischen Datens t zen Wir gehen davon aus dass Sie bereits ein Grundverst ndnis von der Struktur dem Konzept und der Verwendung verkn pfter Listen haben Daher werden wir hier nicht detailliert auf ihre Implementierung eingehen sondern konzentrieren uns auf die wichtigsten zu beachtenden Aspekte Wie bereits in den vorangegangenen Abschnitten beschrieben erzeugt PHP 3 0 von den Objektinstanzen Kopien anstatt diese mithilfe eines Zeigers zu referenzieren Damit ist nur
3. PHP und objektorientierte Programmierung print Traversing left tree lt br gt traverse_tree node gt left print Traversing right tree lt br gt traverse_tree node gt right Lassen wir f r einen Moment au er acht dass diese rekursive Funktion nie enden wird da unser Baum keine Stopp Markierung besitzt die Funktion wei nicht welcher Knoten tats chlich einen Tochterknoten besitzt und welcher nicht Sehen wir uns seine Funktionsweise an und wie PHP damit umgeht Der kritische Punkt ist bereits die erste Zeile in der node ein Wert zugewiesen wird Der Parameter start_node gibt die Instanz des Knotens an von welcher gestartet werden soll und die Zuordnung zu node erzeugt eine Kopie davon F r eine Funktion die den Baum einfach rekursiv abarbeitet und den Knoten inhalt zur ckgibt ist die Tatsache dass eine Kopie erzeugt wird nicht von Bedeutung es kann jedoch wichtig werden wenn Sie den Baum an einer Stelle ndern m chten Nehmen wir nun an Sie m chten eine Funktion schreiben die an den Knoten ganz links au en einen weiteren Knoten anh ngt Kein Problem Schreiben Sie einfach eine rekursive Funktion welche die Spr nge nach links z hlt und den Knoten mit der h chsten Z hlerzahl zur ckgibt ndern Sie dann die Verkn pfung zu den Tochterknoten dieses Objekts und Sie sind fertig Moment sind Sie wirklich fertig Denken Sie einen Moment dar ber nach was Sie ge ndert haben siehe Abbildu
4. SD LY Abbildung 2 14 Beispielausgabe des Funktionplotters parse_function erzeugt den PHP Code aus den vom Benutzer gelieferten Daten indem es auf diese einen regul ren Ausdruck anwendet Um die mathematische Funktion einfacher nutzen zu k nnen wurde sie in eine kleine Funktion eingebettet welche die entsprechenden Werte den Konstan 125 2 Erweiterte Syntax ten zuordnet durch erneute Referenz auf die Benutzereingaben Anschlie Send wird die mathematische Anweisung ausgef hrt und das Ergebnis an den Anrufer zurtickgesendet Die von parse_function generierte Funktion sieht f r unser Beispiel m x b x 3 folgenderma en aus function calculate req_code x eval req_code return m x b x 3 req_code enth lt die Eingabe aus dem zweiten Formularfeld in diesem Bei spiel m 10 b 20 Wenn wir dies mit eval ausf hren erhalten wir die korrekte Variablenzuordnung f r die n chste Zeile welche bereits die gesamte Berechnung vornimmt Und das war es Hinweis Wichtige Informationen ber die Anweisung eval finden Sie in der vorangegangenen Warnung Jetzt wird die Funktion nur noch grafisch dargestellt Die for Schleife wird f r einen vordefinierten Bereich durchlaufen und mittels calculate werden bei jedem Durchgang die Y Werte f r die Kurve ermittelt 2 7 2 Selbstmodifizierender Zahler Ein einfaches Beispiel f r selbstmodifizierende Z hler sind Trefferzahler N
5. outputL outputL current_byte current_counter 0 else bytes don t match do we h if curren ave a cached pair t_count gt 1 yes we do write it outputL chr current_c unter threshold RESHOLD it does flush cache and restart chr current_count ount 107 2 Erweiterte Syntax outputL old_byte current_count 1 else we don t have a cached pair write literal if ord old_byte lt COUNTER_THRESHOLD this byte could be mistaken as a counter value so write a dummy pair outputl chr 1 outputL old_byte else can t be mistaken as counter value just write the value directly outputL old_byte set current byte as old byte old_byte current_byte get new byte and loop status read_from_input current_byte return output Listing 2 3 Der RLE Komprimierungsalgorithmus function get_encoded_pair amp count amp value check input stream if read_from_input data_element no input data available return zero count and dummy data count 0 108 Assoziative Arrays indicate failure return 0 test if this is literal data if ord data this count count value else element gt COUNTER_THRESHOLD is literal data return of one and data element 1 data_element this has been a
6. 1 create dummy contents root_node gt contents assign root element to array return_arrayL0 root_node return it back to caller return return_array function tree_allocate_node amp tree_array 94 Verkn pfte Listen find a free node for i 0 i lt count tree_array i retrieve node from array node tree_array il is it in use if node gt free no it is not in use allocate it node gt free 0 assign node back to array to update the tree tree_array L il node now return this node s index as handle return i we haven t found a free node so allocate a new one node new tree_node invalidate all indices node gt idx_up 1 node gt idx_left 1 node gt idx_right 1 this node is NOT free node gt free 0 assign dummy contents node gt contents now add this node to the tree array tree_arrayL node return new index as handle return count tree_array 1 function tree_free_node amp tree_array handle 95 2 Erweiterte Syntax retrieve node from tree node tree_arrayl handle check if it is really allocated if node gt free this node is free return an error code note that this only serves diagnostic purposes since it wouldn t hurt the tree if we d just mark it as free return 1 node gt free 1 assig
7. Die wichtigsten Array Funktionen sind 1ist each und count list ist eine Art Operator der aus einer Reihe von Variablen einen Wert bildet einen Wert der auf der linken Seite eines Ausdrucks verwendet wer den kann der sich ahnlich wie ein Element eines mehrdimensionalen Arrays wiederum als neue Entit t darstellt Als Argument kann er eine Liste von Variablen besitzen Wird ihm etwas zugeordnet eine Liste von Variablen oder ein Array Element dann wird die Liste der Variablen die als Argument des Operators list angegeben wurde von links nach rechts abgearbeitet Die sen Argumenten wird dann ein entsprechender Wert aus dem r Wert einem Wert der auf der rechten Seite eines Ausdrucks verwendet werden kann zugewiesen Dies l sst sich am besten anhand eines Beispiels erkl ren result mysql_db_query mysql_handle mysql_db SELECT car_type car_color car_speed FROM cars WHERE car_id car_id list car_type car_color car_speed mysql_fetch_row result Hinweis Dieser Programmcode wird hier nur als Beispiel verwendet Es empfiehlt sich nicht diesen Programmcode in realistische Programme zu integrieren da er darauf aufbaut dass die Felder in derselben Reihenfolge bleiben Wenn Sie die Reihenfolge der Felder ndern m ssen Sie auch die Reihenfolge der Variablen in der Anweisung list ndern Die Verwen dung von assoziativen Arrays und die manuelle Extraktion von Werten bedeutet einen zus tzlichen Progra
8. am Ende des Arrays angelangt sind Es gibt keine M glichkeit diese beiden F lle zu unterscheiden Daher sollten diese Funktionen nur verwendet wer den wenn each nicht anwendbar ist und die M glichkeit auf ein nicht zugeordnetes Element zu treffen ausgeschlossen werden kann Neben den soeben beschriebenen Funktionen befassen sich noch eine Reihe weiterer PHP Funktionen mit Arrays Eine ausf hrliche Beschreibung finden Sie im Benutzerhandbuch PHP 4 0 hat eine Vielzahl neuer Array Funktionen Auf sie alle einzugehen w rde uns hier zu weit vom eigentlichen Thema abbringen 73 2 Erweiterte Syntax 2 4 PHP und objektorientierte Programmierung Anfang der 90er Jahre lernten die meisten bekannten Compiler wie z B die Familie der Borlandcompiler mit objektorientierten Programmierungser weiterungen OOP von Basissprachen wie Pascal und C umzugehen Pl tzlich wurden Begriffe wie Klassen Objekte Schablonen und Vererbung zu den Schlagworten schlechthin den hei esten Themen der Softwareent wicklung OOP war hip und viele Firmen sprangen auf den Zug auf indem sie ihre Softwarepakete von der prozeduralen auf objektorientierte Program mierung umstellten Inzwischen ist die Euphorie verblasst aber eine Sprache die keine Objekte handhaben kann wird immer noch als veraltet betrachtet PHP unterst tzt Objekte Im folgenden Abschnitt wollen wir die Vor und Nachteile der objektorientierten Programmierung mit PHP er rtern
9. ume Wenn es sich nicht vermeiden l sst ver suchen Sie die Verwendung von Klassen auf die Erfassung von Daten zu beschr nken und die Datenverwaltung auszusparen 80 PHP und objektorientierte Programmierung Code Verwenden Sie Klassen nur zur Strukturierung von APIs die nicht durch die Kopiersyntax verletzt werden Uberlegen Sie ob sich Ihr Projekt mit Prozeduren realisieren lasst Wenn ja erforschen Sie diese M glichkeit Proze duren sind zuverl ssig und haben sich bew hrt wohingegen Objekte noch einige Gefahren bergen Klassen in PHP 4 0 Verwenden Sie Klassen vorsichtig und stellen Sie sicher dass Sie Kopien und Verweise von Objekten unterscheiden k nnen Achten Sie darauf an welche Typen Sie Werte bergeben und wie Sie mit Ihnen umgehen Sobald Sie nur ein einziges vergessen erzeugt PHP eine Kopie Ihres Objekts was wahr scheinlicher Weise die Konsistenz Ihrer Daten unterbrechen wird Die Klassen wurden zwar in PHP 4 0 verbessert aber wir bleiben skeptisch Wir haben Meinungen geh rt die in beide Richtungen gehen Eine Gruppe besteht darauf dass Objekte nichts taugen und nicht in einer Sprache wie PHP verwendet werden sollten w hrend eine andere Gruppe Objekte jedem prozeduralen Ansatz vorzieht sogar in PHP 3 0 F r jene die nur mit Proze duren arbeiten scheinen Objekte ein schlafendes Ungeheuer zu sein das man besser nicht wecken sollte F r die Fangemeinde der objektorientierten Pro grammierung sind d
10. width 1 height 1 color_ 0 height 1 color_grid image 0 DIAGRAM_HORIZON width 1 DIAGRAM_HORIZON rid ome text g image 3 10 DIAGRAM_HORIZON 10 PLOT_MIN color_ rid image age g image 3 width 30 DIAGRAM_HORIZON 10 PLOT_MAX function plot image x y import the color handle 122 Polymorphisierung und selbstmodifizierender Code global color_plot set these as static to remember the last coordinates static old_x PLOT_MIN static old_y 0 only plot from the second time on if old_x PLOT_MIN imageline image old_x PLOT_STEP DIAGRAM_HEIGHT w old_y DIAGRAM_HORIZON x PLOT_STEP DIAGRAM_HEIGHT w y DIAGRAM_HORIZON color_plot old_x X old_y y see if we ve been invoked with a function string set if isset function_string no there s no function string present generate an input form print lt html gt lt body gt print lt form action basename PHP_SELF method post gt print Function definition lt input type text _ wname function_string value m x b x 3 gt lt br gt print Required PHP code lt input type text name req_code wvalue m 10 b 20 gt lt br gt print lt input type submit value Parse gt print lt form gt print lt body gt lt htm1 gt else translate input funct
11. Element 3 while four_element_array each my_array while list key value each four_element_array print Key key Value value lt br gt Damit erhalten Sie das in Abbildung 2 2 dargestellte Ergebnis Sie k nnen deutlich sehen dass die Eintr ge 1 value 0 und key in der Ausgabe sowie 0 und 1 zusammen nur als key und value ver wendet werden sollten Beachten Sie dass jedes Paar einen Eintrag des Quell Arrays darstellt 68 Array Funktionen XY Netscape lolx Fie Edit View Go Communicator Help Key 1 Value Element 1 Key value Value Element 1 Key 0 Value 0 Key key Value 0 Key 1 Value Element 2 Key value Value Element 2 Key 0 Value 1 Key key Value 1 Key 1 Value Element 3 Key value Value Element 3 Key 0 Value 2 Key key Value 2 Document 336 u AD Ge 4 Abbildung 2 2 Riickgabewerte von each each f r ein indexiertes Array zu verwenden scheint zun chst keinen Sinn zu machen da die Elemente eines indexierten Arrays sehr viel leichter mit hilfe einer for Anweisung gelesen werden k nnen Dabei gibt es jedoch einige T cken Zun chst ist in PHP das indexierte Array nur eine Sonderform des assoziativen Arrays PHP l sst auch nicht zusammenh ngende Array Indizes zu d h Sie k nnten auch folgendes Array haben Schl ssel Index Wert 0 Landon 3 Graeme 4 Tobias 10 Till Bei diesem Array sind nur die Indizes
12. Wir halten die Entwicklung zu einer rein objektorientierten Softwareentwick lung f r ein wenig zweifelhaft Gro e Programmpakete wurden unter erheb lichem finanziellem Aufwand in Objekte umgewandelt nicht eingerechnet der erhebliche Zeitaufwand der Entwickler f r die Neukonzeptionierung Umstrukturierung und Neuinstallation von Tausenden von Programmzeilen Diese Programmpakete liefen mit prozeduraler Programmierung hervorra gend und einige von ihnen ben tigten berhaupt keine Objektunterst tzung Wir haben Werbung f r Softwaresicherheitssysteme gesehen die besagte nun komplett neu implementiert mit objektorientierter Programmierung Alles was diese Systeme taten war einen Dongle ein kleines Ger t das in den Parallelport eines PC eingesteckt wird und als Hardwareschl ssel dient zu berpr fen m glicherweise nach einem Passwort zu fragen sowie in eini gen F llen die ausf hrbaren Programme zu verschl sseln mit denen sie ver kn pft waren Die Anwendungen die sich auf diese Pakete st tzten mussten h ufig nicht einmal eine besondere Prozedur starten um die Passwort ber pr fung einzuleiten Einige wurden automatisch ausgef hrt sobald die Anwendung gestartet wurde In anderen F llen wurde die berpr fung der Umgebung auf den Aufruf einer einzelnen Funktion beschr nkt Wer braucht jedoch ein Objekt f r eine einzelne Funktion Intern war die Ausf hrung des Programmcodes streng linear und der Hardwarezugriff wurde vo
13. gt XY Netscape iof x File Edit View Go Communicator Help Looping without reset First loop Key Landon Value 1 Key Graeme Value 2 Second loop Key Tobias Value 3 Key Till Value 4 ee b Document Done 36 Jey AQ EJ Z Abbildung 2 5 Verwendung von each in Verbindung mit reset 72 Array Funktionen Netscape OF x File Edit View Go Communicator Help Looping with reset First loop Key Landon Value 1 Key Graeme Value 2 Calling reset Second loop Key Landon Value 1 Key Graeme Value 2 Document Done 36 Jey SP Ve 4 Abbildung 2 6 Verwendung von each in Verbindung mit reset Zwischen den beiden Schleifen wurde ein Aufruf von each eingef gt Die zweite Verwendung von each beginnt beim Lesen des Schl ssel Wert Paa res aus dem ersten Element Neben reset gibt es noch eine Reihe weiterer Funktionen um die Aktivit t von each aufzuteilen next prev und current Mithilfe dieser Funktio nen k nnen Sie ein Array manuell in beide Richtungen abarbeiten next gibt das aktuelle Element zur ck und setzt den internen Array Zeiger auf den n chsten Wert prev tut das Gleiche aber setzt den Array Zeiger auf den vorhergehenden Wert current gibt nur das Array Element zur ck auf wel chem der Zeiger gerade steht Diese Funktionen geben jeweils den Wert false zurtick wenn sie auf ein leeres oder nicht zugeordnetes Element treffen oder
14. hnliche Weise wie das zuvor beschriebene Array organisiert werden wobei die Schl ssel und Werte in umgekehrter Reihenfolge aufge f hrt werden my_array array Landon gt 1 Graeme gt 2 Tobias gt 3 Till gt w4 while list key value each my_array print Key key Value value lt br gt Hier wird das Array nicht tiber die Nummer sondern tiber den Namen indi ziert Wie finden Sie nun heraus welche Namen in dem Array enthalten sind wenn Sie keine vordefinierten Schl ssel verwenden Hier hilft Ihnen each wie Abbildung 2 4 zeigt XY Netscape lolx File Edit View Go Communicator Help Key Landon Value 1 Key Graeme Value 2 Key Tobias Value 3 Key Til Value 4 Abbildung 2 4 Assoziative Array Auflistung mit each Das Ergebnis ist nicht sehr berraschend trotzdem sehr n tzlich zu wissen Ein letzter wichtiger Hinweis zu each Damit Sie ein Schl ssel Wert Paar durch Iteration ermitteln k nnen muss PHP wissen auf welches Paar Sie zuletzt zugegriffen haben Wenn Sie also eine weitere Iteration mit demselben Array durchf hren werden in beiden F llen nicht dieselben Schl ssel Wert Paare zur ckgegeben Um den internen Array Z hler zur ckzusetzen m s sen Sie die Funktion reset verwenden Diese Funktion setzt den internen Zeiger von PHP wieder auf das erste Ele ment des Arrays entsprechend wird dessen Wert als Ausgabewert von reset zur ckgegeben Das folgende S
15. m x bin ein Diagramm bertragen Die Diskussion f hrte schnell in eine traditionelle Richtung Jeder fing an im gro en im wirklich gro en Rahmen zu denken anstatt die einfachen offen sichtlichen Dinge in Betracht zu ziehen Uni sono aus dem Lateinischen mit einer Stimme lautete der allgemeine Vorschlag zur L sung des Problem fol genderma en 1 Analysiere die Eingabedaten 2 Generiere eine syntaktisch analysierte Darstellung etwas in Bezug auf Compilertechniken 3 Lasse einen Prozessor ber die analysierte Darstellung laufen und erzeuge Schritt f r Schritt numerische Ausgabedaten F r unser konkretes Beispiel f x m x b s he dies folgenderma en aus 1 Sie stellen fest dass es sich um eine Funktion von x handelt in der m und b Variablen sind 2 Sie erzeugen zur einfacheren Handhabung eine Struktur um den Text der Funktion intern darzustellen z B in einer Baumstruktur welche die Abh ngigkeiten der Variablen vom Multiplikationszeichen bzw Addi tionszeichen angibt 3 Sie setzen f r x der Variablen von der die Funktion abh ngt verschie dene Werte ein ermitteln y speichern das Ergebnis und interpolieren die Daten Dies ist der in den Universit ten gelehrte Ansatz den wir bereits in komple xen Quellcodes u gesehen haben Niemand scheint sich von gewohnten L sungsans tzen frei machen und eine innovativere L sung suchen zu k n nen Haben Sie schon einmal dar ber nachge
16. sein m ssen Destruktoren kennt PHP nicht Wie jede andere Funktion k nnen auch Konstruktoren Argu mente besitzen selbst optionale Argumente sind zugelassen weitere Informa tionen zu optionalen Parametern finden Sie weiter unten im Abschnitt ber variable Argumentenlisten 83 2 Erweiterte Syntax Hinweis Seit PHP 4 0 sind fiir Kostruktoren nur skalare Werte als Parame ter zugelassen Zeichenketten ganze Zahlen usw jedoch keine Arrays oder Objekte wie es noch in PHP 3 0 der Fall war Um im vorangegangenen Beispiel einen Konstruktor hinzuzuftigen erwei tern wir den Programmcode wie folgt class shopping_cart var item_list function shopping_cart item T Shirt quantity 1 this gt pick item quantity function pick item quantity this gt item_listl item quantity function drop item quantity if this gt item_listl item gt quantity this gt item_list item quantity else this gt item_list L item 0 Der Konstruktor der in shopping_cart shopping_cart enthalten ist hat zwei optionale Argumente Wenn keine Argumente angegeben sind wird der Ein kaufswagen automatisch mit einem T Shirt vorgef llt Ansonsten erh lt er die gew nschten Eintr ge default_cart new shopping_cart this cart will fill itself w with one T Shirt by default mug_cart new shopping_cart Mug 2 this cart will contain two mugs 84 PHP und objek
17. und drop Es gibt keine M glichkeit ffentliche und private Mit glieder zu unterscheiden In PHP wird standardm ig alles auf ffentlich gesetzt was bedeutet dass Sie uneingeschr nkt auf alle Elemente und Mit gliedsfunktionen einer Klasse von au en zugreifen k nnen Dieses einfache Klassenbeispiel implementiert eine Art von Einkaufswagen wie der Name sagt mit einer Variablen die den Inhalt des Wagens in einem assoziativen Array item_list angibt sowie zwei Funktionen pick und drop mit denen Eintr ge hinzugef gt und entfernt werden Die Mitglieds funktionen sind wie regul re Funktionen deklariert mit der Ausnahme dass sie in der Klassendefinition eingebettet sind Die Klassenelemente Variablen innerhalb der Klassen werden mithilfe des Schl sselworts var definiert Hinweis In PHP k nnen Sie Klassendeklarationen und Implementierun gen nicht trennen Alle Funktionen m ssen direkt in der Klassendeklara tion implementiert werden 2 4 3 Zugriff auf Objekte Die Mitgliedsfunktionen k nnen entweder ber die alte Syntax instance gt member oder die neue Syntax instance member aufgerufen werden Auf die gleiche Weise greifen Sie auf die Elemente entweder mit instance gt property oder mit instance property zu Letztere Form eignet sich insbeson dere dazu den Konstruktor eines Elternknotens aufzurufen oder auf andere Mitglieder zuzugreifen die sich nicht im aktuellen Objekt befinden mehr
18. urspr ng lich aus den fr hen Tagen der Programmierung und wurde z T von Spiele programmierern und Virusschreibern erfunden Es begann alles mit sich selbst modifizierendem Programmcode Bei den inne ren Schleifen von Spielen beispielsweise den Prozeduren die zum Kopieren des Pufferinhalts in den Bildschirmspeicher dienten war und ist Zeit der kri tische Faktor Da die Verarbeitungszeit jedoch keine unersch pfliche Quelle war und ist mussten sich die Entwickler etwas einfallen lassen um das Beste aus ihrem Werk herauszuholen H ufig mussten in der innersten Schleife eine Reihe von Entscheidungen getroffen werden Wenn beispielsweise die Kopierroutine des Puffers bei bestimmten Ereignissen nur jede zweite Zeile in den Bildschirmspeicher aus geben sollte mussten Sie ein paar if then Konstrukte in einen Programm teil einbetten der diese am wenigsten ben tigte Diese Konstrukte kosteten 118 Polymorphisierung und selbstmodifizierender Code wertvolle Verarbeitungszeit und da diese innerste Routine etwa 80 der gesamten Verarbeitungszeit ausmachte bedeute eine Halbierung dieser Ver arbeitungszeit durch Entfernen dieser Konstrukt eine 40 ige Steigerung der verfiigbaren Rechenkapazitat F r jeden Fall eine Reihe von Routinen zu schreiben w re auch nicht sehr hilfreich gewesen Sie h tten trotzdem Speicherplatz verschwendet und die Entscheidungen nur an eine andere Stelle verschoben Sie k nnen damit zwar die Gesamtle
19. var2 2 y_object gt var3 3 new_object my_object new_object gt varl 3 new_object gt var2 2 new_object gt var3 1 print My object goes my_object gt varl my_object gt var2 wtmy_object gt var3 lt br gt print New object goes new_object gt varl new_object gt var2 new_object gt var3 lt br gt 76 PHP und objektorientierte Programmierung Was glauben Sie wird hier als Ergebnis herauskommen Das Skript deklariert zun chst eine Klasse erzeugt eine Instanz davon und weist seinen drei Ele menten Werte zu Anschlie end erzeugt es eine neue Referenz auf dieses Objekt weist seine Elemente neu zu und gibt jedes Element aus wobei es beide Referenzen verwendet Bedenken Sie es handelt sich um eine Instanz Abbildung 2 7 zeigt das Ergebnis XY Netscape Ol x File Edit View Go Communicator Help My object goes 1 2 3 New object goes 3 2 1 JERS ay Abbildung 2 7 Erzeugen einer Kopie anstelle einer Referenz mit PHP Wenn Sie jetzt nicht tiberrascht sind kennen Sie PHP bereits recht gut oder haben noch nicht intensiv genug ber Objekte nachgedacht PHP hat nicht einfach eine neue Referenz von my_class erzeugt sondern eine Kopie Dies ist nicht das gew nschte Verhalten da der Operator new eigentlich im Speicher bereich eine Instanz von my_class erzeugen und einen Verweis auf diesen zur ckgeben sollte Wenn Sie diese Referenz einer anderen Variablen zuord nen
20. werden um assoziative Arrays zu verarbeiten 101 2 Erweiterte Syntax Indizierte Arrays sind in PHP nur eine Sonderform der assoziativen Arrays Wenn Sie unset auf eines der Elemente in einem indexierten Array anwen den bleiben alle anderen Elemente und ihre Reihenfolge unber hrt jedoch entsteht ein unzusammenh ngendes Array Einzelheiten hierzu finden Sie in den bereits besprochenen Abschnitten ber 1ist und each 2 6 1 Mehrdimensionale Arrays Wie der Name vermuten l sst besitzen mehrdimensionale Arrays mehr als eine Dimension Eindimensionale Arrays haben die folgende Form die f r Arrays wohl am bekanntesten ist my_arrayLO 1 my_arrayLl 717 my_arrayL2 45 Um diesem Array Typ zu indizieren brauchen Sie nur einen Index der die Anzahl der m glichen Werte auf den Bereich dieses Index begrenzt H ufig ist es jedoch sinnvoll mehrdimensionale Arrays zu erzeugen wenn Sie kom plexe Datens tze verwalten Typische Beispiele hierf r sind Bitmaps und Bildschirmpuffer Wenn Sie auf Ihren Bildschirm blicken sehen Sie zumin dest heutzutage eine zweidimensionale Projektion Ihres Desktops Die Fens ter Bitmaps Befehlszeilen Cursor Zeiger alles ist zweidimensional Um diese Daten auf bequeme Weise darzustellen k nnten Sie nat rlich alles in Arrays mit einer einzigen Dimension zusammenfassen Es ist jedoch passen der Arrays zu verwenden welche dieselbe Anzahl von Dimensionen haben wie die Eingabedate
21. 0 3 4 und 10 in Gebrauch der Rest ist einfach nicht zugeordnet Mithilfe der Funktion count welche die Anzahl der zugeordneten Elemente in einem Array zur ckgibt erhalten Sie zwar vier korrekt zugewiesene Elemente aber Sie k nnen keine for Anweisung f r dieses Array verwenden da Sie die entsprechenden Schl ssel f r die Werte nicht kennen my array array 0 gt Landon 3 gt Graeme 4 gt Tobias 10 gt w Till for i 0 i lt count my_array i print Element i my_arrayL il lt br gt 69 2 Erweiterte Syntax Damit erhalten Sie die in Abbildung 2 3 gezeigte Ausgabe XY Netscape Ol x File Edit View Go Communicator Help Element 0 Landon Element 1 Element 2 Element 3 Graeme Abbildung 2 3 Ungiiltiger Zugriff auf ein nicht zusammenhdngendes Array Fehlerberichterstattung Wenn Sie PHP so eingerichtet haben dass es ungiiltige Array Indizes anzeigt werden auch ein paar Warnungen ausgegeben Es empfiehlt sich wahrend der Entwicklung eine m glichst hohe Ebene f r die Fehlerberichte zu w hlen Eine einfache for Schleife reicht f r Arrays dieser Art nicht aus denn diese Schleife greift auf Indizes zu denen noch kein Wert zugewiesen ist Wenn PHP eine enger definierte Umgebung bereitstellt w rde dies zum Programm abbruch und sofortigen Beendigung des Skripts f hren Wenn Sie den Inhalt und die Konsistenz Ihrer Arrays also nicht genau kennen sollten Sie each tu
22. 2 Variable Argumente Bei der Verwendung von Funktionen ist es h ufig notwendig mehr als einen Wert zur ckzugeben oder die gegebenen Parameter zu ndern fsockopen gibt beispielsweise als R ckgabewert den Sockel Bezeichner zur ck denkbar w re jedoch auch die Ausgabe eines Fehlercodes mit beschreibendem Text z B bei potentiellen Fehlern try to open a socket for HTTP with a 30 second timeout socket_handle fsockopen www myhost com 80 error_nr error_txt 30 if socket_handle print Couldn t connect to HTTP host lt br gt print Error code error_nr Reason error_txt lt br gt Wenn eine Verbindung zum gew nschten Host nicht errichtet werden konnte gibt dieser Code einen Fehlercode und den Fehlergrund aus Die Variablen wurden urspr nglich als Parameter an fsockopen bergeben Da diese Para meter in der fsockopen Deklaration jedoch als durch Referenz weitergege ben deklariert sind kann fsockopen sie modifizieren und die Anderungen anschlie end global zur Verf gung stellen 103 2 Erweiterte Syntax In der Regel greifen Funktionen auf ihre Parameter nicht durch Referenz zu Wenn sie ihre Werte w hrend der Programmausf hrung ndern arbeiten sie mit einer lokalen Kopie des urspr nglichen Wertes function calculate a b c a b c i 1 j 2 k 3 print I i J j K k lt br gt calculate i j k print I i J j K k lt br gt B
23. Erweiterte Syntax Die Welt wurde aus der Leere gebildet wie Utensilien aus einem Holzblock Der Herr kennt die Utensilien h lt sich jedoch an den Block damit kann er alle Dinge benutzen Wie in Kapitel 1 erw hnt glauben wir dass wir zur wirklichen Beherrschung einer Programmiersprache nicht nur deren Syntax und Semantik verstehen m ssen sondern auch ihre Philosophie den Hintergrund und die Haupt merkmale der Struktur Um PHP zu meistern m ssen Sie auch alle seine Eigenheiten gut kennen 2 1 PHP Syntax PHP ist eine Mischung aus verschiedenen Sprachen Sie k nnen einen starken Einfluss von C erkennen einige sagen Java aber Java ist auch aus C entstan den W hrend die Syntax von PHP stark durch C beeinflusst ist unterschei det sich die PHP Semantik von der von C sehr stark PHP wird interpretiert und hat keine strengen Variablentypen Wenn Sie auf eine Variable referenzie ren wird sein Typ im Vor bergehen ermittelt und so behandelt wie es die gegenw rtige Situation erfordert Dies ist zwar eine etwas vereinfachte Erkl rung Sie sollten sie aber w hrend der Entwicklung im Hinterkopf behalten PHP ist eine interpretierte Sprache in welcher der Programmcode ausgewer tet und Schritt f r Schritt ausgef hrt wird Zusammen mit der Art und Weise wie PHP Variablen verwaltet erhalten Sie damit vielf ltige M glichkeiten f r die Programmierung jedoch auch eine Menge Fallen Dieses Kapitel befasst sich mit den ty
24. Knoten von dem Baum abtrennen ihn als frei mar kieren bevor Sie alle anderen Knoten ge ndert haben die auf diesen Knoten referenzieren Auch dies l sst sich durch eine strenge berpr fung der Bibliotheksfunktio nen und die Speicherbereinigung beseitigen 92 Verkn pfte Listen Unterbrochene Verbindung Freigegebener Knoten Abbildung 2 11 Unterbrochene Verkn pfungen in einer Baumstruktur tree_link_left und tree_link_right verkn pfen einen linken bzw rechten Tochterknoten indem sie den zugeh rigen Handle den Eigenschaften idx_ left und idx_right in der Knotenstruktur zuordnen Sie finden die Gegen parts in tree_get_left und tree_get_right Diese lesen den Handle der lin ken bzw rechten Verkn pfung des Knotens aus Zus tzlich ermittelt tree_get_ parent den Elternknoten eines Unterknotens Um den Inhalt in der Baumstruktur zu speichern und Daten aus ihr auszule sen k nnen Sie tree_assign_node_contents und tree_retrieve_node_ contents verwenden Auch hier ist der dynamische Charakter von PHP hilf reich da wir unsere Knoten nicht auf bestimmte Datentypen festlegen m ssen Es ist inzwischen in C allgemein blich Instanzen mithilfe von Klassenvorlagen zu erzeugen die z B Baumklassen nur f r ganze Zahlen generieren Sie k nnten zwar unz hlige Baumstrukturen f r eine beliebige Anzahl von Datentypen entwerfen doch dynamisch eingegebene Inhalte k nnen mit dieser Methode
25. Mithilfe definierter Werte l sst sich diese Arbeit auf eine einzelne Programm zeile reduzieren Die Namen der definierten Werte sollten stets in Gro buchstaben geschrieben werden um sie als solche zu kennzeichnen In einigen F llen wie bei Biblio theksfunktionen sollte ihnen au erdem ein Pr fix vorangestellt sein Im vor angegangenen Beispiel haben die Bezeichner das Pr fix FT_ f r file type Dateityp Versuchen Sie definierte Werte so h ufig wie m glich einzusetzen Wenn Sie auf eine Situation treffen in der Sie normalerweise einen Wert in Ihr Pro gramm fest eingeben w rden sollten Sie bedenken dass die Eingabe von fixen Werten unvorteilhaft ist Betriebssysteme oder hnliche maschinencode orientierte Programme haben h ufig die l ngsten Definitionslisten denn um sie portabel zu gestalten muss jede Kleinigkeit abstrahiert werden Sie k n nen keine Annahmen ber die Byte Gr e die Wortl nge oder die Register gr e machen im Prinzip muss alles was Sie sehen auf irgendeine Weise abstrahiert werden Da PHP per se portierbar ist bedeutet dies dass es an keine bestimmte Hardware oder andere Umgebungskonfigurationen gebun den ist sein Interpreter ndert die Umgebung nicht wie auch immer das zugrunde liegende Betriebssystem aussehen mag Daher brauchen Sie mit Definitionen in PHP nicht bertreiben Aber ein gutes Ma zeugt von guten Programmierstil 65 2 Erweiterte Syntax 2 3 Array Funktionen
26. T_MAX 100 define PLOT_STEP 0 5 define DIAGRAM_HEIGHT 300 define DIAGRAM_HORIZON 150 function parse_function in_string define a custom function header header header header function calculate req_code x n header header n header header eval req_code n define a custom function footer footer n n convert all characters to PHP variables out_string ereg_replace La zA Z 1 in_string prepend header create equation and append footer out_string header return out_string n footer 121 return return ou function creat export global co result t_string e_image this variable lor_plot 2 Erweiterte Syntax we calculate the X scale based on the plot parameters the diagram height is fixed as we do not check for the function s extreme points width P height image allocat color_bac color_gri color_plo clear i wbackgr draw ax imageline imageline w color_g print s imagestrin worid imagestrin w color_g return return i LOT_MAX PLOT imagecreate wi e colors DIAGRAM_HEIGHT _STEP dth height gr imageco age es image 0 0 orallocate image 255 255 255 d imagecolorallocate image 0 0 0 t imagecolorallocate image 255 0 0 imagefilledrectangle image 0 0
27. Tochterknoten mit einem anderen Knoten Gibt den Elternknoten des angegebe nen Knoten zur ck Gibt den linken Tochterknoten des an gegebenen Knotens zur ck Gibt den rechten Tochterknoten des an gegebenen Knotens zur ck 90 Verkn pfte Listen Funktion Beschreibung int tree_assign_node_contents Weist dem Inhaltsbeh lter eines array tree int handle mixed Knotens Daten zu contents mixed tree_retrieve_node_contents Liest Daten aus dem Inhaltsbeh lter array tree int handle eines Knotens aus Wenn Sie m chten k nnen Sie hier weitere Funktionen hinzuf gen Die Bibli othek hat beispielsweise noch keine Funktionen um B ume zu vermischen tote Knoten zu entdecken Knoten die zwar im Array vorhanden aber vom Hauptbaum abgeschnitten sind und auf die somit nicht mehr zugegriffen werden kann usw Dieser Code eignet sich hervorragend zum Experimentie ren und Lernen Die Bibliothek ist recht einfach tree_create erzeugt ein neues Array f r die Baumstruktur und initialisiert das erste Element als Stammelement Alle Referenzen auf andere Knoten sind ganzzahlige Indizes innerhalb des Arrays siehe idx_up idx_left und idx_right in der Quelle 1 markiert eine gerade verwendete Referenz Wenn ein Knoten beispielsweise keinen linken Tochter knoten hat enthielte idx_left die Angabe 1 Um zu markieren ob ein Ele ment selbst in Gebrauch ist oder nicht d h ob ihm Daten zugewiesen sind wi
28. Wenn Sie einen geschlossenen Parser generieren der nur eine der beiden Kodierungen erkennt l sst sich dieser nur schwer erweitern Sobald Sie neue Formate ben tigen stecken Sie fest Dies ist ein klassischer Fall f r variable Funktionsnamen function decode_base64 encoded_data do something with the encoded data return decoded_data function decode_uuencoded encoded_data 116 Assoziative Arrays do something with the encoded data return decoded_data mail_text fetch_mail encoder_type determine_encoding mail_text returns base64 for wBase64 returns uuencoded for UUEncoded decoder decode_ encoder_type decoded_data decoder mail_text Dieser Programmcode stellt automatisch die korrekte Bearbeitungsroutine f r die Eingabedaten fest determine_encoding gibt die Zeichenfolge zur ck die den zu entschl sselnden Datentyp angibt f r den eine entsprechende Funktion vorhanden sein muss Der Name der aufzurufenden Funktion wird dann in decoder geschrieben und sofort aufgerufen Der Nachteil dieses Verfahrens ist dass es nicht sehr sauber ist Sie werden kaum ein Standard verhalten feststellen Das Entschl sselungsverfahren ist vollst ndig dynamisch und k nnte zusammenbrechen wenn determine_ encoding ein bedeutungsloses Ergebnis erzeugt Es ist jedoch eine recht kom fortable Art und Weise Eingabedaten zu verarbeiten Sobald neue Kodie rungstypen ers
29. ach Ihren Bed rfnissen verwal tet Testen Sie die Bibliothek ausf hrlich und stellen Sie sicher dass sie korrekt arbeitet Das erspart Ihnen fehlerhaften Programmcode zu suchen der auf Ihre Listen auf falsche Weise zugreift und diese m glicherweise zerst rt 2 5 1 Verkn pfte Listen und Baumstrukturen ein Arbeitsansatz Wie bereits erw hnt empfiehlt es sich f r Ihre Bed rfnisse eine absturz sichere Bibliothek zu erstellen eine die sich einfach erweitern l sst und alle f r die Aufgabe erforderlichen Informationen bereitstellt Im Folgenden 88 Verkn pfte Listen m chten wir ein Beispiel aus der Praxis vorstellen eine Bibliothek die wir zur Verwaltung von Baumstrukturen entwickelt haben und die auch mit PHP 3 0 arbeitet Den vollst ndigen Quellcode finden Sie auf der CD ROM Die Bibliothek kann doppelt verkn pfte Baumstrukturen mit zwei Tochter knoten pro Blattknoten handhaben wobei jeder Knoten einen Inhaltsbeh lter f r gemischte Variablen hat Jede Aktion die sich mit der Baumstruktur durchf hren l sst wurde in die Anwendungsprogrammierschnittstelle ein gebaut Sie erhalten zwei separate Einheiten die Baumstruktur und den auf sie zugreifenden Programmcode Dies ist genau der Grund warum diese Baumstruktur mit PHP 3 0 funktio niert auch wenn dies scheinbar in Widerspruch zu dem zuvor Gesagten steht Die Baumstruktur basiert nicht auf Zeigern sondern auf Arrays Da PHP dynamische Arrays unterst tzt i
30. ch Packen dieser Daten in Bits erreicht werden kann Was sich hier zeigt ist dass die Speicherung der Daten wie vorliegend nicht unbedingt sinnvoll ist Wenn Sie die Daten jemandem zum Niederschreiben diktieren sollten w rden Sie es nicht als Eins Eins Eins Eins Eins Eins Eins Eins Null Null Null Null Null Null Eins Eins Eins vorlesen son dern w rden dem Schreiber zwanzig Einsen eine weitere Eins achtzehn Nullen diktieren Das Gleiche macht auch der RLE Algorithmus der die Anzahl der aufeinan derfolgenden Elemente gleichen Wertes z hlt und sie anschlie end als Z h ler Wert Paar abspeichert Nach der Komprimierung k nnten die obigen Daten dann folgenderma en aussehen 21g be 183 00 25 15 18 0 D2 45 1850572151 Das erste Element gibt stets den Z hler an w hrend das zweite Element das Datenelement darstellt Um dies wieder zu dekomprimieren m ssen Sie lediglich den Z hler lesen und das folgende Datenelement so h ufig ausge ben wie es der Z hler angibt Mit diesem Trick reduzieren Sie die Anzahl der ben tigten Elemente von 200 auf 34 Das Problem bei diesem Algorithmus ist dass er bei vielen verschiedenen Ele menten in einer Zeile mehr Ausgabedaten erzeugt als urspr nglich Eingabe daten vorhanden waren Durch Speichern vieler Elemente die einen Daten z hler von Eins haben wird dieser Algorithmus damit schnell ineffektiv Diese Schw che l sst sich mit einem klein
31. cheinen brauchen Sie nur eine Funktion mit passendem Namen zu erzeugen und determine_encoding anzupassen um die entspre chende Zeichenfolge zu erhalten Solange Sie determine_encoding absturzsicher gestalten so dass es eine sinn volle Zeichenfolge zur ckgibt selbst wenn es nur ein Dummy ist sind wir mit dieser Methode vollkommen einverstanden Solange Sie sicherstellen k nnen dass Ihr Skript sich w hrend der gesamten Laufzeit in einem defi nierten Status befindet ist nichts dagegen einzuwenden diese dynamische Datenverwaltung f r Produktionsumgebungen einzusetzen Ein realistisches Beispiel eines Skripts das extensiven Gebrauch von variab len Funktionsnamen macht ist phpIRC das wir im folgenden Kapitel bespre chen werden phpIRC ist eine IRC Schicht f r PHP die ber eine benutzer freundliche APl einen Zugriff auf IRC Internet Relay Chat Netzwerke bietet Da die Verwaltung der Eingabedaten nicht linear ist und vollst ndig vom Benutzer abh ngt verwendet phpIRC f r jedes ankommende Paket eine Reihe von Ereignisklassifizierungen Der Benutzer kann f r jedes Ereignis in phpIRC Bearbeitungsroutinen installieren die auf jede Art von ankommen den Daten angemessen reagieren phpIRC speichert die Namen der R ck ruffunktionen in einem internen Array Sobald Daten ankommen durchsucht 117 2 Erweiterte Syntax es sein R ckruf Array nach Funktionen die auf diesen entdeckten Datentyp passen und ruft alle passenden Funk
32. count assign it count ord data_element try to retrieve the data element itself if read in re coun in retur from_input value put data is corrupted turn zero count t 0 dicate failure n 0 return success return 1 function decode_data initialize output arr decompress while get_enc for i output array ay all data into the array oded_pair amp count amp value 0 i lt count i 109 2 Erweiterte Syntax outputl value return output Listing 2 4 Der RLE Expandierungsalgorithmus this declaration must exist and be equal both for the compressor and decompressor define COUNTER_THRESHOLD 32 this tool function is needed for both the compressor and decompressor to read data function read_from_input amp data_element This is a dummy function to retrieve a data element from the input data It could contain code to read from an array from the standard input or something completely different AS an example this function reads from a global file Not a good idea to have global files but just for the example s sake global file_handle check if we have reached the end of the file if feof file_handle we did return error return 0 we did not encounter the end of the file so read n
33. d diesem 257 Elemente zuweisen k nnen Aber was w re wenn Sie pl tz lich ein weiteres Element ben tigten Sie m ssten einen neuen Speicherbe reich zuweisen den alten Inhalt des Arrays kopieren und den alten nunmehr nicht mehr verwendeten Speicherbereich freigeben PHP verfolgt einen anderen Ansatz Da PHP keine typischen Variablendekla rationen kennt nur Typdefinitionen werden neue Variablen quasi im Vor bergehen zugewiesen Sobald Sie eine neue Variable generieren indem Sie ihren Namen in den Namensraum einf gen schaffen Sie einfach Speicher platz der an diesen Namen gebunden ist nichts weiter Die Art der Daten die in diesem Speicherbereich abgelegt werden ist nicht auf einen bestimmten Variablentyp beschr nkt Die Datentypen k nnen jederzeit neu interpretiert werden ihre Gr e kann ver ndert werden sie k nnen neu zugewiesen wer den und vieles mehr Betrachten wir uns folgendes Beispiel my_var 1 my_var Used to be an integer my_var array Oh well I like arrays better Die erste Zeile erzeugt eine neue Variable my_var PHP wird feststellen dass ihr eine ganze Zahl zugeordnet wird und setzt daher den urspr nglichen Typ von my_var auf ganze Zahl Die zweite Zeile berschreibt den Inhalt von my_ var mit einer Zeichenkette Bei einer konventionellen Programmiersprache w rde dieses bei der Kompilierung zu einem Fehler f hren oder zumindest zu einem Programmabbruch w hrend der Laufzeit PHP
34. dacht was PHP tut wenn es ihre Skripte interpretiert 1 Es analysiert die eingegebenen Quelldaten 2 Es erzeugt eine analysierte Darstellung 3 Es l sst einen Prozessor ber die analysierte Darstellung laufen 120 Polymorphisierung und selbstmodifizierender Code Gut die ist etwas vereinfacht aber im Grunde genommen ist es das was wir brauchen Warum sollten wir also die Eingabefunktion nicht in einen g ltigen PHP Code umwandeln und dann PHP die Arbeit f r uns machen lassen Wie Sie bereits in diesem Kapitel gesehen haben unterst tzt PHP dynamisches Programmieren so dass sich die gesamte Aufgabe m glicherweise recht ein fach bew ltigen l sst Tats chlich sind die regul ren Ausdr cke die zur Umwandlung einer einfa chen mathematischen Funktion in PHP Code ben tigt werden extrem ein fach Wenn wir davon ausgehen dass alle Variablen aus einem einzelnen Zei chen bestehen und nur in PHP zul ssige mathematische Operatoren verwendet werden usw l sst sich die Aufgabe in einer einzigen Zeile realisieren php_code ereg_replace Ca zA Z 1 input_function Diese Zeile wandelt m x bin m x b um Wenn wir diesen regul ren Ausdruck in ein wenig Programmcode einbetten und ein paar vereinfachende Annahmen machen k nnen wir sehr schnell einen dynamischen Funktions plotter erstellen wie Listing 2 6 zeigt define global constants define PLOT_MIN 0 1 define PLO
35. des RLE Prozessors Dieses Beispiel zeigt sehr sch n wie der Dekodierer und die Leserlogik in kleinere separate Funktionen unterteilt werden k nnen Der eigentliche Dekodierer ist nur noch wenige Zeilen lang Die Funktion welche die Einga bedaten liefert kann vom Rest des Programmcodes abgetrennt werden und auch der Entscheidungsalgorithmus der zwischen reinen und kodier ten Daten unterscheidet ist eine separate kleine und leicht zu verstehende Funktion Eine clevere Methode ist reine Daten mit einem Z hler von 1 zur ckzugeben so dass sich die Dekomprimierungsschleife nicht mehr mit ihnen befassen muss Sie kann die gelieferten Daten einfach unver ndert in das Ausgabe Array schreiben Die Fehlerkontrolle k nnte zwar noch etwas verbessert werden aber dies berlassen wir dem Leser Es ist nicht sonderlich schwer Variable Argumentenlisten Variable Argumentenlisten die h ufig auch als optionale Parameter bezeich net werden geben Ihnen die M glichkeit Funktionsparameter mit einem Standardwert vorzubelegen Wenn der Anrufer keinen Wert f r das Argu ment angibt wird das Standardargument angenommen Dem Anrufer kann eine Liste mit optionalen Parametern zur Verf gung gestellt werden die er verwenden kann aber nicht muss Optionale Parameter sind wie folgt definiert function open_http_connection hostname port 80 timeout 10 socket fsockopen hostname port timeout rest of the code goes he
36. eide Druckanweisungen geben denselben Inhalt aus Wahrend calculate bei der Programmausf hrung a modifiziert ndert sich der Inhalt von i nicht obwohl er als Argument f r den Parameter a bergeben wurde Dies liegt daran dass calculate nicht mit der Variablen selbst sondern mit einer Kopie der ursprtinglichen Variablen arbeitet Sobald die Funktion beendet ist wird die Kopie der Variablen verworfen mit welcher die Anweisung gearbei tet hat und der Inhalt geht verloren Wie im Falle von fsockopen kann es manchmal wtinschenswert sein die an einem Parameter vorgenommene Anderung zu speichern und sie global zur Verf gung zu stellen Damit dies m glich wird muss die Variable jedoch nicht als Kopie sondern als Referenz bergeben werden Damit erh lt die Funktion einen Zeiger auf den Speicherblock in dem die urspr ngliche Vari able abgelegt ist Mithilfe dieses Zeigers kann die Funktion auf die globale Instanz der Variablen zugreifen und diese direkt ndern function calculate amp a b c a b c i 1 j 2 k 3 print I i J j K k lt br gt calculate i j k print I i J j K k lt br gt 104 Assoziative Arrays Wie Sie hier sehen ist hier nur ein Zeichen anders das Ampersand amp das im vorherigen Programmcode fehlte Dieses einem Funktionsparameter voran gestellte Zeichen gibt an dass er per Referenz bergeben wurde Hinweis Um ein Ampersand amp einzu
37. eine sehr begrenzte WORM hnliche Verwen dung der verkn pften Listen m glich einmal schreiben mehrfach lesen Ver kn pfte Listen k nnen erzeugt aber nicht ver ndert werden Wenn Sie versu chen ein Element in der Liste zu ndern verlieren Sie die Referenz auf alle folgenden Elemente in der Liste Aus demselben Grund l sst sich auch die Reihenfolge der Elemente nicht ver ndern Doppelt verkn pfte Listen lassen sich in PHP 3 0 ebenfalls nicht realisieren zumindest haben wir es nicht geschafft wobei wir einige Stunden mit Fehler suche und Behebung zubrachten bevor wir aufgegeben haben Da jeder Knoten eine neue Kopie des Listenendes ben tigte mit dem es verkn pft ist m ssten Sie eine Vielzahl redundanter Listen mit demselben Inhalt erstellen nur um die Funktion ein Element zur ckgehen zu erm glichen PHP 4 0 das echte Referenzen unterst tzt hat diese Einschr nkungen nicht Listen k nnen beliebig erzeugt und neu zusammengestellt werden selbst doppelt verkn pfte Listen Beachten Sie jedoch dass es nicht ganz einfach ist zwischen Referenzen und den tats chlichen Kopien von Listenelementen zu unterscheiden Ein Motto von Programmierern konventioneller Programmiersprachen lau tet H te dich vor freien Zeigern Wir m chten dieses f r PHP modifizieren H te dich vor redundanten Kopien Wenn Sie mit Listen arbeiten erstellen Sie eine absturzsichere Bibliothek die auf m glichst allgemeine Weise Ihre Daten n
38. en Durchlauf durch die Datei wird sich die erste Zeile 4ndern und die Anzahl der Treffer angeben die es fiir die Datei bisher gab Hinweis Gleichzeitige Zugriffe mehrerer Anrufer kann dieses Programm nur schwer bew ltigen Es k nnte vorkommen dass zwei PHP Prozesse die Datei zur selben Zeit lesen und gleichzeitig in sie schreiben was zu einem falschen Trefferzahler f hren w rde In einer Umgebung mit umfangreichem Datenverkehr sollten Sie diese Technik nur mit entspre chenden Verarbeitungssperren einsetzen 2 8 Zusammenfassung In diesem Kapitel haben Sie eine Menge ber die erweiterte Syntax von PHP und gute Programmierpraktiken erfahren Wir haben Ihnen gezeigt wie Sie Konstanten mit define erzeugen Anschlie end sind wir auf die kniff ligeren Aspekte von Arrays eingegangen und haben Ihnen erkl rt dass Sie list each zur Abarbeitung von Hash Codes verwenden sollten Wir erl uterten die Funktionen der objektorientierten Programmierung in PHP zeigten wie und wann Sie diese verwenden und sagten Ihnen wann Sie bes ser bei der prozeduralen Programmierung bleiben sollten Da PHP eine inter pretierte Sprache ist l sst sie viele Funktionen zu die sich in konventionell 127 2 Erweiterte Syntax kompilierten Programmiersprachen nur schwer implementieren lie en vari able Variablen und Funktionen selbstmodifizierender Code und Laufzeitaus wertung von Quellcode Mit diesem Wissen sind Sie gut ger stet f r die erweit
39. en Trick der sogenannten Z hler schwelle umgehen Jeder Datentyp hat einen spezifischen Z hlerbereich Im obigen Fall berschritt der Z hler beispielsweise niemals 21 Genaugenom men waren die h ufigsten Werte 18 und 2 Wenn wir den Z hler nun auf einen Bereich von 1 bis 31 beschr nken k nnen wir auch reine Zahlen ein f gen die keine Komprimierung im Eingabestrom ben tigen Der Kompres 106 Assoziative Arrays sor spuckt alle Eingabedatenelemente gr er als 31 einfach aus ohne ihnen einen Z hler voranzustellen Damit errei er als 31 einen 100 optimalen Algorith chen wir f r alle Eingabewerte gr mus Alle Werte bis 31 werden zwar immer noch nicht optimal komprimiert aber dies ist vernachl ssigbar Um die Daten zu dekodieren ist es nun wichtig zwischen reinen Datenele menten und komprimierten Datenelementen zu unterscheiden was Sie auch in den Listings 2 3 2 4 und 2 5 sehen k nnen Hier kommen variable Argu mente optimal zum Einsatz function encode_data do initial setup on our variables current_count 0 status read_from_input current_byte old_byte current_byte output array as long as there s input data loop while status check if the current byte matches the last one if ol d_byte current_byte there s a match increase co current_count does the counter exceed the if current_count COUNTER_TH
40. erte PHP Programmierung und einen gro en Schritt weiter auf Ihrem Weg zum PHP Experten 128
41. ext element data_element fgetc file_handle return success return 1 include compressor and decompressor include compressor php3 110 Assoziative Arrays include decompressor php3 define filenames original_file data original compressed_file data compressed decompressed_file data decompressed gt all procedures need the global variable file_handle bad practice but best for a simple example open input file file_handle fopen original_file r if file_handle die Error opening file encode it output encode_data close input file fclose file_handle open output file file_handle fopen compressed_file w if file_handle die Error creating file write decoded data for i 0 i lt count output i fputs file_handle output i close output file felose file_handle open input file file_handle fopen compressed_file r if file_handle die Error opening file decode it output decode_data close input file fclose file_handle open output file file_handle fopen decompressed_file w 2 Erweiterte Syntax if file_handle die Error creating file write decoded data for i 0 i lt count output i fputs file_handle outputl iJ close file fclose file_handle Listing 2 5 Beispiel fiir die Verwendung
42. f gen m ssen Sie nicht die Zeile ndern in welcher die Funktion aufgerufen wird PHP wandelt Ihre Para meter automatisch in Referenzen um wenn es eine Funktion findet die Parameter auf diese Weise bergeben m chte Bei der nderung von a durch calculate wird die lokale Kopie von i demnach nicht ver ndert statt dessen wird durch den Zugriff auf den globale Speicher von i die nderung direkt durchgef hrt Viel wichtiger ist aber dass die nderungen die an i vorgenommen wurden bei Beendigung der Funktion nicht verloren gehen was beim Arbeiten mit einem lokalen Speicher nicht funktioniert Die Parameter bergabe durch Referenz ist h ufig eine n tzliche Methode wenn Sie mit einer Funktion mehr als einen Wert ausgeben m chten oder Ihre Variablen durch mehrfachen Aufruf einer Funktion auf einmal ndern wol len um eine komplexe Berechnung in einem Durchgang durchzuf hren Sie sollten es jedoch vermeiden Strukturen aufzusplitten und in Parameterlisten zu zw ngen wenn Sie die Daten genauso gut direkt in einer Struktur zur ck geben k nnten berstrapazieren Sie diese Art von Parameter jedoch nicht Diese Ma nahme sollte wirklich eine Ausnahme bleiben denn sie ist keine ganz saubere Programmierpraxis Funktionen ndern ihre Parameter norma lerweise nicht auf globaler Ebene und dadurch schleichen sich manchmal h ssliche Fehler ein auch wenn es die Dinge h ufig erleichtert und Sie damit clevere Tricks anwenden k n
43. gt dies von Ihren Zielen und der Plattform ab auf der Sie arbeiten In unserem Fall ist die Plattform PHP PHP unterst tzt nat rlich Objekte jedoch auf eine sehr spezielle Weise Dies h ngt damit zusammen wie der Interpreter Variablen handhabt 75 2 Erweiterte Syntax Sobald PHP auf eine Anweisung trifft f r die ein Schreibzugriff auf eine Vari able ben tigt wird wertet es die Daten aus die in die Variable geschrieben werden berechnet sie kopiert diese und weist das Ergebnis dem Ziel speicherbereich zu Diese Beschreibung ist zwar etwas vereinfacht vermittelt Ihnen aber das Grundprinzip some_var 2 my_var some_var 3 new_var some_var my_var Laut diesem Skript wird PHP einen Speicherbereich f r some_var erzeugen und 2 hineinschreiben einen Speicherbereich f r my_var erzeugen den Wert von some_var ausle sen ihn mit 3 multiplizieren und das Ergebnis dem neu angelegten Speicherbereich zuordnen einen Speicherbereich f r new_var erzeugen die Werte von some_var und my_var auslesen sie zusammenz hlen und sie wieder in den neuen Speicherbereich zur ckschreiben Dies klingt alles sehr sch n und logisch es handelt sich jedoch um einfache Typen mit denen Sie bereits viele Male gearbeitet haben Dies sieht ganz anders und unlogisch aus sobald PHP mit Klassen zu tun hat class my_class var varl var2 var3 y_object new my_class y_object gt varl 1 y_object gt
44. hr RAM und jedes Array Element stellt einen der drei Baumknoten dar Die Zeiger werden in diesem Array zu Indizes und die Referenzierung erfolgt einfach durch Auslesen des korrekten Elements aus dem Array Mithilfe von Arrays k nnen Sie viele RAMs erzeugen ihre Gr e erh hen oder verringern ber sie als Ganzes oder nur ein einzelnes Element verf gen alles in allem eine sehr komfortable Methode zur Speicherverwaltung Wenn Sie dies alles in einer soliden Bibliothek integriert haben besitzen Sie ein sch nes Werkzeug 89 2 Erweiterte Syntax Abbildung 2 9 zeigt wie die Baumbibliothek die Baumknoten in einem Array intern verwaltet Abbildung 2 9 Array das eine Baumstruktur enth lt Die Bibliothek besteht aus den folgenden Funktionen Funktion Beschreibung array tree_create int tree_allocate_node array tree int tree_free_node array tree int handle int tree_link_left array tree int link_to int child int tree_link_right array tree int link_to int child int tree_get_parent array tree int handle int tree_get_left array tree int handle int tree_get_right array tree int handle Erzeugt einen neuen Baum Ordnet in der Baumstruktur einen neuen Knoten zu Gibt einen Knoten in der Baumstruktur frei Verkn pft einen Knoten als linken Toch terknoten mit einem anderen Knoten Verkn pft einen Knoten als rechten
45. ibliothek 2 6 Assoziative Arrays Eine weitere grundlegende Struktur der Programmiersprachen stellen Arrays dar Sie bieten die M glichkeit einen festen Satz oder eine Sammlung von Daten desselben Datentyps zu speichern wodurch die Elemente in ihrem Datensatz ber einen eindeutigen Schl ssel indexierbar werden In typischen konventionellen Programmiersprachen werden Arrays auf folgende Weise verwaltet int my_integer_array 256 allocate 256 integers in this array Dieser Ausschnitt eines C Programmcodes deklariert ein Arrray namens my_ integer_array das 256 ganze Zahlen enth lt Sie k nnen jede dieser ganzen Zah len adressieren indem Sie das Array mit einer Ordnungszahl indexieren wobei die Zahl in diesem Fall zwischen 0 und 255 liegen muss C beginnt die Z hlung bei 0 die Zahl in der Array Definition gibt die Anzahl der ganzen Zahlen an die verf gbar sein sollen Die Indexierung erfolgt folgenderma en int my_integer my_integer_arrayl 4 Hierdurch wird das f nfte Element denken Sie daran C beginnt die Z hlung bei 0 aus dem Array ausgelesen und in my_integer gespeichert 99 2 Erweiterte Syntax Aufgrund des Wesens kompilierter Sprachen waren Sie stets an die vorausge gangene Definition Ihrer Variablen gebunden Wenn Sie im obigen Array pl tzlich mehr als 256 ganze Zahlen ben tigen h tten Sie leider Pech Nat r lich h tten Sie diese Variable als Zeiger auf ein ganzzahliges Array definieren un
46. ie Anh nger des prozeduralen Ansatzes Idioten Es ist fast wie ein Religionskrieg Wann immer wir das Thema anschnitten f hrte es zu endlosen und fruchtlosen Diskussionen Nach unserer Ansicht sind beide Extreme falsch Es ist weder gut Funktionen komplett zu ignorieren noch sie ohne Betrachtung der Nachteile zu verwen den Uns widerstrebt es aber auch es als pers nliche Vorliebe abzutun Tech nologien sollten nie unter diesem Gesichtspunkt betrachtet werden Unsere Empfehlung Befreien Sie sich von jeglichen Vorurteilen die Sie m glicher weise haben insbesondere denjenigen von anderen und entscheiden Sie dann objektiv was f r Ihr Projekt am besten geeignet ist 2 4 2 Implementierung von Klassen Ungeachtet der Pros und Contras sind Klassen ein wichtiges Element der Pro grammiersprache und es scheint immer einen Bedarf zu geben die Imple mentierung von Klassen in PHP zu erl utern Tats chlich lassen sich Klassen in PHP recht einfach implementieren Die meisten Schl sselworte werden Sie bereits aus anderen Sprachen kennen class shopping_cart var item_list function pick item quantity 81 2 Erweiterte Syntax this gt item_listl item quantity function drop item quantity if this gt item_listl item gt quantity this gt item_listl item quantity else this gt item_listl item 0 Dieser Code definiert die Klasse shopping_cart mit den Mitgliedern item_ list pick
47. ierungsebenen enthalten Sie sehen ganz verschie den aus haben aber alle nach der Expansion wieder dieselben Daten Der kompliziertere Ansatz war Anweisungsbl cke dynamisch neu zu gruppieren und gleichzeitig die algorithmische Struktur beizubehalten Dieses Verfahren erforderte manchmal sehr anspruchsvollen Programmcode war aber auch sehr effektiv Da jede Methode dazu f hrte dass der Bytecode ge ndert wurde wurden verschiedene Signaturen f r die einzelnen Infektionen dessel ben Virus erzeugt so dass es f r Antivirus Programme nahezu unm glich war sie zu entdecken w hrend die Viren andere Programme lustig weiter infizieren konnten Was hat dies mit PHP zu tun Nat rlich k nnen Sie keine solchen polymor phen Programme erstellen Die PHP Architektur verhindert w hrend der Laufzeit nderungen des Programmcodes der bereits analysiert ist Trotz dem enthalten sie n tzliche Hinweise Eine M glichkeit sind dynamische Funktionsparser auf die wir im n chsten Abschnitt eingehen 119 2 Erweiterte Syntax 2 7 1 Dynamischer Funktionsgenerator Als wir an diesem Buch schrieben fragte jemand aus der deutschen PHP Mailingliste ob wir eine M glichkeit w ssten vom Benutzer eingegebene mathematische Funktionen zu verwalten Er wollte wissen wie er eine vom Benutzer eingegebene Funktion mithilfe einer Webformel in PHP grafisch darstellen kann Er wusste nicht wie er mit dem Text verfahren sollte Wie l sst sich etwas wie f x
48. ifen Der R ckgabewert von func_get_args ist ein indiziertes Array das von links nach rechts mit allen Argumentwerten aufgef llt wird die an die Funktion bergeben wurden function show_arguments argument_array func_get_args for i 0 i lt count argument_array i print i gt argument_arrayL il lt br gt show_arguments Leftmost Middle Rightmost Die Funktion func_num_args gibt die Anzahl der tibergebenen Argumente zur ck func_get_arg gibt ein spezifisches Argument zur ck func_get_ arg 0 wiirde beispielsweise das erste Argument zurtickgeben Variable Variablennamen Variable Variablennamen Ftir jene die dieses Konzept noch nicht kannten und f r uns als wir es zum ersten Mal h rten einfach verr ckt Variable Variablennamen dienen dazu auf Variablen zuzugreifen deren Namen Sie vorher noch nicht kennen und die Sie erst w hrend der Laufzeit erstellen Diese Funktion ist durch den Interpretationscharakter von PHP m glich PHP wandert einfach den Programmcode ab und bersetzt alles was es findet in etwas m glichst Sinnvolles Der folgende Programmcode zeigt ein einfaches Beispiel f r variable Variablennamen lt my_var hello my_var 1 2 gt 114 Assoziative Arrays In der zweiten Zeile wird my_var das Prafix vorangestellt Dies ist das Grund prinzip von variablen Variablennamen Nat rlich k nnten Sie variable Variab lennamen verschachtel
49. ion to PHP code parsed_function parse_function function_string NOTE security holes see book contents eval parsed_function create image image create_image plot the function for x PLOT_MIN x lt PLOT_MAX x PLOT_STEP y calculate req_code x 123 2 Erweiterte Syntax plot image x y set content type header Content type image gif header Content type image png send image imagegif image imagepng image Listing 2 6 Dynamische Funktionsparser und plotter Das Skript ist ausf hrbar Sie k nnen es direkt in Ihrem Browser verwenden Beim ersten Aufruf wird es feststellen dass Sie noch keine Funktion zum Plot ten bereitgestellt haben und ein kleines Eingabeformular anzeigen wie Abbildung 2 13 zeigt XY Netscape olx File Edit View Go Communicator Help Function definition tm x Hp x 3 Required PHP code Sm 10 b 20 Parse ERS ie 47 Abbildung 2 13 Eingabeformular des dynamischen Funktionplotters Warnung Die hier verwendete Technik mit welcher der PHP Code direkt mit eval ausgef hrt werden kann sollte niemals wir wiederholen nie mals in dieser Form in Produktionsskripten verwendet werden Die Aus f hrung von Benutzerprogrammen reift ein riesiges Sicherheitsloch in Ihre Programme Damit k nnte jeder etwas wie system rm r senden womit alle Daten gel scht w rden auf die Ih
50. istung verbessern aber eine optimale Leistung erreichen Sie nicht Deshalb wurde die Technik des selbstmodifizierenden Programmcodes einge f hrt Wo ein Programmteil fr her eine der Bedingungen der innersten if then Schleife ge ndert h tte indem er die zust ndigen Flags entsprechen gesetzt h tte programmierte er die innere Schleife einfach neu und zwar so dass sie wie gew nscht agiert d h so als h tte sie die Flags ausgewertet Die Modifikationen die hierf r notwendig waren betrafen h ufig nur das ndern von ein oder zwei Bytes und waren meist nicht aufwendiger als das Setzen von Flags Dies funktionierte nat rlich nur auf Maschinencode Ebene und war extrem systemabh ngig daf r aber auch sehr m chtig Die Entwickler von Virusprogrammen haben dieses Verfahren schlie lich auf die Spitze getrieben indem sie polymorphe Programme entwickelten Poly morphe Programme hei en polymorph weil sie ihren eigenen Programm code ndern w hrend sie noch dieselbe Aufgabe ausf hren Die einfachste Methode um einen polymorphen Programmcode zu entwickeln bestand darin die Viren zu komprimieren und jedes Mal einen anderen Komprimie rungsalgorithmus oder andere Komprimierungsparameter auszuw hlen Nach jeder Komprimierung wurde so der Bytecode ge ndert doch nach der Dekomprimierung wurde das urspr ngliche Programm wiederhergestellt Versuchen Sie einmal die ZIP Archive anzusehen die dieselben Daten auf verschiedenen Komprim
51. it vielen Knoten erstellen und anschlie end ein Optimierungsprogramm dar ber laufen lassen das in der Regel die Anzahl der Knoten um die H lfte redu ziert und viele Geisterknoten im Array zur ckl sst Wenn wir davon ausge hen dass Sie urspr nglich 1 000 Knoten zugeordnet haben und w hrend der Optimierung 500 von ihnen freisetzen erhalten Sie ein Array das immer noch 1 000 Knoten enth lt wobei hierbei nur 500 von ihnen als in Gebrauch mar kiert sind Dies ist eine ziemliche Verschwendung von Speicherplatz Eine automatische Speicherplatzbereinigung w re hier sicherlich eine gute Idee Speicherbereinigung wirft jedoch ein zweites Problem auf n mlich Zombie knoten Zombieknoten sind Knoten die als in Gebrauch markiert sind aber keine Verkn pfung mehr zum Baum haben und daher nicht mehr referenziert werden k nnen siehe Abbildung 2 10 Abbildung 2 10 Zombieknoten in einer Baumstruktur Da die Bibliothek alle Informationen ber die Knoten in der Baumstruktur und ihre interne Verkn pfung enth lt lassen sich Zombieknoten sehr einfach ausmachen Dies fehlt jedoch leider noch im Programmcode Das dritte Problem hnelt dem der Zombieknoten unterbrochene Verkn p fungen Unterbrochene Verkn pfungen sind Verkn pfungen die von einem Knoten ausgehen und auf einen nicht verwendeten bzw nicht existenten Knoten zeigen siehe Abbildung 2 11 Die Verkn pfungen werden unterbro chen sobald Sie einen
52. kript greift in zwei verschiedenen Schleifen zweimal auf das selbe Array zu wobei beide Male each verwendet wird my_array array Landon gt 1 Graeme gt 2 Tobias gt 3 Till gt w4 print lt h2 gt Looping without reset lt h2 gt print lt h3 gt First loop lt h3 gt for i 0 i lt 2 i list key value each my_array 71 2 Erweiterte Syntax print Key key Value value lt br gt print lt h3 gt Second loop lt h3 gt for i 0 i lt 2 i list key value each my_array print Key key Value value lt br gt Wie die Ausgabe in Abbildung 2 5 zeigt beginnt die zweite Schleife nicht wie der beim ersten Element Statt dessen setzt sie dort an wo die erste Schleife beendet wurde Dies liegt daran dass der interne Array Zeiger von PHP nicht zur ckgesetzt wurde Eine leichte Ver nderung des Skripts ver ndert das Ergebnis siehe Abbildung 2 6 my_array array Landon gt 1 Graeme gt 2 Tobias gt 3 Till gt w4 print lt h2 gt Looping with reset lt h2 gt print lt h3 gt First loop lt h3 gt for i 0 i lt 2 i list key value each my_array print Key key Value value lt br gt print lt h3 gt Calling reset lt h3 gt reset my_array print lt h3 gt Second loop lt h3 gt for i 0 i lt 2 i list key value each my_array print Key key Value value lt br
53. l f r die Wahl besteht und dann mit dem Pr fix des Cookies po11_ cookiePrefix zu dem Namen der gew nschten Variablen pol1_cookieName zusammengesetzt Mithilfe von isset wird das Vorhandensein der Variable und damit des Cookies berpr ft und eine entsprechende Aktion einge leitet 115 2 Erweiterte Syntax Variable Funktionsnamen Was wir tiber variable Variablennamen gesagt haben gilt auch fiir Funktions namen Auch Funktionsnamen k nnen mithilfe von Variablen erzeugt wer den was eine dynamische Datenverarbeitung Installation von modifizierba ren R ckrufen u erm glicht Anstatt Funktionsnamen fest im Programm einzugeben k nnen Sie Zeichenkettenvariablen verwenden um die Funktion anzugeben die Sie aufrufen m chten function my_func a b print a b function my_func function 1 2 Nach der Deklaration von my_func wird die Variable function der Zeichen kette my_func zugeordnet Da diese Zeichenkette mit dem Namen der Funk tion identisch ist die Sie aufrufen m chten k nnen Sie diese beim Aufruf von my_func verwenden Dies ist nat rlich ein recht einfaches Beispiel f r variable Funktionsnamen Sie sind sehr n tzlich wenn Sie je nach Anzahl der variablen Flags zwischen mehreren Funktionen hin und herschalten m ssen Angenommen Sie wollten Email Anh nge dekodieren Diese k nnen ver schieden Formate haben z B base64 oder uuencoded um nur zwei Beispiele zu nennen
54. lt erzeugt Element 1 Element 2 ement 3 m Um das Prinzip von each besser zu verstehen ist es sinnvoll eine detaillierte Auflistung dieses Arrays zu erstellen Schl ssel Wert 0 Element 1 1 Element 2 2 Element 3 67 2 Erweiterte Syntax Hier sehen die Auflistung aller Schliissel Wert Paare die in dem Array my_array enthalten sind list key value each my_array Jetzt wenden wir hierauf each an Beim ersten Aufruf wird das erste vier Elemente umfassende Array zur ckgegeben welches das erste Schl ssel Wert Paar aus my_array enth lt Da wir nur zwei Argumente dem Operators list angegeben haben k nnen auch nur die Werte aus dem vier Elemente Array zugeordnet werden Es handelt sich um 0 den ersten Schl ssel und Element 1 das erste Wertelement aus my_array Der folgenden Programmcode listet den Inhalt eines Arrays auf my_array array Element 1 Element 2 Element 3 while list key value each my_array print Key key Value value lt br gt Das Skript erzeugt eine Ausgabe wie jene die in Abbildung 2 1 zu sehen ist X Netscape lolx File Edit View Go Communicator Help Key 0 Value Element 1 Key 1 Value Element 2 Key 2 Value Element 3 Abbildung 2 1 Array Auflistung mit each Sie k nnen each auch verwenden um die Elemente anzuzeigen die each selbst zur ckgibt my_array array Element 1 Element 2
55. mmierungsaufwand f hrt aber zu einem stabileren Programmcode Programmcode wie der oben gezeigte sollte nur f r Optimierungszwecke implementiert werden Die SQL Abfrage w hlt die Werte car_type car_color und car_speed aus einer Tabelle mit Fahrzeugdaten aus Das Ergebnis der Abfrage wird anschlie end mithilfe von mysql_fetch_row ausgelesen welches die drei Werte in einem Array zur ckgibt car_type wird dabei an die Indexposition 0 geschrieben car_color an Indexposition 1 und car_speed an Indexposition 2 Diese Werte werden von links nach rechts gelesen und anschlie end Wert f r Wert den in der list Anweisung angegebenen Argumenten zugeordnet Damit erhalten Sie die folgenden Zuordnungen Listenargument SQL Feld car_type car_type Array Position 0 car_color car_color Array Position 1 car_speed car_speed Array Position 2 66 Array Funktionen Die Anweisung list ist besonders n tzlich wenn Sie eine Sammlung von Werten in einzelne Variablen unterteilen m chten Dies passiert recht h ufig bei der Datenbankprogrammierung Beachten Sie jedoch dass list nur als l Wert und nicht als r Wert fungieren kann Sie k nnen list nicht verwen den um eine Reihe von Variablen auszutauschen Die folgende Anweisung w rde beispielsweise nicht funktionieren list varl var2 list var2 varl Die Anweisung each wird h ufig mit der Anweisung list verwendet each arbeitet ein Array ab und gib
56. n Um beispielsweise eine Bitmap eine Reihe von Pixel f r einen Mauszeiger zu speichern k nnten Sie in Ihrem Array einen weite ren Index hinzuf gen clear mouse bitmap for x 0 x lt MOUSE_X_SIZE x for y 0 y lt MOUSE_Y_SIZE y mouse_bitmapL x1J L y 0 Hiermit wird eine Maus Bitmap gel scht und alle Elemente auf 0 gesetzt Dabei werden zwei Schleifen verwendet eine f r jede Dimension Abbildung 2 12 zeigt eine grafische Darstellung von zweidimensionalen Daten mit Daten aus einem Koordinatensystem Intern d h im Speicher werden die Datenelemente nat rlich in Serie gespeichert der RAM hat nur eine Dimension f r die Indizie rung Eine passende Analogie f r die Visualisierung bietet das Koordinaten system In Arrays gibt es keine Begrenzung f r die maximale Anzahl der Dimensio nen offen gesagt haben wir es noch nicht ausprobiert aber es wird kaum eine Anwendung f r Arrays mit 16 Dimensionen oder mehr geben Dimensionen 102 Assoziative Arrays k nnen auch in verschiedenen Typen auftreten die erste Dimension assozia tiv die zweite Dimensionen mit ganzzahligen Indizes die dritte wieder asso ziativ usw Sie eignen sich damit auch hervorragend fiir die Darstellung statistischer Daten x 5 X 4 Y 3 sce ee O Element mit den Indizes 4 3 3 X 2 Y 5 2 Perececeisees eas Element mit den Indizes 2 5 Abbildung 2 12 Eine zweidimensionale Array Struktur 2 6
57. n um variable variable Variablennamen zu erhalten usw Aber auch mit variablen Variablennamen k nnen Sie einige nette Sachen anstellen Ein Beispiel aus dem Leben phpPolls das Stimmabgabeprogramm das wir in Kapitel 1 Entwicklungskonzepte beschrieben haben verwendet variable Variablennamen Um zu verhindern dass W hler in derselben Wahl mehr fach abstimmen basiert einer der Schutzmechanismen auf Cookies Sobald ein W hler w hlt wird ein Cookie gesetzt und mit einem Namen versehen der einen konfigurierbares Pr fix und eine eindeutige ID erh lt welche die Wahl kennzeichnet Da Cookies wieder in den globalen Namensraum zur ck gef hrt werden pr ft phpPolls bei der Stimmabgabe eines Benutzers ob es eine globale Variable mit dem Namen des Cookies gibt den es vorher erstellt hatte Wenn dies der Fall ist nimmt phpPolls die Stimmabgabe nicht an F r diese Aufgabe sind variable Variablennamen sehr gut geeignet Hier ein Auszug aus dem phpPolls Quellcode poll_object mysql_fetch_object poll_result poll_timeStamp poll_object gt timeStamp poll_cookieName poll_cookiePrefix poll_timeStanp check if cookie exists if isset pol1_cookieName cookie exists invalidate this vote poll_voteValid 0 else cookie does not exist yet set one now setCookie poll_cookieName 1 poll_cookieExpiration Zun chst wird die eindeutige ID f r den Cookie gelesen die aus dem Zeit stempe
58. n node back to tree tree_arrayL handle node return 1 function tree_link_left amp tree_array link_to child 96 retrieve nodes link_node tree_arrayLl link_tol child_node tree_arrayl child check if nodes are allocated if link_node gt free child_node gt free return error we do not allow linkage of free nodes return 1 link nodes together link_node gt idx_left child child_node gt idx_up link_to write nodes back into the array tree_arrayL link_to link_node tree_arrayl child child_node return success return 1 Verkn pfte Listen function tree_link_right amp tree_array link_to child retrieve nodes link_node tree_arrayLl 1link_tol child_node tree_arrayl child check if nodes are allocated if link_node gt free child_node gt free return error we do not allow linkage of free nodes return 1 link nodes together l ink_node gt idx_right child child_node gt idx_up link_to write nodes back into the array tree_arrayL link_to link_node tree_arrayl child child_node return success return 1 function tree_get_parent amp tree_array handle retrieve node from array node tree_arrayl handle check if node is actually allocated if node gt free node is not allocated return error return 1 node is allocated return its paren
59. n separaten Prozeduren verwaltet und einige der Anzeigen haben schlichtweg gelogen Der fragw rdigste Fall dem wir begegneten war ein Entwickler der an einer Grafikbibliothek arbeitete um komplexe mathematische zwei und dreidi mensionale Objekte zu zeichnen Er begr ndete seine Entscheidung Objekte zu verwenden damit dass er einen Borland Vertreter auf einer Konferenz getroffen hatte und dieser ihm die objektorientierte Programmierung emp fahl Aber ist es der richtige Weg die Entwicklung von verl sslichen Soft waresystemen nur auf Empfehlungen zu basieren 74 PHP und objektorientierte Programmierung Welche Vorteile haben Objekte nun und inwiefern unterscheidet sich OOP von dem prozeduralen Ansatz Warum sollten wir uns tiberhaupt damit befassen Die letzte Frage zuerst Wir sollten uns gr ndlich berlegen ob wir in PHP eine objektorientierte Programmierung einsetzen denn es macht wenig Sinn eine Technik zu verwenden die eine gr ere Belastung f r die Entwicklung darstellt von der zugrunde liegenden Architektur nicht ausreichend unter st tzt wird und f r die Anwendung im Grunde genommen keinen Unter schied macht Prozedurbasierte Projekte k nnen genauso effektiv leicht zu pflegen und erweiterbar sein wie objektorientierte Projekte Tabelle 2 1 zeigt die wichtigsten Unterschiede zwischen den beiden Ans tzen Objekte Prozeduren Vollst ndige Verschachtelung von Daten Keine Verschachtelung von Daten n
60. ndardargumente angegeben deren Wert Sie ndern m ch ten wie das dritte Beispiel zeigt Hier ist nur port als 8080 angegeben time out fehlt und bleibt daher auf seinem Standardwert von 10 Sekunden Die Tatsache dass PHP keine M glichkeit hat herauszufinden welcher Wert zu welchem Parameter geh rt bedeutet dass Sie alle optionalen Parameter am Ende der Argumentenlisten anf gen m ssen Wenn Sie hostname als einzi gen obligatorischen Parameter am Ende der Liste einf gen w rden und port und timeout davor belie en w rde PHP beim ersten Aufruf bei dem nur hostname angeben ist vermuten dass die Zeichenkette f r den Namen des Hostrechners der Wert f r port w re was zu erheblicher Verwirrung f hren w rde Genauso wenig k nnen Sie einfach willk rlich optionale Parameter ausw h len f r die Sie Werte liefern m chten Wenn Sie eine Funktion haben die drei optionale Parameter hat und Sie nur den letzten Parameter in der Argumen tenliste ndern wollen m ssen Sie trotzdem die Standardwerte f r die ersten beiden Parameter angeben Dies k nnen Sie auch im zweiten der obigen Bei spiele sehen in dem nur timeout ge ndert wird 113 2 Erweiterte Syntax PHP 4 0 kann Argumente wirklich variabel verwalten Eine Funktion kann mehr Argumente haben als die Funktionsdefinitionslisten und Sie k nnen mit den Funktionen func_get_args func_num_args und func_get_arg auf eine beliebige Anzahl von Argumenten zugre
61. ndert den Typ von my_var jedoch dynamisch auf string und ordnet die Variable neu zu so dass gen gend Speicherplatz f r die Zeichenkette zur Verf gung steht Die Zeile ndert dann den Typ von my_var erneut indem es ein Array davon erzeugt PHP meistert alle F lle transparent und problemlos Wir wissen dass es da drau en noch weitere Sprachen ohne strikte Variablentypen gibt aber wir m chten diese hier nicht als konventionelle Sprachen klassifizieren 100 Assoziative Arrays Hinweis PHP 3 0 hat keine verniinftige Speicherbereinigung Bei der Neu zuweisung einer Variablen wird der bereits zugewiesene Speicherplatz nicht immer wieder verwendet Bei langfristigen Skripten oder Skripten die eine umfangreiche Verarbeitung haben k nnte dies zu gr eren Berei chen toten Speichers f hren Bei der Verwendung von speicherintensi ven Skripten die f r einen langen Zeitraum genutzt werden sollten Sie die Speicherbelegung in einer Testumgebung berwachen bevor Sie die ent sprechenden Skripte in einer produktiven Umgebung implementieren um sicherzugehen dass Ihr Server nicht berlastet wird PHP 4 0 ist nicht so anf llig f r dieses Problem Da PHP keine formalen Variablendeklarationen ben tigt ist die Verwendung der Variablen vollst ndig dynamisch Ein Sonderfall der dynamischen Variab lenverarbeitung in PHP sind die Arrays Wahrscheinlich kennen Sie den her k mmlichen Array Typ das indexierte Array Indexierte A
62. nen Ein m gliches Beispiel ist die automatische Aktualisierung sogenannter Laufvariablen Laufvariablen sind Variablen die ihre Werte w hrend einer algorithmischen Schleife ndern Ein Sonderfall hiervon sind Z hlvariablen in for Anweisungen Ein konkretes Beispiel das hiervon profitiert ist der Lauf l ngen Kodierungsalgorithmus RLE der weithin bekannt ist da er in Forma ten wie ZSoft s PCX Bildformat verwendet wurde und noch verwendet wird Der RLE Algorithmus ist ein Komprimierungsalgorithmus der von der Tat sache profitiert dass viele Farbbilder mit niedriger Aufl sung dieselben Datenbytes wiederholt abspeichern insbesondere Bitmaps die nur zwei Far ben schwarz und wei enthalten Sehen wir uns einmal diese Darstellung eines einfachen Rechtecks an 105 2 Erweiterte Syntax 111111111111111111 00000000000000000 00000000000000000 00000000000000000 00000000000000000 00000000000000000 00000000000000000 00000000000000000 00000000000000000 111111111111111111 Cy a a a ee SEE sam Mit ein wenig Vorstellungskraft sehen wir ein Rechteck aus Nullen mit einem Rand aus Einsen Wenn Sie diesen in eine Datei wie vorliegend tibertragen wollten ben tigten Sie 20 x 10 200 Elemente 20 Spalten mal 10 Zeilen Wir gehen an dieser Stelle einmal davon aus dass ein Element mindestens einem Byte entspricht und lassen au er acht dass eine einfache Komprimierung bereits dur
63. nfach zu programmieren ist und in 99 aller F lle nicht funktionieren wird 2 4 1 Klassen PHP 3 0 versus PHP 4 0 PHP 4 0 hat aus der Unf higkeit von PHP 3 0 gelernt Objektreferenzen zu verwalten und bietet nun echte Referenzen Echt ist hier in Anf hrungs zeichen gesetzt da diese nicht wirklich auf den Speicherbereich zeigen den die andere Variable belegt PHP interpretiert diese Variablen nur als Referen zen und verh lt sich anders Eingebettet in das vorangegangene Beispiel s he der Programmcode folgenderma en aus create multiple references to the original object new_object amp my_object another_object amp new_object Dieser Code erzeugt zwei Referenzen auf dasselbe Objekt Beachten Sie dass another_object als Referenz new_object zugeordnet wird nicht als Kopie hiervon Wenn Sie versuchen die Referenzen zu kopieren kopiert PHP nicht die Referenz sondern erzeugt statt dessen eine Kopie der referenzierten Vari ablen Nur wenn Sie jetzt Referenzen verwenden um eine Referenz zu kopie ren m ssen Sie wieder den Referenzoperator verwenden k nnen Sie sowohl new_object als auch another_object verwenden um die Daten zu ndern die sich innerhalb von my_object befinden F r die unterschiedlichen Versionen geben wir einige Empfehlungen auf die wir nachfolgend eingehen Klassen in PHP 3 0 Daten Verwenden Sie Klassen nicht f r komplexe Datenstrukturen die echte Zeiger ben tigen wie etwa B
64. ng 2 8 Sie haben die Kopie des Kno tens links au en ge ndert nicht jedoch den Knoten selbst Sobald Sie diese Funktion verlassen gehen Ihre nderungen unwiderruflich verloren root Knotendaten Knotendaten des linken Teilknoten Knotendaten des rechten Unterknoten linke Daten rechte Daten linke Daten rechte Daten er ee Abbildung 2 8 Baumstruktur erzeugt mithilfe der Kopiersyntax Sie k nnten auch eine Referenz auf diese Instanz zur ckgeben und diese ndern indem Sie den einfachen Zeiger Mechanismus verwenden den PHP bereitstellt Dann haben Sie das Objekt selbst ge ndert und nicht seine 79 2 Erweiterte Syntax Kopie Sobald Sie den Baum wieder abarbeiten werden Sie jedoch etwas Merkw rdiges feststellen Nichts scheint sich ge ndert zu haben Tats chlich hat sich nichts ge ndert Dies liegt daran dass der Elternknoten des Knotens den Sie ndern wollten eine eigene Kopie derselben Daten besitzt Bedenken Sie dass node gt left nichts Anderes ist als eine weitere Kopie eines Knotens im Baum Dies ist genau die Kopie welche die Bearbeitungsroutine auswer tet Die Kopie die Sie ge ndert haben bleibt au erhalb des Baumes und wird schlie lich bei einer Speicherbereinigung gel scht Um auch diesen Knoten zu ndern m ssen Sie Referenzen an die Elternknoten die Gro elternknoten und die Ur Gro elternknoten weiterleiten Damit landen Sie bei einer weite ren rekursiven Funktion die alles Andere als ei
65. nlichst nicht verwenden each ist auch ein gutes Werkzeug um sicherzustellen dass Sie auf Arrays nicht au erhalb ihrer Bereichsgrenzen zugreifen Auch dies ist ein Grund f r Programmunterbrechungen PHP handhabt Zugriffe au erhalb der Bereichs grenze auf recht lockere Art meistens wird nur eine Warnung ausgegeben trotzdem haben wir es wiederholt geschafft PHP durch ung ltige Array Zugriffe zum Absturz zu bringen Im g nstigsten Fall reagierte PHP lediglich mit Abbruch des Programms im schlimmsten Fall belegte das PHP Modul pl tzlich 100 der CPU Zeit und der Serverprozess musste abgebrochen werden eine Situation die Sie in einer Produktionsumgebung unbedingt vermeiden sollten In unserem Falle wurde dies wahrscheinlich durch eine fehlerhafte interne Routine zur Array Bearbeitung in PHP verursacht Sie sollten trotzdem keine ung ltigen Array Zugriffe provozieren Es zeugt von schlechtem Programmierstil und PHP bietet each 1ist und verwandte Funktionen um Ihren Programmcode zu sichern Dies sollten Sie nutzen Urspr nglich wurde each zur Benutzung mit realen assoziativen Arrays entwickelt die zur Indexierung von Daten nicht numerische Schl ssel ver wenden In diesem Fall ist es nicht m glich auf die gespeicherten Daten ohne eine Funktion zuzugreifen die alle verf gbaren Schl ssel auflisten kann sofern Sie nicht wissen welche Schl ssel in Gebrauch sind Diese Arrays 70 Array Funktionen k nnten auf
66. nur schwer gespeichert werden PHP akzeptiert gemischte Typen problemlos wodurch Sie alle Knotendatentypen jederzeit ndern k nnen bung F gen Sie eine zuverl ssige Speicherbereinigung in Ihre Baumbib liothek ein Hinweis Sie k nnen in der Knotenstruktur einen neuen Flag f r die Refe renzz hlung einf hren Dies erleichtert und beschleunigt die Speicherbe reinigung Untersch tzen Sie die bungen nicht Zu wissen wie etwas funktioniert ist etwas ganz Anderes als in der Lage zu sein etwas zu tun Wir empfehlen Ihnen w rmstens zumindest zu versuchen die Bibliothek zu verbessern Es ist absolut keine Zeitverschwendung selbst wenn Sie keinen Erfolg haben Um es mit den Worten Marie Freifrau von Ebner Eschenbach zu sagen F r das K nnen gibt es nur einen Beweis das Tun 93 2 Erweiterte Syntax Listing 2 2 zeigt die vollst ndige Implementierung der Baumbibliothek This structure keeps a tree node class tree_node array indices linking to neighboring nodes var idx_up var idx_left var idx_right var free contents of this node this is a mixed variable var contents function tree_create create a new empty array return_array array allocate the root node root_node new tree_node all other linking indices are invalid root_node gt idx_up 1 root_node gt idx_left 1 root_node gt idx_right 1 this node is unused root_node gt free
67. or malerweise w rden Trefferz hler von Protokolldateien berechnet oder aus der Datenbank ausgelesen Eine einfachere Methode ist jedoch die Verwen dung von eingebauten Z hlern Eingebaut bedeutet dass sich der Pro grammcode und die Daten f r den Z hler in derselben Datei befinden counter 0 III III III III III III II TAT TTT TTT Do not modify above this point III III III III III III II III TTT TTT increase counter counter write counter back to ourselves file fopen basename PHP_SELF r fputs file lt n counter counter print counter or do something else with it print counter hits so far 126 Zusammenfassung In der ersten Zeile wird der Z hler auf Null zur ckgesetzt Die n chste Zeile setzt ihn hoch und nun kommt der interessante Teil Der Programmcode ff net seine eigene Datei und ersetzt die erste Zeile Dies f hrt dazu dass die Datei anders interpretiert wird wenn sie von PHP das n chste Mal verarbei tet wird Die Quelle s he folgenderma en aus counter 1 YIIIIIIT III III III III III III III TTT Do not modify above this point a increase counter counter write counter back to ourselves file fopen basename PHP_SELF r fputs file lt n counter counter print counter or do something else with it print counter hits so far Jetzt setzt die erste Zeile counter auf 1 und nicht auf 0 Bei jedem weiter
68. pischen Dingen die man tun bzw lassen sollte um erweiterte syntaktische und Algorithmenfunktionen zu erhalten Definition von Konstanten Array Funktionen Klassen Verkn pfte Listen B ume Assoziative Arrays Mehrdimensionale Arrays Variable Argumente und variable Argumentenlisten 63 2 Erweiterte Syntax Variable Variablennamen Variable Funktionsnamen Selbstmodifizierender Highlevel Code Polymorphisierung Auf all diese Themen werden wir in den folgenden Abschnitten eingehen 2 2 Definition von Konstanten In PHP gibt es zwar keinen Ausdruck und keine Konstruktion um Konstan ten in Form von nicht modifizierbaren Variablen zu definieren trotzdem k n nen Sie dieses Ziel durch Verwendung von definierten Werten erreichen Defi nierte Werte sollten verwendet werden um alle festen Werte zu ersetzen wie z B Fehlercodes Dateiformatkonstanten spezielle Zeichenfolgen und andere Konstrukte die eine spezielle Bedeutung f r das Programm oder die Biblio thek haben und w hrend der Programmausf hrung nicht ge ndert werden sollen Definierte Werte haben den gro en Vorteil dass sie die Bedeutung spezieller Werte verdeutlichen und gleichzeitig eine weitere Abstraktionsebene bieten read file type from input file_type fgets file 32 decide what kind of file it is switch file_type case FT_GIF_IMAGE handle GIFs here break case FT_PNG_IMAGE han break le PNGs here Q
69. r Webserver Zugriff hat Wir haben es hier gemacht weil wir uns auf die dynamische Erstellung und Ausf hrung von Programmcode konzentrieren wollten Eine ausf hrliche Diskussion ber die M glichkeit Ihre Skripte zu sichern und die Ausf h rung von b swiligem Programmcode zu vermeiden finden Sie in Kapitel 4 Webanwendungskonzepte und Kapitel 5 Grundlegende Web anwendungsstrategien 124 Polymorphisierung und selbstmodifizierender Code Das erste Feld gibt die Funktion an die grafisch dargestellt werden soll Die ses Beispiel macht die Annahme dass x die einzige Variable ist von der die Funktion abh ngt Im zweiten Feld k nnen Sie PHP Code eingeben der vor der Auswertung der Funktionsanweisung ausgef hrt wird damit Zuordnun gen zu Konstanten gemacht werden k nnen in unserem Fall m und b Zum jetzigen Zeitpunkt klicken Sie einfach auf Parse Abbildung 2 14 zeigt was als N chstes erscheint Wie kam das Skript jetzt von dem Eingabeformular zu dieser grafischen Aus gabe Sehen wir uns die inneren Vorg nge Schritt f r Schritt an Nachdem Sie das Eingabeformular abgeschickt haben beginnt das Skript mit der Ausf hrung der else Klausel der wichtigsten i f Anweisung Zun chst wird folgende Funktion aufgerufen translate input function to PHP code parsed_function parse_function function_string XY GIF image 200x300 pixels Netscape Ol x File Edit View Go Communicator Help lt S 36
70. rd ein anderer Flag definiert free Diese Variable hat entweder den Wert 1 in Gebrauch oder 0 nicht in Gebrauch tree_create erzeugt einen Dummyknoten und markiert ihn als frei d h alle Referenzen werden nicht verwendet und weist ihn dem Slot 0 in dem Baum Array zu Anschlie end wird dieses Array an den Anrufer zur ckgeschickt Hinweis Der Anrufer muss nichts ber dieses Array wissen nicht einmal dass es ein Array ist Das Programm sollte es einfach f r etwas als Baum struktur zu bearbeitendes halten Da PHP keine expliziten Typen hat und verlangt funktioniert dies sehr gut tree_allocate_node sucht innerhalb des Baum Arrays nach einem freien Knoten indem es f r jeden bestehenden Knoten den Flag free berpr ft Wenn keiner der Knoten als frei markiert ist weist es einfach einen neuen zu und f gt es dem Baum Array hinzu Hier macht sich die dynamische Struktur von PHP bemerkbar Wenn wir Arrays fester Gr e nutzen m ssten gingen uns fr her oder sp ter die Knoten aus Der gefundene Knoten wird dann als in Gebrauch markiert und als zu bearbeiten an den Anrufer zur ckge schickt 91 2 Erweiterte Syntax tree_free_node macht genau das Gegenteil Es markiert den angegebenen Knoten als nicht in Gebrauch indem es den Flag free l scht Dies wirft drei Probleme auf Zun chst sind freie Knoten nicht wirklich frei sie sind nur als frei markiert Angenommen Sie wollten eine komplexe Baumstruktur m
71. re return socket 112 Assoziative Arrays regular_socket open_http_connection www myhost com slow_socket open_http_connection www myhost com 80 20 test_socket open_http_connection testserver myhost com 8080 slow_test_socket open_http_connection testserver myhost com 8080 w20 Die Funktion open_http_connection akzeptiert ein regul res Argument namens hostname das den Namen des Host Rechners angibt mit welchem eine Datenverbindung hergestellt werden soll Zus tzlich hat die Funktion zwei optionale Argumente port und timeout welche die zu verbindende Portnummer und das Timeout f r die Verbindung in Sekunden angeben Beide haben vorgegebene Standardwerte die durch das Gleichheitszeichen angegeben werden gefolgt von dem gew nschten Standardwert Wenn diese Argumente nicht vom Anrufer ausgef llt werden ersetzt PHP die feh lenden Eintr ge durch die Standardwerte Wie Sie an diesen beiden Beispielen sehen wird im ersten Aufruf nur host name verwendet port und timeout fehlen PHP f llt diese L cken mit den Standardwerten aus so dass der Aufruf nun folgenderma en aussieht regular_socket open_http_connection www myhost com 80 10 Sie k nnen trotzdem ihrerseits die optionalen Parameter angeben und die Standardwerte berschreiben wie der zweite Aufruf zeigt Der Wert f r port ist immer noch 80 aber timeout ist nun auf 20 Sekunden gesetzt Sie m ssen die Sta
72. rrays sind Arrays die durch Ordnungszahlen indiziert sind Diese Ordnungszahlen gehen in der Regel von 0 bis n wobei n der h chstm gliche Index ist Sprachen wie Pascal lassen eine Indexierung mit verschiedenen Bereichen wie etwa von 3 bis 18 zu wobei diese Bereiche sp ter zur Laufzeit auf 0 basierte Indizes zur ckgewandelt wird Das Hauptmerkmal dieser indexierten Arrays ist dass sie andere Indizes von einem bestimmtem Basisindex berechnen k nnen Nehmen wir beispielsweise an Sie m chten bei Index 2 beginnend drei aufei nanderfolgende Array Elemente auslesen base_index 2 for i base_index i lt base_index 3 i print Element i is my_arraylL il lt br gt Bei jeder Iteration der for Anweisung berechnet dieser kleine Programmteil den n chsten Index in dem Array durch Heraufsetzen von i Assoziative Arrays haben diese Funktion nicht Die Besonderheit bei assozia tiven Arrays besteht darin dass Sie mit Nicht Ordnungszahlen wie etwa Zei chenketten indiziert werden k nnen Jeder Zeichenkette die als Index ver wendet wird ist ein Wert zugewiesen was auch den Namen assoziatives Array erkl rt Wie Sie sich vielleicht denken k nnen l sst sich auch durch Zuteilen eines Basisindexes der n chste g ltige Index in dem Array nicht erraten Sie m ssen die Array Schl ssel kennen um die zugeh rigen Werte auszulesen Daneben k nnen die bereits zuvor besprochenen Funktionen list und each verwendet
73. sollte damit nur die Referenz kopiert werden und die Originaldaten unber hrt bleiben vergleichbar mit einer Dateisystemverkn pfung die einen Zugriff auf dieselben Daten von verschiedenen Speicherorten im Dateisystem erm glicht Dieses Verhalten von PHP d h anstelle der Referenz Kopien referenzierter Daten zu erzeugen klingt nicht so bedeutend als dass wir uns darauf konzentrieren sollten Sie werden jedoch in K rze feststellen dass es durchaus von Bedeutung ist Hinweis Zum Zeitpunkt da dieses Handbuch erstellt wurde verwende ten sowohl PHP 3 0 als auch PHP 4 0 die Kopiersyntax Ein Gespr ch mit einem Mitglied aus dem Kernentwicklungsteam ergab dass dieses Stan dardverhalten ge ndert werden und k nftig eine Referenzsyntax verwen det werden soll Diese nderung w rde jedoch zum Verlust der R ck w rtskompatibil t f hren Die nderung ist f r die Version 4 1 geplant Danach w ren alle Informationen hier f r k nftige Versionen nicht mehr g ltig 77 2 Erweiterte Syntax Warnung PHP 3 0 verf gt ber keinen vern nftigen Mechanismus zur Speicherbereinigung Sobald Sie einen Wert in eine Variable schreiben wird nicht der alte Sp eicherbereich wiederverwendet sondern neuer Speicher zugewiesen Mit unset k nnen Sie dies in begrenztem Ma e umgehen es wird zwar kein Speicher freigegeben sondern nur als wiederverwendbar markiert auf lange Sicht wird der Speicher Ihres Servers jedoch insbeson dere d
74. st es mit einem geringen Aufwand m glich diese Arrays zu Erstellung einer dynamischen Baumstruktur zu ver wenden Die Idee ist nicht neu Sie existiert bereits seit einigen Jahren und ist nicht schwer zu verstehen Anstatt Zeiger zu verwenden welche auf die Speicher adresse eines anderen Knotens verweisen mit welchem ein Knoten verkn pft ist sind im Array alle Knoten mit den Indizes der Knoten versehen mit denen sie verkn pft sind Dies hat nicht nur den Vorteil dass PHP bei Verwendung von ung ltigen Indizes eine Warnung ausgibt Sie k nnen auch den gesamten Baum kopieren indem Sie die Variable die das Array eines Baumes angibt einer anderen Variablen zuweisen Dar ber hinaus k nnen Sie die gesamte Baumstruktur so wie sie ist in eine Datei kopieren und diese an eine beliebige andere Stelle verschieben Eine weitere eher theoretische Erl uterung ist folgende Stellen Sie sich den f r Ihr Programm verf gbaren Speicher als ein gro es Array vor Die Ele mente w ren im Falle von physischem RAM wahrscheinlich einige Byte gro aber die Gr e der einzelnen Elemente ist nicht wirklich von Bedeutung Wichtiger ist dass der Zeiger einfach eine Nummer ist die eines der Elemente indiziert und damit den Beginn jeder Struktur markiert die Sie in Ihr RAM einf gen Wenn Sie nun das gesamte Konstrukt in eine Sprache integrieren ein echtes Array haben Sie dieselbe Situation auf einer h heren Ebene Das PHP Array enth lt nur I
75. t return node gt up function tree_get_left amp tree_array handle 97 2 Erweiterte Syntax retrieve node from array node tree_arrayl handle check if node is actually allocated if node gt free node is not allocated return error return 1 node is allocated return its left child return node gt left function tree_get_right amp tree_array handle retrieve node from array node tree_arrayl handle check if node is actually allocated if node gt free node is not allocated return error return 1 node is allocated return its left child return node gt right function tree_assign_node_contents amp tree_array handle contents retrieve node from array node tree_arrayl handle check if node is actually allocated if node gt free node is not allocated return error return 1 assign contents to node node gt contents contents assign node back into array tree_arrayL handle node 98 Assoziative Arrays return success return 1 function tree_retrieve_node_contents amp tree_array handle retrieve node from array node tree_arrayl handle check if node is actually allocated if node gt free node is not allocated return error return 1 return contents of this node return node gt contents Listing 2 2 Implementierung der Baumb
76. t die einzelnen Elemente in einer Schl s sel Wert Kombination zur ck Dies geschieht durch Abwandern des Ein gabe Arrays PHP weist jedem Array einen internen Zeiger zu Dieser Zeiger weist zu Beginn auf das erste Element des Arrays Bei jedem Aufruf von each wird das Element zur ckgegeben auf welches der interne Zeiger weist Anschlie end wird der Zeiger um eine vorgegebene Anzahl von Ele menten hochgesetzt Das R ckgabeformat des Schl ssel Wert Paares ist ein vier Elemente umfas sendes Array mit den Schl sseln 0 1 key und value Dies bedeutet dass es sowohl als indiziertes Array als auch als assoziatives Array verwendet werden kann Der indexierte Teil des Arrays mit den Schl sseln 0 und 1 enth lt den Schl ssel des Quellelements an Indexposition 0 der Wert befindet sich an Indexposition 1 Dieselbe Information erhalten Sie auch ber den asso ziativen Teil des Arrays Genaugenommen ist eine Trennung von assoziati ven und indizierten Teil des Arrays hier nicht korrekt da indizierte Arrays nur eine Sonderform der assoziativen Arrays sind Theoretisch sind es zwar ganz verschiedene Dinge aber in der Praxis sind sie in PHP identisch Weitere Einzelheiten finden Sie weiter unten Der Schl ssel des Quellelements ist in key angegeben w hrend der Wert in value steht Ein Beispiel baag y_array array Element 1 Element 2 Element 3 Hierdurch wird ein Array mit dem folgenden Inha
77. t object instanz als Zeichenkette zur ck string get_parent_class Gibt den Namen der bergeordneten Klasse der object object angegebenen Objektinstanz als String zur ck 85 2 Erweiterte Syntax Funktion Beschreibung bool method_exists object object string me thod bool class_exists string classname bool is_subclass_of object object string class name Pr ft ob die in method genannte Funktion tats chlich ein Mitglied von object ist Pr ft ob classname eine tats chlich definierte Klasse ist Pr ft ob object eine Unterklasse von classname ist Hinweis Diese Funktionen sind nicht in PHP 3 0 verf gbar Quellcode f r den Einkaufswagen Dieser Abschnitt erl utert anhand des Einkaufswagens die vollst ndige Implementierung eines objektorientierten Programms siehe Listing 2 1 Das Beispiel ist zwar sehr einfach aber trotzdem n tzlich class shopping_cart var item_list function shopping_cart item T Shirt quantity 1 this gt pick item quantity function pick item quan tity this gt item_listl item quantity function drop item quan if this gt item_listl i this gt item_listl i else this gt item_listl i 86 tity tem gt quantity tem quantity tem 0 PHP und objektorientierte Programmierung class extended_cart extends shopping_cart function query item
78. tionen auf einmal auf Dies erm glicht hnlich wie bei dem vorangegangenen Email Beispiel eine dynamische Datenverarbeitung was sich bezahlt macht wenn Sie nur zur Laufzeit ent scheiden k nnen oder wollen wie Sie mit ankommenden Ereignissen ver fahren Wenn Sie diesen Ansatz weiter verfolgen k nnen Sie variable Funktions namen einsetzen um das Verhalten Ihrer Skripte zur Laufzeit zu ndern und gleichzeitig benutzerdefinierte Plugins installieren welche zur Laufzeit automatisch an den Programmcode angeh ngt werden Damit erhalten Sie zu s tzliche Funktionen f r das Skript ohne dass Sie daf r eine einzige Pro grammzeile ndern m ssen 2 7 Polymorphisierung und selbstmodifizierender Code Die Nachteile von variablen Funktionsnamen und teilweise von variablen Variablennamen ist dass Sie stets einen festen Programmteil haben m s sen im Fall der variablen Funktionsnamen eine Liste mit zuvor deklarierten Funktionen die Sie verwenden k nnen und einen variablen Teil der Teil der die Funktionsnamen in eine Variable umwandelt und dann die Funktion aufruft dessen Namen erstellt wurde Dies bedeutet dass Sie f r jeden m g lichen erstellbaren Namen vorher eine Funktion generieren m ssen damit das Programm korrekt funktioniert was eine Form von Beschr nkung dar stellt Dies k nnen Sie durch vollst ndig dynamische Programme umgehen Pro gramme die sich selbst en passant generieren Diese Idee stammt
79. torientierte Programmierung 2 4 5 Vererbung Um Funktionen zu Objekten hinzuzuf gen sollte nicht der alte Code neu geschrieben sondern existierende Strukturen st rker ausgenutzt werden Neue Objekte k nnen mithilfe des Schl sselworts extends aus alten Objekten bernommen werden Wie der Name sagt wird hierdurch eine neue Klasse als Erweiterung einer bestehenden definiert class extended_cart extends shopping_cart function query item return this gt item_listl item Dieser erweiterte Wagen extended_cart enth lt nun alle Elemente und Mit gliedsfunktionen von shopping_cart sowie zus tzlich eine weitere Funktion query mit welcher wir die Menge eines bestimmten Eintrags im Wagen berpr fen k nnen Hinweis Die Klasse extended_cart besitzt keinen eigenen Konstruktor Wenn die Klasse eines Tochterknotens keinen Konstruktor hat ruft PHP seit der Version 4 0 automatisch den Konstruktor des Elternknotens auf Standardm ig wird PHP jedoch nie den Konstruktor eines Elternknotens aufrufen Wenn Sie also das bergeordnete Objekt einrichten m ssen stel len Sie sicher dass Sie seinen Konstruktor manuell aufrufen 2 4 6 Spezielle Funktionen f r objektorientierte Programmierung PHP hat ein paar sch ne Funktionen welche den Umgang mit Objekten erleichtern Die folgende Tabelle beschreibt diese Funktionen Funktion Beschreibung string get_class Gibt den Namen der angegebenen Objekt objec
80. ur ber separate Parameter Mehrere Instanzen sind zugelassen Mehrere Instanzen nicht erlaubt unter schiedliche Datens tze m ssen durch Kopien der vorhandenen Variablen ver waltet werden Erm glicht zus tzliche Funktion ber Keine Vererbung zus tzliche Funktiona Vererbung bei Erhalt der Schnittstelle lit t nur ber die API durch Bereitstel lung einer weiteren API Schicht oder durch ndern der gesamten API Selbstzentriert das Objekt hat seinen Global ausgerichtet Prozeduren haben eigenen Datensatz und muss nur f r keine eigenen Datens tze Die Daten dessen G ltigkeit sorgen und den Zu werden vom Anrufer bereitgestellt griff f r andere Parteien gew hrleisten Bietet einfache Mittel zur Sicherstellung Initialisierung und Cleanup Konstruk der Datenintegrit t tor Destruktor Datenintegrit t kann nur schwer sichergestellt werden Initialisie rung und Cleanup m ssen explizit auf gerufen werden Isolierter Namensraum Namen m ssen in den globalen Namensraum eingef hrt werden Tab 2 1 Objektorientierte Programmierung versus prozedurale Programmierung Diese Tabelle f hrt nur die wichtigsten Unterschiede auf Es gibt noch wei tere aber wir k nnen bereits sehen dass es f r Prozeduren nicht besonders gut aussieht Sind Prozeduren wirklich so schlecht wie es den Anschein hat Bedeutet dies dass die objektorientierte Programmierung die prozedurale Programmierung komplett abl st Tats chlich h n
81. urch langfristige Projekte belegt Wenn Sie langfristige Skripte ver wenden wollen dann stellen Sie sicher dass Sie Ihre Datenbankergebnisse beispielsweise m it mysql_free_result freigeben und unset auf alle Vari ablen anwenden die keine wertvollen Informationen mehr enthalten Der Speicher wird jedoch erst frei wenn das Skript beendet ist Nehmen wir beispielsweise eine Baumstruktur Die Klasse zum Aufbau der Baumknoten sieht class tree_node var left_chil var value Dies ist zwar nur folgendermafsen aus d right_child ein einfacher Baumknoten aber er enth lt alles was wir ben tigen eine Verkn pfung zum linken Tochterknoten und eine Verkn p fung zum rechten Tochterknoten sowie eine Variable die den Inhalt dieses Knotens enth lt Lassen Sie uns nun einen einfachen Baum konstruieren root_node new t left_node new t right_node new root_node gt value left_node gt value right_node gt value root_node gt left_c root_node gt right_ ree_node ree_node right_node T 25 3 hild left_node child right_node Dieser Programmcode erzeugt einen Baum mit einem Stammknoten und zwei Tochterknoten wobei jedem dieser Knoten ein anderer Wert zugewiesen wird Die Abarbeitung des Baums k nnte mit einer Funktion wie dieser erfolgen function traverse_ node start print Value i 78 tree start_node _node s node gt value lt br gt
82. zu diesem Thema im Abschnitt Vererbung 82 PHP und objektorientierte Programmierung class extended_cart extends shopping_cart function extended_cart shopping_cart shopping_cart Mousepad 1 function query item return this gt item_listl item Diese erweiterte Version des Objekts extended_cart besitzt einen Konstruktor der den Konstruktor des Elternknotens aufruft damit dieser den Rest den Objektbaums korrekt initialisiert Wiirde der Konstruktor des Elternknotens nicht explizit von diesem Konstruktor aufgerufen w rde der Elternknoten nicht initialisiert werden und damit auch nicht der Elternknoten dieses Kno tens usw Au erdem besitzt PHP einen Alias der auf die aktuelle Instanz eines Objekts zeigt Dieser Alias hei t this und gew hrt Zugriff auf alle Mitglieder der aktuellen Instanz Er wird f r alle Selbstbez ge ben tigt da PHP innerhalb von Klassendefinitionen keinen lokalen G ltigkeitsbereich festlegt Hinweis Da PHP keinen lokalen G ltigkeitsbereich innerhalb der Klas sendefinitionen festlegt stellen Sie sicher dass Sie das Schl sselwort this immer dann verwenden wenn Sie innerhalb Ihres Objekts referenzieren Wenn Sie this vergessen referenziert PHP automatisch auf den globalen G ltigkeitsbereich was recht fehlertr chtig ist 2 4 4 Konstruktoren Konstruktoren sind wie regul re Funktionen definiert mit der Ausnahme dass ihre Namen mit den Klassennamen identisch
Download Pdf Manuals
Related Search
Related Contents
KDC-8021/M9021/X859 TG550 Instruction Manual Supermicro SuperServer 5037MC-H86RF Bedienungsanleitung User manual Untitled - Universiti Teknologi Malaysia 2300 (PDF/65,4Ko) BENDIX PNU-175 User's Manual Copyright © All rights reserved.
Failed to retrieve file