Home

Webanwendungen mit PHP 4.0 entwickeln

image

Contents

1. Server B Server D Server E Server C Abbildung 3 2 Eine IRC Netzwerkstruktur 135 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel Dies ist eines der Hauptprobleme des Netzwerks das durch das Konzept begrenzt ist Der gesamte ffentliche Datenverkehr muss an alle Server gehen Taucht dieses Problem jedoch tats chlich unter den Bedingungen auf unter denen wir unser IRC Netzwerk installieren wollen Sicher nicht denn die Anzahl der Clients mit der wir umgehen m ssen wird nie so gro sein dass sie zu einem Problem wird vorausgesetzt wir verwenden einen Standard Host In internen Netzwerken sollte dieses Problem berhaupt nicht auftreten Um die Gesamtanzahl der kritischen Verbindungen zu reduzieren kann das Netzwerk so konzipiert werden dass es seiner physikalischen Topologie folgt Wenn ein Server mit einer h heren Kapazit t als die anderen Server angeschlos sen wird kann er beispielsweise mehr Knoten bekommen als andere viele Knoten an einen Server mit einem kleinen Backbone anzuh ngen macht nicht viel Sinn Eine weitere M glichkeit ist das Routing an das Netzwerk anzupas sen Amerikanische Server haben beispielsweise ihren Sitz in den Vereinigten Staaten deutsche Server in Deutschland usw Frankfurt hat eine berseever bindung nach New York Der IRC Server in Frankfurt sollte daher mit dem New Yorke
2. 235 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien Allerdings arbeitet sie jetzt nicht mehr an der aktuellen Version der Datei so dass eine Vermengung offensichtlich notwendig ist Wenn Jane versucht Ihre Version zur ck zu bertragen gibt CVS folgende Warnung aus jane dev home jane f api gt cvs commit config inc php3 cvs server Up to date check failed for config inc php3 cvs server aborted correct above errors first cvs commit saving log message in tmp cvs07789baa Dies bedeutet dass Jane ihre lokale Version aktualisieren muss bevor sie diese an das zentrale Datenarchivr zurtickschicken kann jane dev home jane f api gt cvs update config inc php3 RCS file usr local cvsroot config inc php3 config inc php3 v retrieving revision 1 3 retrieving revision 1 5 Merging differences between 1 3 and 1 5 into config inc php3 rcsmerge warning conflicts during merge cvs server conflicts found in config inc php3 C config inc php3 Hier haben wir einen Fall bei dem ein automatischer Abgleich nicht m glich ist Statt dessen erzeugt CVS eine spezielle Version der Datei die Markierun gen enthalt die auf die widerspriichlichen Abschnitte hinweisen In diesen markierten Abschnitten zeigt CVS die lokale Version des betreffenden Abschnitts und die Version aus dem zentralen Archiv lt lt lt lt lt lt lt config inc php3 define FT ZIP ARCHIVE ZIP _ARC
3. 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 html gt else translate input function to PHP code parsed_function parse_function function_string NOTE security holes see book contents eval parsed_function create image image create_image 123 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax plot the function for x PLOT_MIN x lt PLOT_MAX x PLOT_STEP y calculate req_code x 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
4. Abbildung 3 9 Chat System mit Plugins Entwerfen Sie zumindest theoretisch Ihr eigenes Plugin System Schreiben Sie ein minimales Programm das Plugins registrieren und ausf hren kann Beim Hochfahren f gt phpChat eine Include Datei ein die ihrerseits alle gew nschten Plugins integriert Listing 3 3 zeigt wie diese Include Datei funktioniert rn Plug in Integrator LLTTTLLLLTLTTTT LLL LLL TTT ATLL TTT TATA TT TATA TATA TTA include chat_plugin_out_htmlspecialchars php3 include chat_plugin_out_link transform php3 include chat_plugin_out_colorcodes php3 include chat_plugin_clock php3 153 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel include chat_plugin_cmd_basic php3 include chat_plugin_out_basic php3 FILLTLTTLTLTTLT TTT TTT TTT TATA TTA TAT ATT TTT ATA ATT TT Listing 3 3 Die Include Datei als Plugin Alle Plugins sind auf dieselbe Weise aufgebaut Sie bestehen aus einem Hauptteil und einem Ereignisteil Der Hauptteil ruft in PHP zwei Funktionen mit den folgenden Namen auf chat_register_plugin_init und chat_ register_plugin_deinit Jede der Funktionen akzeptiert als Parameter den Namen einer weiteren Funktion die fiir die Initialisierung bzw Deinitialisie rung aufgerufen werden sollen phpChat f gt diese Funktionsnamen in eine interne Tabelle ein Bei der Initia lisierung des Chat durchl uf
5. Assign action to form which points to ourselves tpl gt assign ACTION this gt url Output the parsed template tpl gt easy_print 276 Pearson Education function auth_va Global fo global user If usern Set the uid false this gt a if isset username A ADDISON WESLEY Authentisierung lidatelogin rm variables name password ame is set remember it uth uname username uid to false by default Select rows corresponding to the submitted username password query SELE FROM t WHERE u A Execute q this gt db gt q CT his gt database table sername username D password password uery uery query If one row was returned the user is authenticated if this gt db this gt d Set u uid this gt a this gt a return uid Listing 6 5 Erweiterung gt num_rows 1 b gt next_record p uid and this gt auth array this gt db gt Record user_id uth uid uid uth uname this gt db gt Record username der Auth Basisklasse 277 Pearson A ADDISON WESLEY Education 6 Datenbankzugriff mit PHP Intern verwendet Auth die beiden Klassenvariablen database class und database_table um Session und Authentisierungsdaten zu speichern Sie haben keinen Einfluss auf den Authentisierungsvorgang Die Anmeldu
6. Does this element already exist in the global elements array if lisset elements name No add a new instance of class element element new element elements name element Increase this element s count elements name gt count Is there a parent element if Cisset stackLcount stack 1 Yes set last_element to the parent last_element stackLcount stack 1 If there is no entry for the parent element in the current element s parents array initialize it to 0 if isset elements name gt parents last_element Increase the count for this element s parent elements name gt parents last_element elements name gt parents last_element If there is no entry for this element in the parent s elements child array initialize it to 0 if lisset elements last_element gt chi lds name Increase the count for this element parent in the parent s childs array elements last_element gt childs name elements last_element gt childs name 323 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Add current element to the stack array_push stack name function stop_element parser name global stack Remove last element from the stack array_pop stack function char _data parser data global elements stack depth
7. Kapitel 8 Fallstudien Erfolgsberichte k nnen extrem hilfreich sein wenn eine neue Technologie in einer Firmenumgebung eingef hrt wird In Kapitel 8 stellen wir Fallstudien vor in denen Six Open Systems BizChek und Marketplayer com vorkommen drei gro e Beispiele aus Hunderten von Firmen in denen PHP erfolgreich in anspruchsvollen Szenarios verwendet wurde Kapitel 9 Erweiterung von PHP 4 0 Erweiterung des Kerns von PHP Reichen mehr als 1 200 Funktionen f r Sie immer noch nicht aus Kein Pro blem denn dieses Kapitel ist die offizielle Dokumentation f r die Erweite rung von PHP Wenn Sie sich etwas mit C auskennen gibt Ihnen Kapitel 9 einen komprimierten Einblick in die Interna von PHP 4 0 und zeigt Ihnen wie Sie Ihre eigenen Module schreiben um PHPs Funktionalit t zu erweitern In diesem Buch verwendete Konventionen Folgende Konventionen werden in diesem Buch verwendet Konvention Verwendung Kursiv Neue Begriffe werden definiert Dicktengleiche Befehle Syntaxzeilen usw sowie Internetadressen wie z B Schrift www phpwizard net w Die Syntax l uft ber mehr als eine Zeile die so markierte Zeile setzt die vorangegangene fort 25 Pearson A ADDISON WESLEY Education Pearson A ADDISON WESLEY Education Teil 1 PHP f r Fortgeschrittene 1 Entwicklungskonzepte 2 Erweiterte Syntax 3 Programmentwicklung ein Praxisbeispiel Pearson A ADDISON WESLEY Education
8. event_list calendar_get_event_list required_range for i 0 i lt count event_list i print Event at event_list iJ time event_list i text lt br gt Die Ausgabe hierzu k nnte folgenderma en aussehen Event at 95859383 Team meeting Event at 95867495 Deadline for Telco project Event at 95888371 XML Seminar Sieht gut aus aber dieser Programmteil hat noch einen schwerwiegenden Fehler In der for Schleife werden die Daten in einem zweidimensionalen Array zur ckgegeben wobei die assoziativen Schl ssel time und text ver wendet werden Die Variablen wurden zuvor aber anders benannt und zwar timestamp f r die Zeit und description f r den beschreibenden Text Ver wenden Sie zur Speicherung eines assoziativen Arrays f r die Schl ssel stets dieselben Namen die Sie f r die entsprechenden Variablen gew hlt haben Im obigen Fall sollte die for Schleife also folgenderma en auf das Array zugreifen function calendar_get_event_list range Retrieve event list 60 Pearson A ADDISON WESLEY Education Zusammenfassung event_list calendar_get_even_list required_range for i 0 i lt count event_list i print Event at event_list iJ timestamp event_list i description lt br gt 1 7 Zusammenfassung Die Entwicklung eines Programms beinhaltet sehr viel mehr als nur den rei nen Code herunterzuschreiben die richtige Syntax einzuhalten
9. Increase character count for the current element elements stackLcount stack 1 gt chars strlen trim data Create Expat parser parser xml_parser_create Set handler functions xml_set_element_handler parser start_element stop_element xml_set_character_data_handler parser char_data xml_parser_set_option parser XML_OPTION CASE FOLDING 0 Parse the file ret xml_parse from_file parser file if ret die sprintf XML error s at line 4d xml_error_string xml_get_error_code parser xml_get_current_line_number parser Free parser xml_parser_free parser Free helper elements unset elements current_element unset elements last_element Sort elements array by element count uasort elements my_sort 324 Pearson Education Loop thro while list print_bo 5 print_li print_li printf Loop while li prin if count Loop printf prin A ADDISON WESLEY PHP und XML ugh all elements collected in elements name element each elements x Element name name ne Element count element gt count ne Character count element gt chars n 20s n Parent elements through the parents of this element output them st key value each element gt parents t_line key value element gt parents 0 tf 35s n root element
10. Listing 5 2 Meldung zur Protokollierung und zum Verschicken einer E Mail Warum verwenden wir berhaupt PHP f r solch ein Kommandozeilenskript Es wurde zwar urspr nglich als Webskriptsprache entworfen hat sich aber soweit fort entwickelt dass es sich auch fiir Aufgaben wie diese eignet Wenn Sie PHP als unabh ngigen Bin rcode kompilieren k nnen Sie ihn als Skript interpreter wie Perl verwenden Auf UNIX Systemen k nnen Sie in der ersten Zeile der Datei den Skriptinterpreter festlegen usr bin php Wenn Sie das auf hrbare Bit hierf r setzen k nnen Sie diese Zeile wie jede andere ausf hrbare Datei in UNiX Systemen aufrufen tobias dev home tobias gt chmod x script php tobias dev home tobias gt script php Unter Windows k nnen Sie dem Interpreter die Dateierweiterung php zuord nen Damit erreichen Sie das gleiche Ergebnis Das Skript zeigt zwei wichtige Konzepte die in Kommandozeilenskripten h ufig verwendet werden der Zugriff auf Argumente die an das Skript ber geben werden und das Einlesen von Standardeingaben PHP errichtet auto matisch ein Array namens argv das als ersten Eintrag den Dateinamen des Skripts enth lt und als weitere Eintr ge alle Argumente des Skripts Dieses Verhalten entspricht jenen in C Genau wie in C gibt es eine weitere Variable argc welche die Anzahl der Argumente angibt Nat rlich k nnen Sie auch count argv verwenden Wenn Sie ein PHP Skript beispielsweise mit
11. 155 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel verfahren erzeugen Auch wenn dies mit einigem Aufwand verbunden ist m chten wir Sie ermuntern als bung eine plugin basierte Anwendung zu erstellen Es wird der M he wert sein Listing 3 4 zeigt eine Plugin Schablone die einen Dummy Plugin als Code basis f r neue Plugins implementiert lt Use these variables to tell the plug in installer how you named your initialization and deinitialization functions This is done to eliminate the need for changing the installer code which would ask for errors plugin_init_function myplugin_init plugin_deinit_function myplugin_deinit 111111111111 TTA TTT TTT TATA TTA ATTA AT TTA TATA ATTA ATT myplugin_idle_callback int code mixed parameter example callback 1111111111111 TT TATA TTT TATA ATT TATA TT ATTA AAT This is an example for a callback function See below on how to register and remove it from the call chain code specifies the reason for invocation parameter contains all callback information The return value should always consist of a modified or unmodified version of the input parameter parameter The return value is used as input parameter for the next callback This allows for multi stage message processing and such FTLLETTTLTTTTLL TTT LTT TT TTT TTT ATTA TTT ATT TATA TTT ATTA TT
12. enable cross conversion Aktiviert das Cross Conversion Modul enable firstmodule Aktiviert das erste Modul enable infoprint Aktiviert das Infoprint Modul enable reference test Aktiviert das Referenztest Modul enable resource_test Aktiviert das Ressourcentest Modul enable variable_creation Aktiviert das Variablenerzeugungsmodul Die in Listing 9 3 aufgef hrten Module k nnen Sie aktivieren durch enable first_module oder enable first_module yes 380 Pearson vy ADDISON WESLEY Education Kompilierung von Modulen 9 7 2 Manuelles Kompilieren Um Ihre Module manuell zu kompilieren ben tigen Sie die folgenden Befehle Aktion Befehl Kompilieren cc fpic DCOMPILE DL 1 I usr local include 1 I I Zend c o lt Ihre Objektdatei gt lt Ihre_C_ Datei gt Verkn pfen cc shared L usr local lib rdynamic o lt Ihre_ Moduldatei gt lt Ihre Objektdatei en gt Der Befehl zur Kompilierung des Moduls weist den Compiler einfach an einen positionsunabh ngigen Code zu generieren fpic sollte nicht wegge lassen werden zus tzlich definiert er die Konstante COMPILE DL die dem Modulcode mitteilt dass es als dynamisch ladbares Modul kompiliert wird das Testmodul oben berpr ft dies wir gehen in K rze darauf ein Nach diesen Optionen gibt er eine Reihe von Standard Include Pfaden an die als Minimalausstattung zur Kompilierung der Quelldateien verwendet werden sollen
13. 266 Pearson A ADDISON WESLEY Education Datenbankabstrahierung 6 2 7 Seiten Caching Mit der Klasse Session k nnen Sie auch steuern wie Seiten im Cache gepuffert werden Die Variable allow_cache kann auf no private oder public gesetzt werden Der Standardwert h ngt von der PHPLib Version ab bei der Version 7 2 ist die Variable standardm ig auf private gesetzt bei h heren Versionen auf no Der Seiten Caching Mechanismus hnelt jenem der mit den urspr nglichen Session Funktionen von PHP 4 0 bereitgestellt wird 6 2 8 Serialisierung In PHP 3 0 konnten Sie Objekte noch nicht einfach serialisieren Die Funktion serialize bewahrte die Klassenmethoden nicht korrekt und es gab keine M glichkeit dies manuell zu tun Der PHP 3 0 Unterst tzung f r Objekte fehlte eine wichtige Funktion Introspektion Es gab keine M glichkeit den Namen einer Klasse oder den Namen seiner Elternklasse zu erfahren Daher musste PHPLib einen Umweg nehmen Es ben tigte Klassen die zwei zus tzliche Werte hatten n mlich classname und persistent_slots Diese gaben den Namen der Klasse bzw der Klassenvariablen f r die Serialisierung an Mithilfe des Klassennamens konnte PHPLib einen PHP Code generieren der eine Instanz der Klasse class new class erzeugt und diese im Datenarchiv spei chert Sobald die Session Daten wieder aufgerufen wurden wurde der Code mit eval ausgef hrt Erinnern Sie sich an das selbstmodifizierende Z hlerbei
14. 4 Webanwendungskonzepte Da Webanwendungen immer gr er und komplexer werden sind Webent wickler mehr denn je gefordert effektive und funktionale Websites zu erstel len Tauglichkeit wird ein Schl sselbegriff f r diese Websites Was ist Tauglichkeit Die Eigenschaft wie einfach ein Informationssystem zu erlernen und zu benutzen ist bezeichnet man als Systemtauglichkeit Als Pro grammentwickler f llt es Ihnen wahrscheinlich leicht Ihr System zu benut zen Aber Sie w ren berrascht wie schwierig es andere Benutzer finden Zun chst sind sie mit dem neuen System absolut nicht vertraut und versu chen m glicherweise es f r andere Dinge zu verwenden als Sie beabsich tigten Tauglichkeitsexperten haben versucht Eignungsfragen bereits in einem fr hen Stadium der Softwareentwicklung einflie en zu lassen Dies war jedoch nicht sehr erfolgreich Die Eignung spielt jedoch mit Beginn jedes Projektes eine gro e Rolle Diese berlegung erst in der Beta Testphase einzubringen reicht nicht aus Unserer Meinung nach sollte der Tauglichkeit dieselbe Bedeutung wie den traditionellen Merkmalen der Softwarequalit t beigemes sen werden wie etwa Korrektheit Pflege und Zuverl ssigkeit Sobald Ihnen als Softwareentwickler bewusst ist wie wichtig die Tauglichkeit f r die Siche rung der Programmqualitat ist werden Sie sich bem hen die Erfahrung des Benutzers zu f rdern Wie Sie die Tauglichkeit Ihres Programms verbessern k nnen
15. All dies f hrt zur Schlussfolgerung dass es m glicherweise kl ger ist eine andere L sung zu bevorzugen wenn Sie es nicht gerade mit sehr einfachen Szenarien zu tun haben bei denen Sie wissen dass Ihr Publikum diese Dia loge kennt und Sie keine Genehmigungsebenen oder Leerlauf Timeouts ben tigen PHP Authentisierung Die PHP eigene Authentisierung erm glicht Ihnen dagegen beliebige Anmeldemasken und Berechtigungsprozeduren zu verwenden da sie formu larbasiert arbeitet Damit die Berechtigung funktioniert brauchen Sie auch Sitzungsverwaltungsfunktionen Sobald der Benutzer angemeldet ist m s sen Sie sich diesen Status ber mehrere Anfragen hinweg merken Sie k nnen sich eine eigene Authentisierungsbibliothek schreiben wenn Sie daf r die zuvor besprochenen PHP Sitzungsverwaltungsfunktionen verwen den Oder Sie benutzen PHPLib Mit seiner Klasse Auth k nnen Sie die Authentisierung durchf hren und mit der Klasse Perm k nnen Sie alle Zugriffsrechte vergeben Einzelheiten ber die genaue Vorgehensweise fin den Sie in Kapitel 6 4 3 Die Bedeutung der Tauglichkeit Sie wundern sich vielleicht warum in einem Buch ber Softwareentwicklung das Thema Tauglichkeit angeschnitten wird Wir halten es f r notwendig dass ein ernsthafter Entwickler die grundlegenden Prinzipien f r die Infor mationsarchitektur der Entwicklung von Benutzerschnittstellen und der Tauglichkeit kennen 207 Pearson A ADDISON WESLEY Education
16. Amount to be converted curr_from DEM ISO currency symbol of original currency curr_to ITL Symbol of the target currency Instantiate new COM object conv com _load Softwing EDConverter or die Unable to instantiate wEuro Converter Execute a component method on the COM object s instance ret com_invoke conv Triangulate 10000 ITL DEM or wdie Exception triggered by Triangulate on line _ LINE Print the result print ret Listing 5 5 Ein einfaches COM Beispiel mit PHP 3 0 Diese Funktionen die in PHP 4 0 nicht verf gbar sind haben folgende Syn tax int com _load String component _name Generiert eine Instanz der Komponente COM und erzeugt eine Referenz dar auf Der zur ckgegebene ganzzahlige Wert muss in den folgenden com_ Aufrufen verwendet werden Gibt bei einem Fehler false zur ck und emittiert eine Warnung mixed com invoke Int com identifier String function_name mixed argumentl 1 Ruft die Methode einer COM Komponente auf und gibt den R ckgabewert der Methode zur ck Das erste Argument der Funktion ist ein g ltiger COM Bezeichner der mit com_load erzeugt wurde Das zweite Argument muss 254 Pearson A ADDISON WESLEY Education Dreistufige Anwendungen der Name einer Komponentenmethode sein Optional k nnen Sie in das dritte und alle folgenden Argumente die Argumente f r die aufgerufene Methode eingeben Bei einem Fehler gibt die F
17. Education 7 Anwendungen der Spitzentechnologie Die erste Zeile definiert das Startsymbol mit den folgenden Sequenz ein optionales Vorzeichen entweder oder ein oder mehrere Elemente der D Produktion optional ein Punkt und wieder ein oder mehrere Elemente der D Produk tion Beachten Sie dass Operatoren in EBNF auch f r Symbolgruppen verwendet werden k nnen D bedeutet dass dieser Ausdruck optional ist Die zweite Zeile liest zun chst die Endwerte Atome der D Produktion in diesem Fall die Ziffern Null bis Neun Die Syntax entspricht jener f r regul re Ausdr cke Ein Bereich wird in eckigen Klammern angegeben Die dritte Zeile definiert die beiden m glichen Zeichen Das Zeichen A B kennzeichnet Alternativen A oder B aber nicht beides Dies ist eine sehr einfache Erkl rung von EBNF Die XML Spezifikation ent h lt weitere Definitionen zur Syntax z B Randbedingungen f r G ltigkeit und Wohlgeformtheit Betrachten Sie hierzu den Abschnitt Notation der Spezifikation Deshalb gehen wir hier nicht n her darauf ein Weitere Infor mationen zu EBNF finden Sie in jedem modernen Compilerbuch G ltigkeit und Wohlgeformtheit Es gibt zwei Arten von XML Dokumenten die bestimmte Bedingungen erf l len g ltige Dokumente und wohlgeformte Dokumente Ein XML Dokument ist wohlgeformt wenn es den grundlegenden Syntaxrichtlinien von XML ent spricht Es enth lt ein Stammelement und eine beliebige Anzahl v
18. ZEND_GSHUTDOWN module Deklariert eine Funktion zur globalen Deinitialisie rung Der erzeugte Name lautet zend_gshutdown_ lt module gt z B zend_gshutdown_first_module Zu verwenden in Verbindung mit ZEND_GSHUTDOWN_ FUNCTION ZEND_MINFO module Deklariert eine Funktion zur Ausgabe von Mo dulinformation die beim Aufruf von phpinfo verwendet wird Der erzeugte Name lautet zend_ info_ lt module gt z B zend_info_first_module Zu verwenden in Verbindung mit ZEND_MINFO_ FUNCTION Tab 9 3 Makros zur Deklaration der Initialisierungs und Deinitialisierungsfunktionen 9 10 6 Einbettung von get_module Diese Funktion ist speziell f r alle dynamisch ladbaren Module gedacht Betrachten wir zun chst wie sie installiert wird if COMPILE DL DLEXPORT zend module entry get_module void return amp firstmod_module entry endi f Die Funktionsdefinition ist in eine bedingte Kompilierungsanweisung einge fasst Dies ist erforderlich da die Funktion get_module nur dann ben tigt wird wenn Ihr Modul als dynamische Erweiterung generiert wird Durch Angabe der Definition von COMPILE_DL im Compilerbefehl eine Er rterung der zur Generierung einer dynamischen Erweiterung erforderlichen Kompilie rungsbefehle finden Sie weiter oben k nnen Sie Ihr Modul anweisen ob Sie es als dynamische Erweiterung oder als eingebautes Modul realisieren wollen Bei einem eingebauten Modul wird get_module einfach nicht eingebun
19. we did not encounter the end of the file so read next element data_element fgetc file_handle return success return 1 r th defin th g j include compressor and decompressor include compressor php3 110 Pearson A ADDISON WESLEY Education 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 fclose 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 111 Pearson A ADDISON WESLEY Education 2 Erweite
20. 0 assign node back to array to update the tree tree_array i node now return this node s index as handle return 1 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_array node return new index as handle return count tree_array 1 function tree_free_node amp tree_array handle 95 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax retrieve node from tree node tree_array 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 assign node back to tree tree_array handle node return 1 function tree_link_left amp tree_array link_to child retrieve nodes link_node tree_array link_to child_node tree_array 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
21. 1 zend_get_parameters_ex 1 amp parameter SUCCESS WRONG_PARAM_ COUNT 400 Pearson A ADDISON WESLEY Education Annahme von Argumenten convert_to_long_ex parameter RETURN_LONG parameter gt value 1val XY Netscape iof x File Edit View Go Communicator Help Running conversion for type string Original contents hello Condition Converting to boolean Variable contents 1 isset TRUE emptyQ FALSE gettypeQ boolean Condition Converting to long Variable contents 0 isset TRUE emptyQ TRUE gettypeQ integer Condition Converting to double Variable contents 0 isset TRUE Document Done Abbildung 9 5 Cross Conversion Verhalten von PHP Nach Anfrage des Parameterzeigers wird der Parameterwert in einen Long konvertiert einen Integer der auch den Riickgabewert dieser Funktion bil det Um den Zugriff auf den Inhalt des Wertes zu verstehen sollten wir uns kurz mit dem Typ zval befassen dessen Definition Sie in Listing 9 8 sehen typedef pval zval typedef struct _zval_struct zval typedef union _zvalue_value long Ival long value double dval double value struct char val 401 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern int len str HashTable ht hash table value struct zend_class_entry ce HashTable properties obj zvalue_va
22. Check submitted email address if is_email form email print lt div align center gt errors email The email address you entered is not valid 222 Pearson A ADDISON WESLEY Die PHP Normal Form Education Can the form be processed or are there any errors if count errors 0 print The form has been processed lt p gt printf Name s lt br gt form name printf Email s lt br gt form email phpBook_footer exit else print lt div gt message There were some errors Please see below for details Create a new EasyTemplate class template new EasyTemplate PHP_Normal_Form inc html Assign template values late gt assign HEADER message late gt assign ACTION basename PHP_SELF ate gt assign NAME VALUE isset form name form name ate gt assign EMAIL VALUE isset form L email forml email ate gt assign NAME ERROR sprint_error errors name late gt assign EMAIL_ERROR sprint_error errors email is OO 0 OO OD uU 5 int the template template gt easy_print or die template gt error Listing 5 1 Beispiel f r ein PHP Standardformular Tipp REQUEST_METHOD ist offensichtlich eine globale Variable und daher innerhalb von Funktionen nicht verf gbar Innerhalb von Funktionen grei fe
23. Education Datenaustausch mit WDDX 7 3 1 Datenaustausch ber das Web WDDX WDDX Web Distributed Data eXchange ist eine offene Technologie die von Allaire Corporation entwickelt wurde Es handelt sich hier um ein XML Vokabular das einfache und komplexe Datenstrukturen wie Zeichenketten Arrays und Datens tze auf generische Art beschreibt so dass diese zwischen verschiedenen Webskriptplattformen durch die Verwendung von HTTP hin und hertransferiert werden k nnen PHP unterst tzt WDDX genau wie die meisten anderen bekannten Webskriptsprachen wie z B Perl ASP und Cold Fusion 7 3 2 Die Herausforderung Nachdem Webanwendungen eine zunehmend gr ere Rolle in der Software welt spielen ist eine der gr ten Herausforderungen der Datenaustausch zwischen verschiedenen Programmierumgebungen Das neue Web f rdert verteilte und vernetzte Anwendungen Es begann mit einfachen Websites die statische Informationen enthielten Sie wurden zu anspruchsvolleren dyna mischen Webanwendungen und inzwischen beginnen diese Webanwendun gen zusammenzuarbeiten Daten auszutauschen und zus tzliche program mierbare Dienste anzubieten Erst vor kurzem tauchten offene Standards wie XML auf Sie verbreiteten sich so schnell dass Hersteller gezwungen waren diese Standards in ihrem Produkten zu bernehmen Durch die Erweiterung von Webanwendungen um offene Programmier schnittstellen f r den Daenaustausch und die Modifikation von Daten
24. Hinweis Alle Include Pfade im Beispiel sind relativ zum Verzeichnis ext angegeben Wenn Sie die Kompilierung aus einem anderen Verzeichnis heraus durchf hren ndern Sie die Pfadnamen entsprechend Als Kompo nenten ben tigen Sie das PHP Verzeichnis das Zend Verzeichnis und sofern erforderlich das Verzeichnis in dem sich Ihr Modul befindet Der Verkn pfungsbefehl ist ebenfalls ein grundlegender Befehl der eine Ver kn pfung als dynamisches Modul vorschreibt Sie k nnen Optimierungsoptionen in den Kompilierungsbefehl einschlie en auch wenn sie in diesem Beispiel weggelassen wurden einige sind in der makefile Schablone angegeben die wir in einem fr heren Abschnitt beschrie ben haben Hinweis Die manuelle Kompilierung und Verkn pfung als statisches Modul in die PHP Bin rdatei f hrt zu sehr langen Anweisungen und wird daher hier nicht er rtert Es ist nicht sehr effizient all diese Befehle einzu tippen 381 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern 9 8 Erweiterungen verwenden Je nachdem welchen Erstellungsprozess Sie ausgew hlt haben sollten Sie am Ende entweder eine PHP Bin rdatei die mit Ihrem Webserver verkn pft ist oder als CGI ausgef hrt wird oder eine so Shared Object Datei haben Wenn Sie die Beispieldatei first_module c als Shared Object kompiliert haben sollte die erzeugte Datei first_module so lauten Um diese zu verwenden m ssen Si
25. meterinhalte als Werte NULL Werte werden in ei nen leeren Array umgewandelt Alle anderen Werte werden in ein Array umgewandelt in dem der Quellwert in dem Element mit dem Schl ssel 0 abgelegt wird convert _to_object_ex Wert Erzwingt die Konvertierung in ein Objekt Objekte bleiben unver ndert NULL Werte werden in ein leeres Objekt umgewandelt Arrays werden in Objekte konvertiert indem ihre Schl ssel als Para meter und ihre Werte als entsprechende Parame terinhalte des Objekts integriert werden Alle an deren Typen werden zu einem Objekt mit dem Pa rameter scalar der den entsprechenden Quellwert enth lt convert _to_null_ex Wert Erzwingt die Konvertierung in einen NULL Wert d h leer Tab 9 4 Funktionen zur Argumentenkonvertierung Hinweis Eine Demonstration hierzu finden Sie in cross_conversion php auf der beiliegenden CD ROM Abbildung 9 5 zeigt die Ausgabe Wenn Sie diese Funktionen auf Ihre Argumente anwenden k nnen Sie die Typen der Daten die an Sie bergeben werden sicher festlegen Wenn der gelieferte Typ nicht dem ben tigten Typ entspricht erzwingt PHP im erzeug ten Wert einen Dummy Inhalt leere Strings Arrays oder Objekte 0 f r nume rische Werte FALSE f r boolesche Werte um einen definierten Status zu gew hrleisten Der folgende Ausschnitt stammt aus dem bereits besprochenen Beispielmo dul das die Konvertierungsfunktionen nutzt zval parameter if ZEND_NUM ARGSC
26. 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 Standardargumente 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 ein zigen 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
27. pr ft Die Bewerter verwenden nicht das eigentliche System Sie nutzen die Heuristik als Pr fliste und versuchen so viele Angriffe auf diese zu finden wie m glich Dieser Ansatz sollte daher nur als Zusatz zu den anderen Taug lichkeitspr fverfahren eingesetzt werden 215 Pearson vy ADDISON WESLEY Education 4 Webanwendungskonzepte Zehn heuristische Tauglichkeitspr fungen nach Jakob Nielsen www useit com papers heuristic heuristic_list htm1 Sichtbarkeit des Systemstatus Das System soll den Benutzer tiber entsprechende Riickmeldungen innerhalb einer angemessenen Zeit stets dar ber informieren was vor sich geht Abstimmung zwischen dem System und der realen Welt Das System sollte keine systembezogenen Begriffe verwenden sondern in der Sprache des Benutzers sprechen und dabei Worter Phrasen und Konzepte verwenden die der Benutzer kennt Es sollte praxis bliche Konventionen verwenden und Informationen in nat rlicher und logischer Reihenfolge anzeigen Benutzerkontrolle und Freiheit Benutzer w hlen h ufig versehentlich falsche Systemfunktionen und brau chen deutlich markierte Notausg nge um den ungew nschten Zustand zu verlassen ohne dabei einen langen Dialog durchlaufen zu m ssen Unterst t zen Sie die Funktionen r ckg ngig und wiederherstellen Konsistenz und Standards Benutzer sollten nicht raten m ssen ob verschiedene W rter Situationen oder Aktionen dasselbe bedeuten Halten Sie
28. teil einbetten der diese am wenigsten ben tigte Diese Konstrukte kosteten 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 verf gbaren Rechenkapazit t 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 Gesamtleistung verbessern aber eine optimale Leistung erreichen Sie nicht Deshalb wurde die Technik des selbstmodifizierenden Programmcodes ein gef 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 Prog
29. through the childs of this element output them n 20s n Child elements while list key value each element gt childs prin if count total_e prin t_line key value element gt childs 0 tf 35s n no childs lements element gt count total_chars element gt chars Final summary print_box Total elements total elements print_box Total characters total_chars Listing 7 3 XMLStats Erfassung von statistischen Daten ber ein XML Dokument Diese Anwendung verwendet Expat um statistische Daten ber ein XML Dokument zu erfassen F r jedes Element gibt dieser eine Reihe von Informa tionen aus 325 Pearson vy ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie H ufigkeit dieser Information im Dokument Anzahl der Zeichendaten in diesem Element Alle gefundenen Elternelemente Alle Tochterelemente Hierf r muss das Skript zumindest das Elternelement des aktuellen Elements kennen Wenn Sie einen normalen XML Parser verwenden ist dies nicht m g lich Sie erhalten nur Ereignisse f r das aktuelle Element Es werden aber keine Kontextinformationen aufgezeichnet Deshalb m ssen wir eine eigene Stapelstruktur errichten Wir h tten einen FIFO Stapel First In First Out mit zwei Elementen verwenden k nnen aber um Ihnen einen besseren Eindruck ber die Elementverschachtelung in einer Datenstruktur zu vermitteln h
30. zval value ht Z_LVAL_P zval zval value 1val Z_DVAL_P zval zval value dval Z_STRVAL_P zval_p zval value str val Z_STRLEN_P zval_p zval value str len Z_ARRVAL_P zval_p zval value ht Z_LVAL_PP zval_pp zval value lval Z_DVAL_PP zval_pp zval value dval Z_STRVAL_PP zval_pp zval value str val Z_STRLEN_PP zval_pp zval value str len Z_ARRVAL_PP zval_pp zval value hat Tab 9 19 Neue API Makros f r den Zugriff auf zval Container Updates zu diesem Kapitel finden Sie unter http www phpwizard net 438 A Pearson wW y ADDISON WESLEY Education Stichwortverzeichnis A ActiveX Elemente 252 Analyse physikalische logische des Textes 35 Argumente listen variable 112 Argumentenkonvertierung 399 Arrays 413 ASP im Vergleich zu PHP 350 356 assoziatives Array 67 101 Attribute 309 Attr Knoten DOM 330 Ausf hrungsinformationen 428 429 Authentisierung des Benutzers 204 HTTP 206 PHP 207 Auth Klasse PHPLib 274 Automatischer R ckfallmodus 266 B BCD Binary Coded Digits 58 Befehl cvs checkout 234 240 248 cvs commit 248 cvs diff 238 248 cvs log 248 cvs login 248 cvs remove 248 cvs status 241 248 cvs update 241 248 Benutzerfunktionen 430 Berners Lee Tim 165 Bezeichner 65 Bibliothek 257 versus Anwendung 152 Binary Coded Digits BCD 58 BizChek com 349 b swilliger Code 190 Boolesche Werte Variablen 413 e Caching 183 267 CBC Cipher
31. 113 Pearson A ADDISON WESLEY Education 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 zugreifen 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_array il lt br gt show _arguments Leftmost Middle Rightmost Die Funktion func_num_args gibt die Anzahl der bergebenen Argumente zur ck func_get_arg gibt ein spezifisches Argument zur ck func_get_ arg 0 w rde beispielsweise das erste Argument zur ckgeben Variable Variablennamen Variable Variablennamen F r 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 folgend
32. 437 439 Pearson A ADDISON WESLEY Education ber die Autoren Tobias Ratschiller ist Berater f r neue Medien in einer italienischen Firma Er verf gt ber umfassende Kenntnisse im Bereich Software Entwicklung Datenbank Design sowie Content Management Systeme und ist spezialisiert auf die Erstellung von umfangreichen dynamischen Websites Er installierte einige der weltweit gr ten Websites oder trug beratend dazu bei Des weite ren wirkte er bei mehreren B chern und Artikeln ber PHP mit leitet Semi nare in ganz Europa und ist h ufig Referent auf f hrenden Konferenzen Till Gerken ist freier Entwickler und Berater f r verschiedene Unternehmen die sich auf die Erstellung von Webanwendungen f r Internet basierte Dienstleistungen spezialisiert haben Er beherrscht sowohl C C Pascal und x86 Assembler mit denen er leistungsf hige Multimedia Systeme wie 3D Prozessoren und Echtzeit Tonmischer generieren kann als auch PHP und verwandte Werkzeuge zur Erstellung von mittleren bis gro en dynamischen Websites ber den Technischen Berater Mit seinem unsch tzbaren Praxiswissen begleitete Graeme Merrall den gesamten Erstellungsprozess des Buches Web Application Development with PHP 4 0 Nachdem das Buch geschrieben war berpr fte er den gesamten Inhalt auf fachliche Korrektheit Aufbau und Textfluss Er lieferte wichtiges Feedback um sicherzustellen dass Web Application Develop ment with PHP 4 0 den Anspr
33. 9 3 1 Externe Module Externe Module k nnen mithilfe der Funktion d1 zur Laufzeit des Skripts geladen werden Diese Funktion l dt ein gemeinsam genutztes Objekt Shared Object von der Festplatte und stellt seine Funktionalit t dem Skript zur Verf gung an das es gebunden ist Nachdem das Skript beendet ist wird das externe Modul aus dem Speicher entfernt Diese Methode hat sowohl Vor als auch Nachteile wie die folgende Tabelle zeigt Vorteile Nachteile Externe Module erfordern kein erneutes Die Shared Objects m ssen jedes Mal Kompilieren von PHP geladen werden wenn ein Skript ausge f hrt wird bei jedem Treffer was die Ausf hrung verlangsamt Durch Auslagern bestimmter Funktio Zus tzliche externe Dateien f llen die nen bleibt PHP relativ klein Festplatte Jedes Skript das die Funktionalit t einer externen Funktion nutzen m chte muss einen Aufruf f r d1 enthalten oder das Tag extension in php ini muss mo difiziert werden was nicht immer eine gute L sung ist Alles in allem eignen sich externe Module hervorragend f r die Produkte Dritter f r kleine Zus tze zu PHP die selten benutzt werden oder f r Test zwecke Um zus tzliche Funktionen schnell zu entwickeln liefern externe Module die besten Ergebnisse Bei h ufiger Nutzung gr eren Anwendun gen oder komplexeren Codes berwiegen jedoch die Nachteile 369 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP
34. Document Knoten DOM 329 DocumentType Knoten DOM 329 DOM Document Object Model 287 327 Doubles Variablen 412 Downstream Kommunikation 143 DTDs Document Type Definitions 302 E EBNF Extended Backus Naur Form 315 ECB Electronic Code Book 202 eingebaute Module 370 Elemente Tags 309 Element Knoten DOM 329 E Mail Adressen 224 Uberpriifung 224 Entity Knoten DOM 330 EntityReference Knoten DOM 330 Erdmann Boris Entwicklung von PHPLib 258 440 A ADDISON WESLEY Stichwortverzeichnis ereignisbasierte API Expat XML Parser 287 302 317 ereignisbasierte Verarbeitung 140f Erweiterung von PHP 367 Expat XML Parser 287 302 317 exportierte Funktionen 393 Extended Backus Naur Form EBNF 315 Extensible Markup Language XML 287 externe Module 369 ext Verzeichnis 372 F Fall Through Mechanismus 398 Fehlercodes 103 Fehlersuche 383 Fehlersuchmodus 262 Flags setzen 147 149 Frames 150 funktionale Zerlegung 291 Funktionsnamen Auswahl von 48 variable 116 G GET 191 globale Variablen erzeugen 420 Grammatikdefinitionen 314 g ltige versus wohlgeformte Dokumente 313 H Headerdateien 372 384 einbinden 361 Heuristische Auswertung 215 HTML Hypertext Markup Language 287 HTML Schablonen 227 HTTP Hypertext Transfer Protocol 166 HTTP Authentisierung 206 Hypertext Transfer Protocol HTTP 166 Education I Identifizierung des Benutzers 204 indiziertes Array 67 101 Ini
35. GZip Archive not PkZip compatible define FT_ZIP ZIP_ARC GZip Archive gt gt gt gt gt gt gt 1 3 Die erste Gruppe zeigt Janes Version die zweite die Version aus dem Archiv Es ist nun Janes Aufgabe den Code durchzusehen und die Konflikte zu behe ben Dies kann einfach darin bestehen dass nur die Anderungen des anderen Entwicklers in der lokalen Version hinzugefiigt werden miissen oder aber auch so komplex dass sie mit anderen Projektmitgliedern in einem Telefonge spr ch oder einer Besprechung gekl rt werden m ssen Auch in unserem ein fachen Beispiel m sste Jane wahrscheinlich mit John R cksprache halten um zu erfahren warum er die Konstante von FT_ZIP_ARCHIVE auf FT_ZIP gek rzt hat Sobald Jane alle problematischen Stellen bereinigt hat kann sie die Datei an das Archiv zur ckschicken und CVS wird es akzeptieren jane dev home jane f api gt cvs commit config inc php3 236 Pearson vy ADDISON WESLEY Education Versionsverwaltung mit CVS Nun kann John wiederum seine lokale Version mithilfe der vereinheitlichten Version aus dem Archiv aktualisieren und damit diese Bearbeitungsstufe beenden Manuelle Abgleiche kommen nur selten vor wir haben festgestellt dass Sie diese meistens vermeiden k nnen wenn Sie eine entsprechende Kommuni kation zwischen den Teammitgliedern pflegen und f rdern Die seltenen Konflikte die tats chlich Kopfschmerzen bereiten sind nahezu ausschlie lich auf
36. Hinzufiigen eines Elements in einen indizierten Array do error handling here Um die Funktionalit t von add_next_index_ zu emulieren k nnen Sie fol gende Programmzeile verwenden zend_hash_next_index_insert ht zval new_element sizeof zval NULL Hinweis Um mit einer Funktion einen Array zuriickzugeben verwenden Sie array_init und f r die folgenden Aktionen die vordefinierte Variable return_value die als Argument Ihrer exportierten Funktion angegeben wird siehe hierzu die fr here Er rterung der Aufrufschnittstelle Sie m s sen hierf r nicht MAKE_STD_ZVAL verwenden Tipp Um zu vermeiden dass Sie jedes Mal new_array gt value ht schreiben m ssen k nnen Sie HASH OF new_array verwenden dies ist auch aus Kom patibilit tsgr nden empfehlenswert und zeugt von gutem Programmierstil 9 13 Objekte Da Objekte in Arrays konvertiert werden k nnen und umgekehrt haben Sie m glicherweise schon vermutet dass Objekte in PHP gro e hnlichkeit mit Arrays haben Objekte werden mit denselben Hash Funktionen gepflegt die API zur Generierung von Objekten ist jedoch eine andere Um ein Objekt zu initialisieren verwenden Sie die Funktion object_init zval new object MAKE_STD_ZVAL new_object if object_init new_object SUCCESS 417 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern do error handling here Sie k nnen die in Tabelle 9
37. Lesezeichen oder Suchmaschinen auf Ihre Website sto en Sie k nnen auch nicht erwarten dass der Benutzer ein Handbuch liest um sich mit Ihrer Webanwendung vertraut zu machen wie es bei traditionellen Programmen blich ist denn Benutzer wechseln h ufig sehr schnell von einer Site zur n chsten Die Hypertext Struktur verleitet den Benutzer h ufig dazu das Web als Ganzes und nicht als separates Programm oder einzelne Website zu benutzen Die grundlegenden Entwicklungsprinzipien aus Usability 101 sind in bezug auf die Tauglichkeit nach wie vor g ltig und wir sollten auf einige der generischen Regeln eingehen Die folgenden Richtlinien h ngen voneinander ab Sie sollten anhand Ihres spezifischen Programms entscheiden welchen Rang Sie den einzelnen Regeln geben Eine benutzerfreundliche Webanwendung zeichnet sich durch folgende Merkmale aus Sie eignet sich f r die Aufgabe die es durchf hren soll Sie l sst sich durch den Benutzer kontrollieren Sie entspricht der Benutzererwartung Sie ist benutzerspezifisch Sie ist selbsterkl rend Ist es geeignet Das Programm sollte dem Benutzer auf effektive und effiziente Weise helfen sein Ziel zu erreichen Benutzer interessieren sich in der Regel nicht f r ausge fallene Grafiken sie wollen lediglich ihr Ziel erreichen egal ob dies nun der Erhalt von Informationen ist oder etwas Spezielleres wie etwa das Bestellen eines Produktes In einem Online Shop sollte das Syst
38. ZVAL_DOUBLE new double 3 45 9 12 4 Strings Strings sind etwas aufwendiger Wie zuvor bereits erw hnt m ssen alle Strings die mit den internen Datenstrukturen von Zend verkn pft werden sollen ber Zends eigene Speicherverwaltungsfunktionen zugewiesen wer den Das Referenzieren von statischen Strings oder Strings die mit Standard routinen zugewiesen wurden ist nicht zul ssig Um Strings zuzuweisen m ssen Sie auf die Struktur str im zval value Container zugreifen Der ent sprechende Typ lautet IS_STRING zval new_string char string_contents This is a new string variable MAKE_STD_ZVAL new_string new _string gt type IS_STRING new_string gt value str len strlen string_contents new_string gt value str val estrdup string_contents Beachten Sie hier die Verwendung von Zends estrdup Alternativ konnen Sie auch das vordefinierte Makro ZVAL_STRING verwenden zval new_string char string_contents This is a new string variable MAKE_STD_ZVAL new_string ZVAL_STRING new_string string_contents 1 412 Pearson A ADDISON WESLEY Education Erzeugen von Variablen ZVAL_STRING besitzt einen dritten Parameter dieser gibt an ob der bereitge stellte Stringinhalt dupliziert werden soll mithilfe von estrdup Durch Set zen dieses Parameters auf 1 wird der String dupliziert bei 0 wird lediglich der bereitgestellte Zeiger f r den Variableninhalt verwendet Dieses Makro ist insbeso
39. amp lt print node gt name Get attribute names and values attribs node gt attributes if is_array attribs 335 Pearson Education 336 A ADDISON WESLEY 7 Anwendungen der Spitzentechnologie while list key value each attribs print key lt span class attribute gt value lt span gt print amp gt lt span gt lt br gt Process children if any children node gt children for i 0 i lt count children i Print end element for i 0 i lt depth i print amp nbsp print lt span class element gt amp lt print node gt name print amp gt lt span gt lt br gt break output_node children i depth INDENT case XML_PI_NODE for i 0 i lt depth i print amp nbsp printf lt span class pi gt amp 1t s s Agt lt span gt lt br gt wSnode gt name node gt content break case XML_COMMENT NODE case case case case case case case case case case defa for i 0 i lt depth i print amp nbsp print lt span class element gt amp lt lt span gt print node gt content print lt span class element gt Agt lt span gt lt br gt break XML_TEXT NODE XML_ENTITY_REF_NODE XML_ENTITY_REF_NODE XML_DOCUMENT NODE XML_DOCUMENT TYPE_NODE XML_DOCUMENT FRAG NODE XML_
40. chen der Leser nach aktuellen technischen Informationen gen gt 1993 schloss Graeme sein Biochemie Studium ab Bereits w hrend der Studi enzeit entdeckte er das Internet das damals noch in den Kinderschuhen steckte Dadurch kam er von der Biochemie zu einem Internet Dienstanbieter und sp ter in ein f hrendes Unternehmen f r Web Design in Neuseeland Dort entwickelte er auch seine Fertigkeiten in PHP und ASP Neben der Programmierung schrieb Graeme f r eine regionale Zeitung in sei ner fr heren Heimatstadt in Neuseeland Des weiteren verfasste er mehrere Tutorials und Artikel ber PHP f r den Web Monkey von Wired Digital Geboren und aufgewachsen in Neuseeland lebt Graeme heute in Sydney wo er seinen eigenen Beratungsdienst leitet der sich auf E Commerce und Firmenintegration mittels Internet spezialisiert hat In seiner Freizeit widmet er sich gerne der modernen Literatur Musik und dem Crocodile Wrestling Pearson A ADDISON WESLEY Education ber Zend Technologies LTD Zend Engine ist der Basis Skripterstellungsprozessor der PHP steuert Der Prozessor ist Eigentum von Zend Technologies LTD und mit der Q Public License f r PHP zugelassen Mit dem Zend Prozessor wird PHP zu einer leis tungsf higen zuverl ssigen und benutzerfreundlichen Skriptoberfl che Die Geschichte von Zend Engine begann vor vier Jahren als die Firmengr n der Zeev Suraski und Andi Gutmans dem Kern Entwicklerteam von PHP bei traten
41. counter print counter or do something else with it print counter hits so far 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 I II ITTI III III III III LTT TT Do not modify above this point III TITT III III III III I II increase counter counter write counter back to ourselves 127 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax 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 weiteren Durchlauf durch die Datei wird sich die erste Zeile ndern und die Anzahl der Treffer angeben die es f r 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 Trefferz hler f hren w rde In einer Umgebung mit umfangreichem Datenverkehr sollten Sie diese Technik nur mit entspre chenden Verarbe
42. der den Wert des Parameters zur ck oder bei einem Fehler false Der Quellcode in Listing 5 4 zeigt die grundlegende Verwendung der COM Funktion Mithilfe der Komponente Softwing EDConverter einem W hrungs umwandlungsprogramm wird eine Instanz der Klasse COM erzeugt Anschlie Send wird die Mitgliedsmethode Triangulate aufgerufen und das Ergebnis angezeigt Viel einfacher geht es nicht amount 1000 Amount to be converted curr_from DEM ISO currency symbol of original currency curr_to ITL Symbol of the target currency Instantiate new COM object conv new COMC Softwing EDConverter or die Unable to instantiate wEuro Converter Execute a component method on the COM object s instance 253 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien ret conv gt Triangulate 10000 ITL DEM or die Exception triggered by Triangulate on line LINE Print the result print ret Listing 5 4 Ein einfaches COM Beispiel Um auf einem entfernten System eine Instanz einer DCOM Komponente zu erzeugen bergeben Sie den Hostnamen als zweites Argument an den Kon struktor Ein Beispiel comp new COM My Component remote server com In PHP 3 0 k nnen Sie die Klasse COM nicht verwenden Statt dessen m ssen Sie die Funktionen com_load com _invoke com set und com get benutzen Unser Beispiel s he so aus wie in Listing 5 5 amount 1000
43. enth lt Statusinformationen die in einer Datenbank aktualisiert werden Auf diese k nnen alle anderen Schnittstellenelemente zugreifen um Daten auszulesen und in geeigneter Weise anzuzeigen siehe Abbildung 3 8 An kommende Netzwerk Netzwerk daten daten IRC Hauptprozess Aus gehende Schnittstellen elemente Benutzerliste usw ber Shared Memory Benutzer eingabe ber Datenbank ber Datenbank ber Frames HTML Ausgabe an den Benutzer Abbildung 3 8 Das endg ltige Programmlayout 3 5 5 Schnittstelle zum Entwickler Eine Schnittstelle f r Entwickler Was hat das mit dem Chat zu tun Und wie soll das funktionieren Die meisten Programme sind unflexibel Sie lassen sich gar nicht oder nur schwer durch fremde Entwickler ver ndern Bei end benutzer orientierten Programmen zum Beispiel Desktop Umgebungen wie etwa Windows KDE MacOS usw wird wohl kaum jemand die Ideall sung finden hnlich wie bei einem Chat System werden die meisten Leute die das Programm herunterladen bemerken Hey super aber es fehlt dies oder das oder cool aber ich mag nicht wie es xyz tut Ohne einen einfachen klar ausgewiesenen Weg wie das Programm durch den Benutzer ver ndert werden kann werden die meisten Anwendungen im M ll landen Sofern die Funktionsweise sie nicht sofort vom Hocker rei t werden die meisten Leute nicht einmal versuchen an einem Programm her
44. function myplugin_idle_callback code parameter return parameter IILI TT TTT TT TATTLE ATT myplugin_init initializes this plug in 156 Pearson A ADDISON WESLEY Education Schnittstelle zum Netzwerk FTLLTTTTLTTTLLTT TTT TTT TTT TTT ATTA TATA ATTA TTT ATTA TAT ATTA ATTA TT Put all your initialization code in here This code will be called as soon as the main bot is all set up with connecting and callback installation thus you can rely on a safe environment Although the return value is currently not used 0 should indicate initialization failure and 1 initialization success This might be used later on to enable plug ins to stop the current chat session right after login irn Return value 0 error 1 success SIIIN function myplugin_init register callbacks here chat_register_callback CHATCB IDLE myplugin_idle callback return 1 TLLTTLTTTLTTT TT TTT TTT TTT AT TAT ATTA ATA TATA AAA ATA TT i myplugin_deinit deinitializes this plug in am All deinitialization code should go here This function is called before the bot goes down thus all network connections are still active Although the return value is currently not used 0 should indicate deinitialization failure and 1 deinitialization success This might be used later on to force delayed shutdowns LITTILLLLLLTT TTT TTT TTT TT TATA TTA
45. glicher weise die lokale Version zugunsten der nderung im zentralen Archiv zu verwerfen Hier sollten Sie besser die lokale Datei l schen und die Datei vom Server erneut auslesen 5 3 1 CVS Optimierung Grafische Benutzeroberfl chen und CVSweb Wenn Sie sich mit den grundlegenden CVS Befehlen vertraut gemacht haben die wir im vorangegangenen Abschnitt beschrieben haben stehen Ihnen alle M glichkeiten offen die ein Kommandozeilenwerkzeug bietet Sie k nnen CVS auf entfernten Shells verwenden Prozesse mit Shell Skripten automati sieren und Ihren Kollegen zeigen dass Sie Ihren Job wirklich beherrschen F r die t gliche Arbeit bevorzugen wir jedoch eine grafische Benutzeroberfl che F r Windows Rechner ist WinCVS das Sie unter www wincvs org erhalten ein sehr hilfreiches Programm um die Arbeit zu erledigen siehe Abbildung 5 3 Es verbirgt die Komplexit t von CVS nicht sondern gibt Ihnen einen beque men Zugriff auf die am h ufigsten ben tigen Funktionen ber eine grafische Benutzeroberfl che 238 Pearson A ADDISON WESLEY Education Versionsverwaltung mit CVS amp Untitled BEE File Edit View Cvs Admin Cvs Files Cvs Folders Selections Window Help al sele alel ale EM wl E aex 280 E docbook Pi H Ftp lE Wed Apr 12 12 57 14 2000 C gernan faq A E Application Designxmi 1 9 File Sun Mar 19 13 09 34 2000 C Jade P Basic_web_Applic 1 11 Mod File Wed Apr 12 12 57 28
46. gt idx_up link_to write nodes back into the array tree_array link_to link_node tree_array child child_node return success return 96 Pearson A ADDISON WESLEY Education Verkn pfte Listen function tree_link_right amp tree_array link_to child retrieve nodes link_node tree_array link_to child_node tree_array 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_right child child_node gt idx_up link_to write nodes back into the array tree_array link_to link_node tree_array child child_node return success return 1 function tree_get_parent amp tree_array handle retrieve node from array node tree_array handle check if node is actually allocated if node gt free node is not allocated return error return 1 node is allocated return its parent return node gt up function tree_get_left amp tree_array handle 97 Pearson Education retrieve node node tree_arr check if node if node gt free node is not return 1 node is alloca return node gt 1ef A ADDISON WESLEY 2 Erweiterte Syntax from array ay handle is actually allocated allocated return error return i
47. 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 w while list key value each my_array print Key key Value value lt br gt Hier wird das Array nicht ber die Nummer sondern ber 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 olx File Edit View Go Communicator Help Key Landon Value 1 Key Graeme Value 2 Key Tobias Value 3 Key Till Value 4 Fisa 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 fo
48. hrend des Lesens zu verstehen muss Ihr Gehirn die Informa tionen analysieren die es von den Augen erh lt die wichtigen Teile identifi zieren und dann diese Teile in die richtige Reihenfolge bringen Die Analyse geschieht in zwei Schritten die physikalische und die logische Analyse Zun chst wird die physikalische Analyse durchgef hrt indem die optische Struktur des Textes untersucht wird z B Abs tze Zeilen Spalten und Zwi schenr ume zwischen den W rtern Durch diesen Vorgang wird die Wahr nehmung des Textes als Ganzes etwa dem Blatt Papier oder dem Computer bildschirm in eine Wahrnehmung als baumartige Struktur kleinerer Einheiten umgewandelt Wenn wir von einer Baumstruktur mit Stammkno ten oben und Bl ttern unten ausgehen enth lt der obere Teil die generischen Informationen z B die Reihenfolge der Abs tze die Sie lesen m ssen Am unteren Ende steht so etwas wie die Reihenfolge der W rter in einer Zeile oder gar die Reihenfolge der Zeichen in einem Wort 35 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte Bei der logischen Analyse wird diese physikalische Information gelesen von oben nach unten abgearbeitet und in ein m glichst sinnvolles Ergebnis umge wandelt Ob dies nun eine grammatikalische bersetzung ist welche Struk tur hat der Satz oder eine kontextuelle bersetzung was bedeutet dieser Satz ist f r die folgende Diskussion unerheblich wichtig ist dass die logi sche Analyse um
49. lt oder wenn es Fehler enth lt die nicht korrigiert werden Nach unserer Erfahrung haben sich Open Source Produkte als erfolgreichste externe Teile erwiesen Sie werden in der Regel recht schnell verbessert und erweitert und st tzen sich auf allgemeing ltige und offene hochleistungs f hige Standards bung Suchen Sie nach Anwendungen Bibliotheken die in PHP geschrie ben sind und IRC verwenden Vergleichen Sie diese in Bezug auf Design Fle xibilit t und Gebrauchsfreundlichkeit Die Implementierung ist zwar auch interessant sollte aber nicht Ihr Hauptinteresse sein Der wichtigste Teil der Entwicklung ist das Konzept Wenn dieses steht ist die tats chliche Realisie rung recht einfach auch wenn viele Programmierer dies anders sehen Wir haben f r dieses Projekt die Bibliothek phpIRC ausgew hlt www phpwizard net phpIRC Sie bietet folgende Vorteile Sie ist leicht zu verwenden Sie stellt eine vollst ndige und leistungsf hige API dar Sie verwendet eine ereignisbasierte Verarbeitung 139 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel Die Verwendung der ereignisbasierten Verarbeitung ist hier von besonderem Interesse Dieses Verfahren wird blicherweise in den konventionellen Anwendungen implementiert So sind z B alle Windows Programme ereig nisbasiert Ereignisbasierte Programme laufen in einer Endlosschleife wobei sie darauf warten dass etwas ein Ereignis passiert Ein
50. nnen EBNF als eine Reihe von Regeln den so genannten Produktionen oder Produktionsregeln betrachten Jede Regel beschreibt einen Teil der gesamten Syntax Sie beginnen bei einem Startsymbol traditionell mit S bezeichnet und definieren anschlie end Regeln daf r wodurch Sie dieses Symbol ersetzen k nnen Schritt f r Schritt entsteht so eine komplexe Sprach grammatik die sich aus den Zeichenfolgen zusammensetzen die Sie produ zieren k nnen wenn Sie diese Regeln befolgen Wenn Sie sich noch einmal das Beispiel oben betrachten stellen Sie fest dass es sich um eine Zuordnung handelt Es gibt ein Symbol auf der linken Seite einen Zuordnungsoperator der auch in Form von geschrieben werden kann und eine Liste der Werte auf der rechten Seite Sie arbeiten die Zuordnungen so lange ab bis es auf der linken Seite keine Symboldefinitionen mehr gibt Danach sollte auf der rechten Seite der Zuordnung kein Symbol mehr stehen sondern nur noch die endg ltige Zeichenkette die ein atomarer Wert ist EBNF definiert drei Operatoren die Sie m glicherweise schon aus regul ren Ausdr cken kennen Operator Bedeutung optional muss einmal oder mehrmals erscheinen muss null mal oder mehrmals erscheinen Zur Definition der Sprachgrammatik mit der Sie Flie kommazahlen verwen den k nnen s he die EBNF Notation folgenderma en aus S SIGN D D D 0 9 SIGN 315 Pearson A ADDISON WESLEY
51. php script php3 foo aufrufen gibt argv 1 das erste Argument foo an Der zweite beachtenswerte Teil des Programmcodes betrifft das Einlesen aus Standardeingaben PHP 4 0 erm glicht Ihnen sogenannte PHP Streams mit fopen zu verwenden Zur Annahme von Benutzereingaben in der Befehls zeile oder Einlesen von Daten die von einem anderen Programm bergeben wurden wird php stdin verwendet Das Skript verwendet diesen Befehl um die Protokollmeldung zu lesen die von CVS geliefert wird Mit einer hn lichen Funktion k nnen Sie den Benutzer auffordern Eingaben zu machen Listing 5 3 zeigt eine solche Funktion function readIn Initialize return value ret Read from stdin until the user presses enter 245 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien fp fopen php stdin r or die Fatal Error could not read from stdin do char fread fp 1 ret char while char n return ret print Please enter your firstname n firstname readIn print You entered firstname n Listing 5 3 Aufforderung zur Benutzereingabe mit PHP Eingabe Ausgabe Streams Die anderen verf gbaren Streams hei en php stdout und php sterr Sie bieten eine effektive plattformunabh ngige Alternative um auf Standardein und ausgaben sowie die Standardfehlerbehandlungsroutinen zuzugreifen Dies funktioniert sogar unter Windows 98 NT D
52. rfen author Ebene die anderen Gruppen sollen jedoch die Berechtigungen aus den Ebenen unter ihnen bernehmen Das endg ltige Berechtigungssystem sieht dann folgenderma en aus 284 Pearson A ADDISON WESLEY Education Authentisierung admin erbt supervisor editor author supervisor erbt editor author editor author Um die Bitmuster der einzelnen Gruppen zu berechnen beginnen Sie bei der untersten Ebene author mit dem Bitmuster von 1 was bedeutet dass das ganz rechte Bit gesetzt ist Wenn wir m chten dass der Editor die Rechte der Autorebene erbt m ssten wir mit dem Bitmuster f r Autoren fortfahren und das n chsth here Bit setzten 1 2 In unserem Beispiel m chten wir jedoch dass die Autoren und Editorengruppe getrennt werden deshalb setzen wir die Editorebene auf das n chsth here freie Bitmuster dezimal 2 bin r 10 Wenn nun ein Editor eine Seite anfordert die mit author Berechtigung gesch tzt ist wird der Zugriff verweigert erforderliche Ebene author 1 aktuelle Ebene editor 2 logisches UND von 1 und 2 1 amp 2 ist 0 was nicht der erforderlichen Ebene entspricht Die n chsth here Ebene die dritte Bitposition von rechts ist supervisor wel che die Rechte von editor und author bernimmt Dies bedeutet dass die Bits 1 und 2 im Supervisor Bitmuster gesetzt werden m ssen Au erdem setzen wir das 3 Bit 2 hoch 2 bzw 4 1 2 4 dies ergibt 7 berpr fen wir die Richtigkeit
53. 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 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 Pearson A ADDISON WESLEY Education PHP und objektorientierte Programmierung Code Verwenden Sie Klassen nur zur Strukturierung von APIs die nicht durch die Kopiersyntax verletzt werden berlegen Sie ob sich Ihr Projekt mit Prozeduren realisieren l sst 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
54. ssen sicher und zuverl s sig sein Die Authentisierungsdatenbank ben tigt einen Schutz f r den allge meinen Zugriff und die Authentisierungselemente sollten verschl sselt gespeichert werden Auch die Backup Systeme m ssen sicher und zuverl ssig sein Zu einem ent sprechenden Trust Management geh rt auch das Einrichten von Rollen und das Definieren wer auf spezielle Teile eines zuverl ssigen System in welcher Weise zugreifen kann Trust Management ist jedoch ein zu gro es Gebiet als dass wir es hier abhandeln k nnten Vergabe von Zugriffsrechten Wenn die Benutzeridentifizierung laut Authentisierung korrekt ist beendet das System den Anmeldevorgang und weist der Identit t und den Zugriffskontroll daten des Benutzers eine Benutzersitzung zu In einfachen Programmen besteht die Zugriffskontrollinformation vielleicht nur aus einem Flag das angibt dass der aktuelle Benutzer berechtigt ist In komplexeren Situationen ordnet das Sys tem m glicherweise auch eine Sicherheitsebene oder Authentisierungsebene zu welche definiert was der aktuelle Benutzer im Programm tun darf z B gibt es vielleicht einen bergeordneten Benutzer oder eine Nur Lese Benutzer gruppe Jenach ben tigter Sicherheitsebene muss das System erfolgreiche oder fehlgeschlagene Anmeldeversuche protokollieren So erlegt der C2 Sicherheits standard dem System auf alle Anmeldeereignisse aufzuzeichnen HTTP Authentisierung HTTP bietet eine Methode f r die Ben
55. teil der globalen Variablen des Compilers Der Zugriff erfolgt ber das Makro CG Um die globalen Variablen des Compilers Ihrer Funktion bekannzugeben rufen Sie das Makro CLS_FETCH einmalig auf Der Funktionsname ist in einem zval Container angegeben Dies mag zun chst berraschend erscheinen ist aber ein logische Schritt da Funktions namen meistens als Parameter durch aufrufende Funktionen in Ihrem Skript ausgelesen werden die wiederum in zval Containern enthalten sind Auf diese Weise m ssen Sie Ihre Argumente nur durch diese Funktion bergeben Dieses zval muss vom Typ IS_STRING sein Das n chst Argument besteht aus einem Zeiger auf den R ckgabewert Sie brauchen keinen Speicher f r diesen Container zuweisen dies macht die Funktion selbst Allerdings m ssen Sie diesen Container mithilfe von zval_ dtor hinterher l schen Als n chstes folgen der Parameterz hler in Form eines Integers und ein Array das alle notwendigen Parameter enth lt Das letzte Argument gibt an ob die Funktion eine zval Separation durchf hren soll Es sollte stets auf 0 gesetzt sein Wenn es auf 1 gesetzt ist belegt die Funktion zwar weniger Speicher schl gt aber fehlt sobald einer der Parameter getrennt werden muss Listing 9 16 und Abbildung 9 11 demonstrieren den Aufruf einer Benutzer funktion Der Programmcode ruft eine Funktion auf die als Argument bereit gestellt wird und bergibt den R ckgabewert dieser Funktion als eigenen R ckga
56. ten bereitgestellt haben und ein kleines Eingabeformular anzeigen wie Abbildung 2 13 zeigt XY Netscape ioj x File Edit View Go Communicator Help Function definition im x Fix 3 Required PHP code m 10 b 20 Parse Abbildung 2 13 Eingabeformular des dynamischen Funktionplotters 124 Pearson vy ADDISON WESLEY Education Polymorphisierung und selbstmodifizierender Code 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 rei t 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 Ihr 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 swilligem Programmcode zu vermeiden finden Sie in Kapitel 4 Webanwendungskonzepte und Kapitel 5 Grundlegende Web anwendungsstrategien 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
57. tmp_path gespeichert da PGP nur mit Dateien arbeitet Warnung In einem Mehrbenutzersystem muss jeder diese Datei lesen k n nen Sie sollten sorgf ltig abw gen ob Sie diese Klasse in einem nicht zuverl ssigen System verwenden d h nicht zuverl ssigen Benutzern Zugriff auf dieses System gew hren Die Klasse hat sechs ffentliche Funktionen zwei weitere werden intern verwendet Bei Auftreten eines Fehlers geben diese Funktionen false zur ck In diesem Fall k nnen Sie ber pgp gt error auf eine ausf hrliche Fehlermel dung zugreifen void pgp Der Konstruktor dieser Klasse berpr ft ob auf die PGP Bin rwerte zuge griffen werden kann Wenn ja wird true zur ckgegeben ansonsten false mixed encrypt String what String my_user_id String to_user_id PGP verschl sselt das Argument what das ein Dateiname oder eine Zei chenfolge sein kann mit dem privaten Schl ssel von my_user_id f r den ffentlichen Schl ssel to_user_id Zur ckgegeben wird der verschl sselte Text oder bei einem Fehler false mixed sign String what String my_user_id Unterzeichnet das Argument what mit dem privaten Schl ssel von my_user_ id Zur ckgegeben wird der unterzeichnete Text oder bei einem Fehler false mixed encrypt_sign String what String my_user_id String to_user_id Unterzeichnet what mit dem privaten Schl ssel von my_user_id und ver schl sselt es dann fiir den ffentlichen Schl ssel von to_user_id Zurtick gegeben wi
58. 1 Einfaches Beispiel f r die Verwendung von PHPs integrierten Sitzungen 175 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Dieses Beispiel zeigt die Sitzungskennnummer und einen Z hler der jedes Mal erh ht wird wenn Sie auf die Seite zugreifen Es unterscheidet sich nat rlich von einem normalen Seitenz hler Die Sitzung und damit der Z h ler ist an einen speziellen Benutzer gebunden Bei der Standardkonfiguration von PHP hat der Sitzungscookie eine Lebenszeit von 0 dies bedeutet wenn Sie den Browser schlie en und wieder ffnen beginnt der Z hler wieder bei Null da der Cookie gel scht wurde Betrachten wir die Sitzungsfunktionen von PHP 4 0 n her PHPs Sitzungsver waltungsbibliothek bietet die bereits beschriebenen Optionen Sie speichert Sitzungsdaten auf dem Server Da die Bibliothek verschie dene Speichermodule verwendet k nnen Sie die Daten in reinen Textda teien dem Shared Memory oder in Datenbanken ablegen Dies spiegelt genau das wieder was wir ber Speichermedien erl utert haben Wo die Daten aufbewahrt werden ist nicht relevant solange die Leistung des Mediums ausreicht Sie verwendet eine willk rliche Sitzungskennnummer um einen Benutzer zu identifizieren Sie speichert die Sitzungskennnummer und nur die Sitzungskennnum mer mittels Cookies GET POST oder dem Skriptpfad auf der Client Seite Die PHP Bibliothek bietet alle diese Methoden an wie sie zu verwenden sind zeig
59. 11 beschriebenen Funktionen verwenden um Mit glieder zu Ihrem Objekt hinzuzuf gen Hinweis Alle Funktionen aus Tabelle 9 11 arbeiten mit dem Objekt object und dem Schl ssel key Der Schl ssel bildet den Namen des Mitglieds so dass auf das erzeugte Mitglied ber object gt key zugegriffen werden kann Funktion Beschreibung add_property_long zval ob F gt einen Long zum Objekt hinzu ject char key long 1 add_property_unset zval ob F gt einen nicht gesetzten Parameter zum Ob ject char key jekt hinzu add_property_bool zval ob F gt einen booleschen Wert zum Objekt hinzu ject char key int b add_property_resource zval F gt eine Ressource zum Objekt hinzu object char key int r add_property_double zval ob F gt einen Double zum Objekt hinzu ject char key double d add_property_string zval ob F gt einen String zum Objekt hinzu ject char key char str int duplicate add_property_stringl zval F gt einen String der angegebenen L nge zum object Ichar key char str Objekt hinzu Diese Funktion ist schneller als add_ uint length int duplicate property_string und au erdem bin rsicher Tab 9 11 Zends API f r die Erzeugung von Objekten 9 14 Ressourcen Ressourcen sind eine spezielle Art von Datentyp in PHP Der Begriff Ressource bezieht sich nicht auf eine spezielle Art von Daten sondern vielmehr auf eine Abstraktionsmethode zur Pflege beliebige
60. 2000 E G lbxmbenno 1 01 9 E Case_Studies xmi 1 10 Mod File Result of merge 32 rg A F Comparisons xml Unknown a aia P o Cover pdF 1 1 kb Binary Tue Mar 21 16 01 50 2000 H phpads P E cutting Edge_Ap 1 7 File Wed Apr 12 12 57 46 2000 a 4 a Database_Access 1 3 Mod File Tue Feb 15 16 02 46 2000 Bent Unknown Folder CI phpChat E phpChat_deme E phpdoc 2 22 phplib H E phpMyAdmin H phpReference E E program files 2 Programme 2 RECYCLED 2 ref 2 Tao of PHP 2 Temp 2 wddx E E xmirpc 4 gt fsa For Help press Fi num Astart Gyre E E h Epp ro ESA e m Sam Baa cr ER 152 Abbildung 5 3 WinCVS CYS Repository Netscape laj x Fie Edit View Go Communicator Help 3 3 a U 3 E 3 S Back Foward Reload Home Search Netscape Print Security Stop 3 a Bookmarks 4 Location http www phpwebdev com evsweb index cai El What s Related WebMail E Contact E People E YellowPages E Download E FindSites C4 Channels File Rev Age Author Last log entry C Attic Don t hide OQ figures CI sources Oo xmetal Pi i Mi difications in the OOP hapter halfw B Advanced Syntax xml 12 Sdays till PEN en oE ni a Basic Web Applications initial commit first chapter PHP B Basic Web Application Strategies zmi ll J days tobias Normal Form is ready dd short tip how to extract block nts fri PHP
61. 3 10 Plugins bei der Arbeit Wie Sie sehen k nnen bieten Plugins eine extrem leistungsf hige Alternative um ein komplexes System zu erweitern Deshalb hat phpChat die meisten sei ner internen Routinen als separate Plugins aus dem Programm ausgelagert Der komplette Befehlsinterpreter wurde zu einem Plugin genau wie alle Text formatierungs Textausgabeprozeduren Damit bleibt nur noch ein harter Kern der nicht mehr ge ndert werden muss da er nichts enth lt was eine nderung ben tigt Der Rest kann unbegrenzt ver ndert erweitert oder gar entfernt werden ohne dass dies Auswirkungen auf die Systemleistung oder die Funktionsf higkeit hat Haben Sie jemals erlebt dass sich ein Programm nicht beschwert wenn jemand seine Dateien l scht Mithilfe dieser Technik wird sich das Programm nicht beschweren und sich sogar dynamisch anpassen Plugins k nnen vielf ltig eingesetzt werden nicht nur f r Chat Programme Sie k nnten beispielsweise ein Portal errichten das aus der traditionellen Nachrichtenseite einer Email Schnittstelle usw besteht Mithilfe von Plugins k nnen Sie einen Website Kern konzipieren der sich um alle grundlegen den Dinge k mmert wie etwa die Bereitstellung eines Seitenlayouts eines Datenbank Backends Sitzungsverwaltung usw Basierend auf dem Website Kern k nnen Sie dann Plugins f r die Anzeige von Nachrichten Versand und Empfang von Emails und selbst die Bereitstellung verschiedener Anmelde
62. 4 0 Knacken wir den PHP Kern Dritte ziehen m glicherweise in Betracht das Tag extension in php ini zu nut zen um in PHP zus tzliche externe Module zu erzeugen Diese externen Module werden vollst ndig vom Hauptpaket abgetrennt was in kommerziel len Umgebungen recht praktisch ist Damit k nnen kommerzielle Distributo ren Disketten oder Archive verschicken die nur die zus tzlichen Module ent halten und m ssen sich nicht damit befassen statische und in sich geschlossene PHP Bin rdateien zu erzeugen die verhindern dass andere Module an sie gebunden werden 9 3 2 Eingebaute Module Eingebaute Module werden direkt in PHP bersetzt und mit jedem PHP Pro zess mitgef hrt Ihre Funktionalit t ist f r jedes Skript das ausgef hrt wird sofort verf gbar Genau wie externe Module haben eingebaute Module Vor und Nachteile wie die folgende Tabelle beschreibt Vorteile Nachteile Das Modul muss nicht speziell geladen Bei nderungen von eingebauten werden die Funktionalit t ist sofort ver Modulen ist ein Neukompilieren von f gbar PHP erforderlich Es gibt keine externen Dateien welche Die PHP Bin rdateien wachsen und bele die Festplatte f llen alles wird in den gen zunehmend mehr Speicher PHP Bin rdateien abgelegt Eingebaute Module eignen sich am besten wenn Sie eine robuste Bibliothek mit Funktionen verwenden die relativ unver ndert bleibt die eine mehr als durchschnittliche Leistung
63. 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 wird 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 K
64. Block Chaining 202 CDATA Abschnitte 311 CDATASection Knoten DOM 330 CFB Cipher Feedback 202 CGI Skript 240 CGI Umgebungsvariable 222 CharacterData Schnittstelle 330 Cleanup 178 Client Server Modell 249 Codeverwaltung 363 Cold Fusion im Vergleich zu PHP 350 COM Component Object Model 251 254 Concurrent Versions System CVS 233 config m Konfigurationsmakros 377 436 Container PHPLib 268 Copy Konstruktoren 422 CT_Dbm Klasse PHPLib 269 CT_Ldap Klasse PHPLib 269 CT_Shm Klasse PHPLib 269 CT_Split_Sql Klasse PHPLib 269 CT_Sql Klasse PHPLib 268 271 CVS Concurrent Versions System 233 306 cvs checkout Befehl 234 240 248 cvs commit Befehl 248 cvs diff Befehl 238 248 cvs log Befehl 248 cvs login Befehl 248 cvs remove Befehl 248 cvs status Befehl 241 248 cvs update Befehl 241 248 CVSweb Utility 238 239 D Dateifunktionen zur Erweiterung von PHP 374 439 Pearson Education Datenbank Nachteile 148 Datenstrukturen Wissensrepr sentation 290 Davis Eric 211 DB_Sql Klasse PHPLib 262 270 DCOM Distributed Component Object Model 253 definierte Werte 64 Deinitialisierungsfunktionen 390 429 DES Data Encryption Standard 193 Dienste IRC Verwaltung durch 160 Diffie Hellman 194 Distributed Component Object Model COM 253 dl Verzeichnis 372 DNS Tricks 173 DocBook DTD 306 Document Object Model DOM 287 327 Document Type Definitions DTDs 302 DocumentFragment Knoten DOM 329
65. Bytes Die Gr e l sst sich ungefahr nach der Formel shm_size max_ sessions session_size berechnen wobei die Session Gr e durchschnittlich 600 Byte gro sein konnen Der Standardwert ist 64 000 64KB CT_Dbm verwendet zur Speicherung der Session Daten die Datei UNIX DBM Dieser Datenbanktyp speichert Daten als Schl ssel Wert Paare in regul ren Dateien auf dem System Als einzige Variable sollten Sie dbm_file setzen diese gibt den Dateinamen Ihrer DBM Datei an Die Datei muss die entspre chenden Rechte haben und der Server braucht einen Schreibzugriff auf diese CT_Ldap speichert Session Daten auf einem LDAP Lightweight Directory Access Protocol Server Um diesen Container zu verwenden m ssen Sie PHP mit LDAP Unterst tzung kompilieren Die Klasse CT_Ldap besitzt fol gende Eigenschaften 269 Pearson Education A ADDISON WESLEY 6 Datenbankzugriff mit PHP Variable Beschreibung Idap_host Idap_ Hostname und Port Nummer des LDAP Servers port rootdn rootpw Vom Stamm erkannter Namen und Passwort des LDAP Servers die zur Verbindung mit dem Server verwendet werden basedn Unterhalb des angegebenen Namens sollten die Session objclass Name der Objektklasse vergleichbar mit dem Namen Daten gespeichert werden einer SQL Tabelle Bei einem Blick auf local inc sehen Sie eine Reihe von Klassendefinitionen von denen drei unser Beispiel betreffen class var var va
66. Client Teil des Programms Es ist f r die gesamte Netz werkkommunikation verantwortlich Dies bedeutet auch dass es stets die Kon trolle behalten muss um rechtzeitig auf Netzwerknachrichten reagieren zu k nnen Wenn die nachrichtenverarbeitenden Funktionen von phpIRC nur gelegentlich aktiviert w rden k nnte ein sicherer zuverl ssiger und schneller Datenaustausch nicht mehr gew hrleistet werden Aus diesem Grund erzwingt phpIRC eine bestimmte Programmstruktur wie Abbildung 3 6 zeigt Hauptanwendung Programmeintrittspunkt Initialisierung bergabe der Kontrolle an phpIRC Ankommende Netzwerkdaten Ausgehende Netzwerkdaten R ckruf 1 R ckruf 2 R ckruf 3 Abbildung 3 6 Von phpIRC erzwungene Programmstruktur 142 Pearson vy ADDISON WESLEY Education Schnittstelle zum Netzwerk Nach der Initialisierung und dem Setup muss das Programm die Kontrolle an phpIRC bergeben phpIRC springt dann an den Start seiner Hauptereignis schleife und wartet auf ein Ereignis W hrend des Setups muss das Pro gramm f r jedes Ereignis das es verarbeiten m chte z B ankommende pri vate Nachrichten ankommende Server Nachrichten usw R ckrufe registrieren Diese Nachrichten sind f r das Programm die einzige M glich keit die Kontrolle zur ckzubekommen phpIRC bergibt dann alle Ereig nisse an alle Funktionen die sich in der Bibliothek registriert haben Diese Funktionen k nnen wiederum in
67. Concepts xml 118 Shours tobias san Ba ne 5 TOC xml 16 S hours tobias add case study chapters Web Application Concepts xml 1 11 4 weeks till Wrote summary chapter should now be finalized Til foot template 11 11 6 weeks tobias Web Application Development With PHP B head template 12 7 weeks tobias separate xmetal files dtd rules css and content ns 19 Sooke till update toc included the chapter make php3 has a small gt eel Document Done S Kb AP TA wa asian Bra Gov Cca yewi Evs Eee Einw Bam FRev ae a R B 17 33 Abbildung 5 4 Die CVSweb Schnittstelle 239 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien Ein weiteres n tzliches Werkzeug ist CVSweb ein in Perl geschriebenes CGI Skript das Ihnen einen berblick ber Ihre CVS Archive gibt Es vereinfacht die Verwaltung gr erer Projekte indem es jede Datei einer Liste zusammen mit der letzten Protokollnachricht dem nderungsdatum und dem Autor anzeigt siehe Abbildung 5 4 Sie k nnen alle ge nderten Versionen einer Datei anfordern Unterschiede zwischen beliebigen Versionen werden farbig dargestellt 5 3 2 Erweitertes CVS Nat rlich gibt es einen Grund dass das CVS Referenzhandbuch von Per Cederqvist so ein gro es Ungeheuer ist Die grundlegenden Befehle sind selbst von Entwicklern schnell zu erlernen die sich mit CVS gar nicht ausken nen Die erweiterten Funktionen von CVS bed rfen jedoch einer au
68. 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 erscheinen 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 API einen Zugriff auf IRC Internet Relay Chat Netzwerke bietet Da die Verwaltung der Eingabedaten nicht linear ist und vollst ndig vom Benutzer abh ngt
69. Die Unterbrechung des Skripts und L schung des Bildschirms nach der Fehlermeldung obliegt weiterhin PHPLib Die Funktion wird nur aufgerufen wenn Halt_On_Error auf yes oder report gesetzt ist Die Variable msg die als Argument an haltmsg bergeben wird enth lt eine ausf hrliche Beschreibung des gefundenen Fehlers Eine von der Datenbank erzeugte Mel dung erhalten Sie au erdem ber this gt Error und this gt Errno 6 2 4 DB_Sql Beispiel Die Verwendung der Klasse Db_Sq l sst sich am besten anhand eines kurzen Beispiels erl utern Der Quellcode aus Listing 6 1 stellte eine Verbindung zu einer Datenbank her und zeigt den gesamten Inhalt einer einzelnen Tabelle Er verwendet die in local inc definierte Klasse Example Db welche Db Sql erweitert und zeigt beispielhaft wie Sie Ihre eigenen auf Sie angepassten Klassen erzeugen k nnen Der Einfachheit halber verwenden wir in den fol genden Programmcodebeispielen die Beispielcodes aus der PHPLib Distri bution Instantiate Example DB class db new Example DB Connect to RDBMS db gt connect test localhost root Create SQL statement sql SELECT FROM test Execute query db gt query sql Loop through result set while db gt next_record Loop through the db gt Records hash while list key value each db gt Record Print only non numeric indexes print is string key lt b gt key lt b gt valuesbr
70. Education 7 Anwendungen der Spitzentechnologie 7 2 PHP und XML Hinweis Wenn Sie bereits mit dem grundlegenden Konzept von XML ver traut sind k nnen Sie die n chsten Abschnitte in denen wir eine kurze Einf hrung in XML geben berspringen und direkt im Abschnitt ber PHP und Expat fortfahren 7 2 1 Was ist XML XML Extensible Markup Language ist eine Meta Auszeichnungssprache f r Dokumente die strukturierte Informationen enthalten Gehen wir es Satz f r Satz noch einmal durch XML ist erweiterbar englisch eXtensible Nehmen wir HTML Das Tag lt h1 gt bezeichnet stets eine berschrift erster Ebene In XML hat das Tag dagegen keine Bedeutung bis Sie ihm durch eine zus tzliche Regel der Document Type Definition DTD eine Bedeutung geben XML dient der Auszeichnung englisch Markup Genau wie HTML das zumindest theoretisch keine Layoutinformationen enth lt hat auch XML keine XML ist eine Metasprache englisch meta Language XML hat keine feste Anzahl von Tags sondern besitzt eine Funktion zur Definition von Tags XML arbeitet mit Dokumenten Wohlgemerkt Dokumente es ist nicht begrenzt auf Dateien Dokumente k nnen aus einer Datenbank ber das Netzwerk oder aus Dateien kommen XML definiert strukturierte Informationen Es fasst einzelne Teile von Daten in gr eren Konstrukten zusammen gibt diesen eine Bedeutung in einem Kontext und setzt sie in eine strukturelle Beziehung Strukturierte I
71. Entwickler nicht im selben Geb ude arbeiten sondern ber mehrere Gebiete und L nder grenzen verteilt sind Was passiert wenn zwei Entwickler gleichzeitig die selbe Datei bearbeiten Die nderungen des einen Entwicklers werden unweigerlich berschrieben Was passiert wenn das von John verfasste Skript nicht mehr funktioniert nachdem es von Jane ge ndert wurde John muss sich die M he machen herauszufinden was Jane ge ndert hat An dieser Stelle machen sich Versionsverwaltungssysteme bezahlt Die Soft ware erinnert sich an die vorhergehenden Versionen einer Datei und erm glicht Ihnen auf eine ltere Version zur ckzugreifen eine Art von erweitertem Wiederherstellen Au erdem benachrichtigt Sie das Versions kontrollprogramm wenn andere Entwickler Dateien bearbeitet haben an denen Sie gerade arbeiten und gibt Ihnen die M glichkeit auf Konflikte zu reagieren Schlie lich merkt es sich wer bestimmte nderungen vorgenom men hat CVS ist ein Programm das all diese F higkeiten besitzt und sogar kostenlos ist Open Source Nicht nur die Entwicklung von PHP selbst wird durch CVS verwaltet sondern auch erfolgreiche Projekte wir bekannte Websserver Apache das Mozilla Projekt und KDE vertrauen auf CVS um die Arbeit von Dutzenden einzelner Entwickler zu koordinieren Auch der XML Quell code dieses Buches wird mit CVS gepflegt Die Autoren leben in Deutschland Till bzw Italien Tobias der Verlag New Riders sitzt
72. Es gibt kaum etwas dagegen einzuwenden nach Sicherheitslecks und anderen L chern im Programm oder dem Netzwerksystem zu suchen Diese auszunutzen ist jedoch mehr als verwerflich Trotzdem betrachten es viele als Spa Dieses Verhalten zeigt klar den Bedarf f r eine externe Schnittstelle die unabh ngig 158 Pearson vy ADDISON WESLEY Education Verwaltung und Sicherheit vom Hauptsystem arbeitet Mit solch einer Schnittstelle erhalten Sie die voll st ndige Kontrolle ber alle Daten und Benutzer des Programms F r das Chat Programm bedeutet dies dass wir Benutzer hinauswerfen ihre Nach richten entsch rfen und Chat R ume sichern k nnen Hinweis Der Programmcode auf der CD ROM enth lt nicht alle hier auf gef hrten Funktionen Das Basisverwaltungssystem ist komplett und voll st ndig funktionsf hig Aber wir m chten dass Sie die Codebasis um die Funktionen erweitern die Sie f r passend halten Wenn Sie bisher noch keine gr eren Erweiterungen f r umfangreiche Programme geschrieben haben empfehlen wir Ihnen w rmsten diese Erfahrung nun nachzuholen Die Frage f r unser Chat Programm lautet Wo passen wir die Verwaltung ein Folgende M glichkeiten stehen uns zur Verf gung Auf der Netzwerkebene Wir k nnten die Benutzer filtern die eine Verbin dung zur Server herstellen Auf der PHP Ebene Wir k nnten verhindern dass sich Benutzer f r den Chat anmelden Auf der Datenbankebene Wir k nnten Nach
73. Pearson vy ADDISON WESLEY Education Entwicklungskonzepte Ohne Namen bist Du ein Niemand Um eine Sprache wirklich zu beherrschen miissen Sie nicht nur die Syntax und die Semantik der Sprache verstehen sondern auch ihre Philosophie ihren Hintergrund und die Entwurfsprinzipien kennen 1 1 Ist PHP etwas fur mich Haben Sie sich jemals gefragt warum es so viele Programmiersprachen gibt Neben den Hauptsprachen wie C C Pascal und hnlichen gibt es andere wie Logo Cobol Fortran Simula und viele weitere exotische Spra chen Viele Software Entwickler denken beim Anlegen eines Projekts nicht ernsthaft ber alternative Programmiersprachen nach Sie haben ihre bevor zugte Sprache vielleicht auch eine vom Unternehmen vorgeschriebene Spra che kennen ihre Vorteile und ihre Nachteile und passen das Projekt an die speziellen St rken und Schw chen der Sprache an Damit b rden Sie sich jedoch m glicherweise unn tige zus tzliche Belastungen auf um die M ngel der gew hlten Sprache auszub geln Eine Sprache zu benutzen ohne ihre spezifischen Konzepte zu kennen ist so als wolle man als Lastwagenfahrer an einem Autorennen teilnehmen Im Prinzip wissen Sie wie Sie einen Wagen steuern m ssen m glicherweise erreichen Sie auch einen guten Platz aber ein herausragender Fahrer werden Sie erst nachdem Sie sich mit den Besonderheiten Ihres neuen Vehikels ver traut gemacht haben Auf hnliche Weise wird der objektorien
74. Personen die Gr e das Alter den Genus und den Familienstatus Die Adresse besteht nicht nur aus der Angabe der Strasse und der Stadt sondern auch des Bundesstaates des Lan des und sogar des Planeten Die Telefonnummer enth lt zus tzlich den L n der und Bereichscode Ist der zweite Ansatz besser als der erste Keiner von beiden ist optimal In den Vorlesungen zur Programmierung werden beide gelehrt aber eigentlich ist keiner richtig zufriedenstellend F r eine einfache for Schleife einen Typ tpIntMyIntegerCounter zu definieren und dann eine Variable instMyInteger CounterInstance zu deklarieren scheint ein bisschen bertrieben wenn Sie nur ein Array durchsuchen und alle Elemente auf Null setzen m ssen siehe Listing 1 1 for instMyIntegerCounterInstance 0 instMyIntegerCounterInstance lt MAXTPINTEGERCOUNTERRANGE instMyIntegerCounterInstance instMyArrayInstance instMyCounterInstance 0 Listing 1 1 Eine berdosis Exaktheit Auf der anderen Seite sind blo e Indizes wie i j k anstelle der Langformen instMyIntegerCounterInstance genauso inakzeptabel wenn Sie komplexe Zwischenspeicheroperationen wie Komprimierung o durchf hren m s sen Dies ist nur ein Beispiel f r den Missbrauch eines allgemeinen Konzepts Was ist also zu tun Die L sung besteht darin ein gutes allumfassendes Konzept zu w hlen und an den richtigen Stellen Ausnahmen zu machen Wenn Sie ein 34 Pearson A ADDISO
75. Programment wicklung umfasst praktisch alle Einzelschritte der Entwicklung von der Konzeption der Datenstruktur Flussdiagramme und Diagramme ber die Beziehung der Einheiten bis zum Entwurf des Programmcodes der Doku mentation und allem dazwischen Da es jedoch ein sehr wichtiges Thema ist wollten wir es nicht ganz aus diesem Buch streichen sondern er rtern die Frage der Programmentwicklung gezielt an einem praktischen Beispiel n m lich phpChat In diesem Kapitel erhalten Sie hnlich einer erweiterten Programmfallstudie einen tiefergehenden Einblick in dieses Echtzeit Chat server Programm das mit PHP realisiert wurde Wir hoffen dass Sie aus die sem n tzliche Informationen und Verfahren f r sich entdecken die Sie bei Ihrer n chsten Programmentwicklung einsetzen k nnen Viele der umrandeten Texte in diesem Kapitel enthalten Anmerkungen ber bliche Techniken zur Programmentwicklung die Sie direkt an dem vorge schlagenen Beispiel ausprobieren k nnen oder allgemein an phpChat und sich f r Ihr n chstes Projekt merken sollten Hinweis Eine mehr theoretische und k rzere Er rterung zum Thema Pro grammentwicklung finden Sie in Kapitel 7 Anwendungen der Spitzen technologie 3 1 Projektuberblick Wenn Sie ein Programm entwickeln beginnen Sie damit sich zu berlegen was die Anwendung tun soll Im Falle von phpChat soll das Programm einen browser basierten Chat Service bereitstellen Dieser Chat sollte folgen
76. RAM in den Swap Speicher auslagern Es f hrt den Prozess im RAM aus bevor es feststellt dass der alte Prozess der sich nun im Swap Speicher befindet ausgef hrt werden muss Also transferiert es die Daten wieder in den RAM usw Auf diese Weise k nnen Sie einen Server sehr leicht zu Absturz bringen so dass er neu gestartet oder vom Netz genommen werden muss Dies ist brigens eine bliche Dienstverweigerungs Attacke hnlich jener die Yahoo und andere dieses Jahr bereits ber sich ergehen lassen mussten 3 5 3 Upstream Kommunikation Als N chstes besch ftigen wir uns mit der Upstream Kommunikation d h der Weiterleitung von Benutzereingaben zum Netzwerk Jetzt kommt der harte Teil Wir k nnen Daten zum IRC Netzwerk nicht von jedem Prozess aus senden Warum nicht Weil IRC ein zustandsensitives Protokoll ist ist die Kommunikation an eine bestimmte Client Verbindung gebunden PHP l sst keine bernahme fremder Sockel von anderen Prozessen zu Der Hauptpro zess der auch die Downstream Kommunikation bernimmt der Prozess der als IRC Client agiert wird isoliert von allen anderen Prozessen ausgef hrt Nun ist die Frage wie wir eine T r ffnen k nnen um Daten an den Haupt Client weiterzuleiten Wie w rden Sie eine Upstream Kommunikation realisieren Versuchen Sie zumindest einen theoretischen Ansatz zu entwickeln Zeichnen Sie ein Daten flussdiagramm auf Papier Wenn Sie es noch nicht getan haben schreiben Sie mindest
77. Referenz wenn dies der Fall ist und hebt die Zuweisung des alten zval Containers automatisch auf Diese Methode wird bevorzugt wenn Geschwindigkeit kein ausschlaggebender Faktor ist und Sie die Speicherplatzbelegung gering halten m chten Beachten Sie dass ZEND_SET_SYMBOL ber das Makro EG globale Variablen den Zend Executors nutzt Durch Angabe von EG active_symbol_table k nnen Sie auf die derzeit aktive Symboltabelle zugreifen die sich auf den aktiven loka len G ltigkeitsbereich bezieht Je nachdem ob die Funktion innerhalb einer Funktion aufgerufen wurde kann der lokale G ltigkeitsbereich variieren Wenn Sie die Geschwindigkeit optimieren m chten und Ihnen eine optimale Speicherbelegung nicht wichtig ist k nnen Sie die berpr fung auf existie rende Variablen mit demselben Wert weglassen und mithilfe von zend_hash_ update ein Einf gen der Variablen in die Symboltabelle erzwingen zval new variable allocate and initialize new container MAKE_STD_ZVAL new_variable set type and variable contents here see the following sections introduce this variable by the name new variable_name into the symbol wtable 408 Pearson A ADDISON WESLEY Education Erzeugen von Variablen zend_hash_update EG active_symbol_table new_variable_name strlen new_variable_name 1 amp new_variable sizeof zval NULL Tats chlich ist dies die Standardmethode welche die meisten Module ver wende
78. STRINGL_CON Der angegebene String muss sich im internen STANT Name Wert Lange Flags Zend Speicher befinden Tab 9 13 Makros zur Erstellen von Konstanten 9 16 Duplizierung variabler Inhalte Der Copy Konstruktor Fr her oder sp ter m ssen Sie m glicherweise den Inhalt eines zval Contai ners einem anderen zuweisen Dies ist leichter gesagt als getan denn zval Container enthalten nicht nur Informationen ber Typen sondern auch Refe renzen auf Bereiche in den internen Daten von Zend Je nach Gr e k nnen Arrays oder Objekte mit vielen Hash Tabelleneintr gen verschachtelt wer den Durch Zuweisung eines zval zu einem anderen vermeiden Sie Duplizie rungen der Hash Tabelleneintr ge in denen Sie nur eine Referenz auf diese verwenden wenn berhaupt Um diese komplexe Art von Daten zu kopieren verwenden Sie den Copy Konstruktor Copy Konstruktoren sind in der Regel in Sprachen definiert die ein berladen des Operators unterst tzen und explizit dazu dienen kom plexe Typen zu kopieren Wenn Sie in einer solchen Sprache ein Objekt defi nieren haben Sie die M glichkeit den Operator zu berladen der in der Regel dazu verwendet wird den Inhalt von value Ergebnis der Auswertung links vom Operator rvalue das Gleiche auf der rechten Seite zuzuweisen berladen bedeutet dass dem Operator eine andere Bedeutung zugewiesen wird In der Regel wird es verwendet um einen Funktionsaufruf einem Ope
79. Sie ein Authentisierungsverfahren Der Anmeldevorgang Betrachten wir zun chst die theoretischen Konzepte der Genehmigung Die Anmeldung findet in drei Stufen statt Identifizierung Berechtigung und Genehmigung Identifizierung Bevor Sie berpr fen k nnen ob ein Benutzer berechtigt ist m ssen Sie seine Identit t kennen Daher fordern Sie ihn auf sich zu identifizieren Die Identi fizierung gibt an wer der Benutzer ist Sie kann ein Benutzername eine Kun dennummer oder etwas beliebig Anderes sein solange Sie in Ihrer Benutzer basis eindeutig ist Der Begriff Benutzer kann sich in diesem Kontext auf eine Person einen Prozess oder ein System beispielsweise einen Knoten im Netzwerk beziehen Identifizierung ist nicht dasselbe wie Authentisierung Die Tatsache dass ein Benutzer eine Identit t angegeben hat bedeutet nicht dass diese Identit t auch garantiert berechtigt ist Ohne Authentisierung ist diese Identit t suspekt Authentisierung Nachdem der Benutzer eine Identifizierung angegeben hat m ssen Sie diese berpr fen Dies ist die Aufgabe eines Authentisierungssystems Es ber pr ft die Identit t des Benutzers mit einem von drei Authentisierungsverfah ren etwas das sie wissen etwas das sie haben oder etwas das sie sind Das Verfahren etwas das sie wissen das auch als Authentisierung durch Wissen bezeichnet wird ist die im Web am h ufigsten verwendete Methode Benutzer k nnen ein Passwort w
80. Style Sheet auf die aktuellen Daten an um eine h bsch formatierte Ausgabe zu erzeugen Der einzige andere bemerkenswerte Teil des Codes ist folgende Zeile xml_parser_set_option parser XML_OPTION CASE FOLDING 0 Dieser Befehl deaktiviert die Gro schreibung d h der Parser wird angewie sen die Gro Kleinschreibung der Elementnamen beizubehalten Wenn diese Option aktiviert ist werden alle Elementnamen in Gro buchstaben umgewandelt In der Regel werden Sie diese Funktion nicht wollen da in XML die Schreibweise f r Elementnamen von Bedeutung ist 3X Web Application Development With PHP Netscape BEES File Edit View Go Communicator Help HE Bookmarks A Location http www phpwebdev com 1084 phpBook source XML XML_PrettyPrinter php3 z Ga What s Related DY rm Web Application Development with PHP lt home page gt lt title gt My Home Page lt title gt lt title gt My Second Home Page lt title gt lt head gt lt body gt lt title gt Welcome to My Home Page lt title gt lt rule gt lt rule gt lt para gt Sorry this home page is still under construction Please come back soon lt php print we got even PHP in here gt lt para gt dy gt lt home page gt Fiaa Document Done Abbildung 7 4 Ausgabe des XML Pretty Printer 321 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Der Einfachheit halber drucken wir den Quellcode
81. Suchen Sie nach nicht korrekten Deklarationen in Ihrer Moduldatei oder falsch geschriebenen externen Referenzen Beachten Sie dass dieses Problem nur f r dynamisch ladbare Module gilt Bei statischen Modulen tritt es nicht auf Fehler in statischen Modulen zeigen sich w hrend der Kompilierung 9 10 Einblick in die Quellen Nachdem Sie eine sichere Erstellungsumgebung haben und in der Lage sind die Module in die PHP Dateien einzubinden sollten wir uns ansehen wie alles zusammen funktioniert 383 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern 9 10 1 Modulstruktur Alle PHP Module haben denselben Aufbau eingebundene Headerdatei zur Integration aller notwendigen Makros API Definitionen usw C Deklaration der exportierten Funktionen zur Deklaration des Zend Funktionsblock Deklaration des Zend Funktionsblock Deklaration des Zend Modulblocks Einbindung von get_module Einbindung aller exportierten Funktionen 9 10 2 Einbindung der Headerdatei Die einzige Headerdatei die Sie wirklich f r Ihre Module einbinden m ssen ist php h die im PHP Verzeichnis abgelegt ist Diese Datei macht alle Makros und API Definitionen die Sie zum Generieren neuer Module ben tigen fiir Ihren Code verf gbar Tipp Es ist empfehlenswert eine separate Headerdatei f r Ihr Modul zu erstellen welche diemodulspezifischen Funktionen enth lt Die Headerdatei sollte alle Deklarationen f r expor
82. TTA TAA ATTA function myplugin_deinit 157 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel remove callbacks here chat_remove_callback CHATCB_IDLE myplugin_idle_ callback return 1 TTLLETTTLTTTTLT TTT LT TTT TTT TTT TLL TT TTT TTT TTT TTT TTT TTT TTT NOTE DO NOT CHANGE ANYTHING BELOW THIS POINT FTLLETTTTTTTLL TTT III III TTT LTT TTT TTT TTT TTT TATA TTT TAT TT installer code starts here register initialization function chat_register_plugin_init plugin_init_function register deinitialization function chat_register_plugin_deinit plugin_deinit_function installer code done FILTTLTTLTLTTTTLLT TTT TTT TTT ATTA TI TI TTT TTT TTT TATA TTA TTT gt Listing 3 4 Eine Plugin Schablone Der Hauptcode registriert die Initialisierungs und Deinitialisierungsroutinen f r diesen Plugin Wenn dies geschehen ist installiert die Initialisierungsrou tine die R ckrufe die dieses Plugin abfangen m chte und die Deinitialisie rungsroutine entfernt sie 3 6 Verwaltung und Sicherheit Ein System ist nur dann ein gutes System wenn es verwaltet werden kann Die Tage in denen es laut Netiquette eine Frage der Ehre war sich selbst in die Gemeinschaft zu integrieren sind l ngst vorbei Heutzutage ist fast jeder H ckern Schikanierungen und anderen Formen von Attacken ausgesetzt und leider bleiben die meisten nicht auf der verbalen Ebene
83. Teil des Prologs bildet die Dokumententyp Deklara tion Verwechseln Sie diese nicht mit der Document Type Definition DTD Die Dokumententyp Deklaration zeigt auf oder enth lt eine DTD Die DTD besteht aus Auszeichnungsdeklarationen die eine Grammatik f r XML Dokumente zur Verf gung stellen Die Dokumententyp Deklaration kann entweder auf eine externe DTD verweisen die Auszeichnungsdeklarationen direkt einbinden oder beides Die DTD f r ein Dokument besteht aus beiden Teilen Hier ein Beispiel einer Dokumententyp Deklaration lt DOCTYPE book SYSTEM docbookx dtd gt Die Dokumententyp Deklaration hat den Namen book und zeigt auf eine externe DTD namens docbookx dtd Es sind keine DTDs eingebettet Wenn ein Dokument die vollst ndige DTD aber keine externen Entit ten ent h lt wird es als standalone Dokument bezeichnet und als solches in der XML Deklaration markiert lt xml version 1 0 standalone yes gt Dies kann f r einige Anwendungen n tzlich sein z B um Dokumente ber das Netz zu schicken wenn Sie nur einen einzelnen Dokumentendatenstrom ffnen m chten Beachten Sie dass Sie selbst XML Dokumente mit externen DTDs in selbstst ndige Dokumente umwandeln k nnen indem Sie die DTD und die externen Entit ten in den Prolog des Dokuments importieren 312 Pearson A ADDISON WESLEY Education PHP und XML Dokumentenstruktur Nun kennen Sie alle Teile die ein XML Dokument ausmachen Elemente mit Attr
84. Teilnehmern vor in dem Benutzer mit jedem anderen auf geheime Weise kommunizieren soll Wenn das System nur einen einzigen Schl ssel verwenden w rde k nnte der Benutzer Joe nicht sicherstellen dass die Nachricht tats chlich von Benutzer Jane verschickt wurde Dazu br uchte jeder Benutzer einen eigenen Schl ssel Und jeder Benutzer m sste die Schl ssel aller anderen Benutzer kennen 99 Schl ssel zu verwalten und sich m glicherweise auch noch zu merken das klingt ganz und gar nicht lustig Die Hauptprobleme der Verschl sselung mit geheimem Schl ssel bestehen darin dass die Anzahl der Schl ssel mit der Anzahl der Benutzer im System steigen und dass jeder Benutzer so viele Schl ssel kennen muss wie es Benutzer gibt Verschl sselung mit ffentlichem Schl ssel Betrachten wir noch einmal das System mit den 100 Benutzern das wir im vorherigen Abschnitt angesprochen haben Statt dass 99 seinen geheimen Schl ssel kennen m ssen stellt Joe einen ffentlichen Schl ssel zur Verf gung und beh lt einen privaten geheimen Schl ssel f r sich Jeder der 99 anderen Benutzer kann nun den ffentlichen Schl ssel verwenden um eine Nachricht zu verschl sseln und diese an Joe zu schicken Nur Joe kann sie mit seinem privatem Schl ssel entschl sseln Dieses System hat einen offensicht lichen Mangel Wir haben keine Berechtigung mehr Joe wei nicht wer ihm die Nachricht geschickt hat da jeder Benutzer die Nachricht verschl sse
85. Umgebung abgestimmt sind Standardm ig werden bereits einige Klassen mit PHPLib mitgeliefert die wir sp ter in unserem Beispiel verwenden werden Sie machen einige Annahmen ber Ihr System z B dass Sie MySQL verwenden Wenn diese Annahmen auf Ihre Anwendungen nicht zutreffen sollten Sie die entsprechenden nderungen in der Datei local inc 259 Pearson vy ADDISON WESLEY Education 6 Datenbankzugriff mit PHP vornehmen Wir empfehlen ein neues Objekt als Erweiterung zu DB_Sql zu erzeugen Damit vermeiden Sie diese Konfigurationsvariable in jeder Anwendung setzten zu miissen Statt dessen definieren Sie sie einmal in einer Klasse Sie sollten am besten local inc an Ihre eigenen Bed rfnisse anpassen und zumindest den Namen der Klasse Example Session ndern Denn dieser Name wird als Bezeichnung fiir die Sitzungs Cookies verwendet und in der URL im GET Mode bergeben und es sieht nicht sehr professionell aus wenn in Ihre URL Example Session steht 6 2 Datenbankabstrahierung Eine Datenbank Abstrahierungsschicht ist eine API die eine Reihe von Funk tionen bereitstellt mit denen Sie eine Vielzahl von Datenbanken unabh ngig von der jeweiligen Implementierung verwalten k nnen Durch ndern des Backends der Datenbank Abstrahierungsschicht k nnen Sie leicht von MySQL auf Oracle umschalten Perls DBI DataBase Interface ist eine solche Schicht und eine der bekanntesten Funktionen von PHPLib ist seine Daten bank Abstrahie
86. Zeichenfolge mit 218 m glichen Elementen zu kon struieren srand double microtime 1000000 Seed the random number generator session_id mdd uniqid rand Construct the session ID Zugriff auf die IP Adresse des Benutzers Sie k nnen auf die IP Adresse des Benutzers ber die Umgebungsvariable REMOTE_ADDR zugreifen Mit phpinfo erhalten Sie eine Liste aller verf gbaren Umgebungsvariablen Jeder der versuchte dies zu knacken miisste im Brechstangenverfahren alle m glichen Elemente attackieren um eine g ltige Sitzungskennnummer aus 340 282 366 920 938 463 463 374 607 431 768 211 456 m glichen Werten heraus zufinden Die Kryptoanalytiker van Oorschot und Wiener entwickelten eine theoretische Suchmaschine f r MD5 und sch tzen 1994 dass eine solche Maschine gesch tzte Kosten 10 Millionen im Durchschnitt 24 Tage brau chen w rde um eine mit MD5 verschl sselte Nachricht zu knacken 2 Wenn Sie dies beunruhigt sollten Sie dar ber nachdenken Ihren Server vom Internet abzuklemmen md5 uniqid dasselbe Gebilde wie oben ohne rand Aufruf w re bri gens nicht willk rlich genug Da uniqid auf der Systemzeit basiert l sst sie sich erraten sobald der Hacker die Systemzeit des Servers kennt Der zu durchsuchende Bereich ist dann deutlich kleiner als 2128 4 1 2 Sitzungskennnummer Verteilung mit Cookies Die einzige Aufgabe die noch verbleibt ist die Sitzungskennnummer f r alle Seiten Ihres
87. _check_file file ret this gt _exec_pgp_command es a u my_user_id file wsto user id return ret function encrypt_conventional file passphrase file this gt _check_file file ret this gt _exec_pgp_command c a z passphrase wsfile return ret function decrypt file my_user id file this gt _check_file file ret this gt _exec_pgp_command c file u my_user_id return ret function decrypt_conventional file passphrase file this gt check file file ret this gt _exec_pgp_command z passphrase file return ret Listing 4 4 PHP Schnittstelle zu PGP 6 5 1 Da die Klasse pgp die PGP Bin rwerte Ihres Systems nur mit den entsprechen den Argumenten aufrufen brauchen Sie ein richtig konfiguriertes PGP Sys tem Insbesondere Ihr privater Schl ssel muss richtig eingestellt sein und alle ffentlichen Schl ssel f r die Sie eine Verschl sselung vornehmen wollen m ssen sich in Ihrem lokalen Schl sselbund befinden Der ffentliche Schl ssel muss ein zuverl ssiger Schl ssel sein ansonsten fragt PGP ob es den Schl ssel f r diesen Benutzer verschl sseln kann und die Klasse schl gt fehl 198 Pearson A ADDISON WESLEY Education Sicherheitsaspekte Alle Funktionen arbeiten entweder im Rahmen einer Datei oder einer Zei chenkette Wenn Sie eine Zeichenkette bergeben wird diese als tempor re Datei in
88. abfragen erhalten Sie keine Fehlermeldung sondern die ersten drei Parameter Bei nachfolgenden Aufrufen von zend_get_parameters_ex werden nicht die verbleibenden Argu mente ausgelesen sondern wieder dieselben Argumente 9 11 3 Verarbeitung mit einer variablen Anzahl von Argumenten optionalen Parametern Wenn Ihre Funktion eine variable Anzahl von Argumenten annehmen soll bieten die soeben beschriebenen Codeabschnitte manchmal nur suboptimale L sungen F r jede m gliche Anzahl von Argumenten m ssten Sie eine eigene Zeile schreiben die zend_get_parameters_ex aufruft Dies ist h ufig nicht zufriedenstellend In diesem Falle k nnen Sie die Funktion zend_get_parameters_array_ex ver wenden welche die Anzahl der auszulesenden Parameter angibt sowie ein Array in dem Sie diese speichern zval parameter_array 4 get the number of arguments argument_count ZEND_NUM_ARGS see if it satisfies our minimal request 2 arguments and our maximal acceptance 4 arguments if argument_count lt 2 argument_count gt 5 WRONG PARAMETER COUNT argument count is correct now retrieve arguments 396 Pearson A ADDISON WESLEY Education Annahme von Argumenten if zend_get_parameters_array_ex argument_count parameter_array SUCCESS WRONG_PARAMETER_COUNT Zun chst wird die Anzahl der Argumente berpr ft um sicherzustellen dass sie innerhalb des zul ssigen Bereichs liegt Danach w
89. anderen Modulen und kann leicht ge ndert ausgetauscht oder erweitert werden Jeder Teil des Programms kann ein beliebiges Freignis ausl sen und daher jede Art von Reaktion in der Anwendung erzwingen mit anderen Worten Sie k nnen jeden Teil Ihres Programmcodes von jedem anderen Teil Ihres Codes aus kontrollieren 141 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel Alle Daten k nnen von einem zentralen Punkt des Programms transparent an alle Empf nger abgesetzt werden Sie m ssen sich nicht darum k m mern Strukturen manuell zu kopieren und umzuwandeln Die einzelnen Ereignisroutinen stellen selbst sicher dass sie ihre Daten erhalten Neue Programmcode l sst sich extrem leicht in das Programm einf gen indem Sie einfach eine Prozedur schreiben die sich selbst bei dem entspre chenden Ereignis registriert Sobald der gro e Rahmen f r die Ereignisabwicklung erstellt wurde kann die gesamte Anwendung generiert werden indem Sie Routinen Routinen und noch einmal Routinen schreiben Machen Sie sich mit den Verfahren vertraut die zur Implementierung von Finite State Maschinen erforderlich sind Diese sind f r die Programmierung und allgemeine Informationsverarbeitung elementar Gl cklicherweise enth lt phpIRC bereits einen Rahmen f r die Ereignisab wicklung so dass uns diese Programmierung f r unser Projekt erspart bleibt 3 5 1 Struktur der Schnittstelle phpIRC bildet den IRC
90. anderen Projek ten wiederverwenden Mehrere Team Mitglieder k nnen gleichzeitig an demselben Projekt arbei ten ohne dass sie Gefahr laufen sich in die Quere zu kommen wenn Sie alle Dateien bei der Versionskontrolle berpr fen Diese Punkte gelten f r die meisten Ressourcen die in einem Projekt vorhan den sein k nnen Die Dateien sollten einen aussagekr ftigen Namen erhalten der ihren Inhalt wiedergibt Wenn mehrere Dateien zu einer gr eren Gruppe geh ren sollte dem Namen m glicherweise ein Pr fix vorangestellt werden Legen Sie die Dateien in Unterverzeichnissen des Projekt Wurzelverzeichnisses ab Ange nommen Sie haben eine Datenbank Abstraktionsebene mit Modulen die auf verschiedene Datenbanken zugreifen wobei diese in einzelnen Dateien gepackt sind Hier sollten alle Dateien das Pr fix dba_ tragen wobei dba f r Datenbank Abstraktion steht so dass ihre Dateien dba mysql dba_odbc dba_ oracle usw hei en Stellen Sie sicher dass Sie die Unterverzeichnisse sp ter ndern k nnen indem Sie konfigurierbare Modulverzeichnisse verwenden Ein Beispiel beachten Sie dass sich dba in diesem Beispiel nicht auf die PHP Funktionen dba_ beziehen lt require config php3 require dba_root dba php3 require socket_root socket php3 require phpPol1s_root phpPol1UI php3 53 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte FP Eed gt Die Variablen dba_root so
91. berdenken Welche Daten sollen ber die Schnittstelle ausgetauscht werden Welche Parameter brauche ich wirklich Welche Parameter werden blicherweise von den meisten oder allen Schnittstellenfunktionen benutzt Welche Reihenfolge w re f r die Parameter logisch Sobald Sie sich f r eine bestimmte Vorgehensweise entschieden haben halten Sie diese konsequent durch machen Sie in Ihrem Modul keine Ausnahme von der Regel Selbst die internen Funktionen sollten dieser Regel entsprechen Diese Strategie erm glicht Ihnen sp ter interne Funktionen in der Schnitt stelle zur Verf gung zu stellen Au erdem werden es Ihnen auch Ihre Team Mitglieder danken wenn sie neuen Programmcode in Ihr Modul integrieren m ssen Wenn Sie sich die Zeichenketten Funktionen im PHP Handbuch ansehen fin den Sie strpos strchr strrchr usw Alle diese Funktionen akzeptieren die Parameter string haystack string needle wobei haystack die Zeichenkette ist in welcher gesucht wird und needle die Zeichenkette ist nach welcher gesucht wird Sehen Sie sich nun str_replace an Diese Funktion f hrt nicht nur ein neues Namensschema ein seine Argumente sind auch das genaue Gegenteil der brigen Funktionen sie akzeptiert string needle string haystack Als wir nach dem Grund f r diese Diskrepanz fragten erhielten wir die Ant wort dass str_replace der schnelle Ersatz f r ereg_replace ist und dass die meisten Leute ihre Aufrufe von ereg_repl
92. br gt w auth gt auth perm printf Your user name s lt br gt auth gt auth uname printf lt a href s gt Log out lt a gt w sess gt url basename PHP SELF mode reload page_close Listing 6 6 Verwendung der Klasse Perm 6 3 5 Bitweise Berechnungen Bitweise Berechnungen stiften bei unerfahrenen Programmierern h ufig Ver wirrung und selbst erfahrene Entwickler haben manchmal Probleme damit Die Darstellung von Flagwerten in Bitmustern kann trotzdem sehr n tzlich sein PHPLib verwendet diese Form f r die Berechtigungsebenen Oft wird dieses Verfahren auch dazu verwendet Flagwerte in einem einzelnen INT Feld einer Datenbank zu speichern Nehmen wir als Beispiel eine Anwendung welche die verschiedenen Zust nde beispielsweise die Hobbys des Benut zers protokollieren muss Anstatt f r jedes Hobby ein eigenes Feld in einer Datenbank anzulegen und dieses auf true oder false zu setzen k nnen Sie ein einzelnes Flagfeld verwenden Je nachdem ob der Benutzer ein bestimmtes Hobby hat oder nicht wird das Bit f r dieses Hobby gesetzt oder nicht 280 Pearson A ADDISON WESLEY Education Authentisierung In einfachen Worten sind bitweise Operationen Operationen die ein oder mehrere Bits gleichzeitig verarbeiten Sie wissen dass das Bin rsystem aus einer Achterfolge von Bits besteht einer Reihe von Nullen und Einsen Die Dezimalzahl 42 wird im bin ren System als 00101010 dargest
93. 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 jenach 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 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 Pearson A ADDISON WESLEY Education 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 wUUEncoded 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
94. da PHP die offene Verbindung im zwei ten Aufruf von mysql_connect wiederverwendet Bei der Ausgabe der Ver bindungsbezeichner res_one und res_two w rden f r beide Variablen der selbe Quellbezeichner angegeben Die Auswirkung dieses Verhaltens ist dass die Verwendung von mysq _select_db f r eine Verbindung auch den Kontext der anderen Verbindung ndert Dies gilt auch f r die Objekte in PHPLib 265 Pearson A ADDISON WESLEY Education 6 Datenbankzugriff mit PHP Wenn Sie eine Datenbank fiir DB_ Sq verwenden und eine andere Datenbank f r die Sitzungsdaten wird dies zu Problemen f hren Leider gibt es f r die ses Problem bisher noch keine L sung 6 2 5 Sessions PHPLib besitzt zumindest quivalente Funktionen zu PHPs integraler Sit zungsverwaltungsbibliothek H ufig sind sogar die Namen der Funktionen identisch Sie hneln zwar in vielen Aspekten der internen Sitzungsverwal tung in PHP trotzdem ist PHPLib nicht mit ihr identisch Eine sch ne zus tz liche Funktion ist der automatische R ckfallmodus auf den wir im n chsten Abschnitt eingehen 6 2 6 Automatischer R ckfallmodus Standardm ig arbeitet die Sitzungsverwaltung mit Cookies Wie wir im Kapitel 4 im Abschnitt HTTP und Sessions betont haben sollte dies die bevorzugte Methode sein sofern vom Client unterst tzt da es das einfachste Verfahren ist um die Session ID zu verbreiten Statt dessen k nnen Sie jedoch auch die GET POST Methode einse
95. dass nicht gleich zu Beginn ernsthafte Probleme zu erwarten sind Um Komplikationen zu vermeiden empfiehlt es sich trotzdem ein Konzept zu ent wickeln um dieser Art von Problemen zu begegnen die m glicherweise sp ter auftreten Aus Sicht des Servers stellt sich das Netzwerk wie in Abbildung 3 3 dar Die hier eingesetzte Struktur hnelt einer Mischung aus Multiplexor Demul tiplexor und Hub In der Richtung vom Client zum Netzwerk komprimiert der Server alle vom Client kommenden Daten und schickt diese zu den Netz werkverbindungen In der Gegenrichtung ermittelt er welche vom Netzwerk kommende Informationen f r welchen Client wichtig sind und schickt die Daten zu den entsprechenden Verbindungen Alle vom Netzwerk ankom menden Daten die zu den anderen Netzwerkverbindungen geschickt wer den sollen werden direkt weitergeleitet Prinzipiell ist dies die Einstellung die wir f r unser eigenes Chat System brauchen Lassen Sie uns nun berlegen wie wir unser Ziel erreichen Wir ben tigen eine Server Umgebung die folgende Bedingungen erf llt Sie akzeptiert IRC Netzwerkverbindungen Sie akzeptiert IRC Client Verbindungen Sie bietet eine web basierte Benutzerschnittstelle Sie ist m glichst einfach zu implementieren 3 4 Einpassen der Anwendung in das Netzwerk Wenn Sie bereits ein Konzept f r die Entwicklung Ihres eigenen Servers in PHP hatten berdenken Sie ihn noch einmal M glicherweise sind Sie f lschlicher weise da
96. dem Namen des Stammelements Die Variable sysid gibt den Sys tembezeichner an z B docbookx dtd w hrend die Variable extid den externen oder ffentlichen Bezeichner enth lt Zur Umwandlung der spei cherinternen Struktur in eine Zeichenkette k nnen Sie die Funktion dumpmem verwenden Die Klassenvariable version gibt die XML Version des Doku ments an in der Regel ist diese 1 0 Mit diesen Erl uterungen k nnen wir jetzt zu einem ersten einfachen Beispiel bergehen Konstruieren wir einmal das XML Dokument Hello World mit LibXML doc new_xmldoc 1 0 root doc gt add_root greeting root gt content Hello World print htmlspecialchars doc gt dumpmem Damit erhalten wir folgendes wohlgeformtes XML Dokument lt xml version 1 0 gt lt greeting gt Hello World lt greeting gt Das Beispiel zeigt auch eine Eigenschaft die Sie noch nicht kennen n mlich den Zugriff auf den Inhalt eines Knotenobjekts Knoten Das Tao Te King sagt alles ist Tao Bei der XML Analyse ist alles ein Knoten Elemente Attribute Text Verarbeitungsbefehle usw aus Sicht eines Pro grammierers k nnen Sie alle auf eine hnliche Weise behandeln da alle Kno ten sind Wie wir bereits erw hnt haben k nnen Knoten die einfachste atomare Struk tur eines XML Dokuments wiedergeben Einem Knotenobjekt sind folgende Funktionen und Variablen zugeordnet 334 Pearson A ADDISON WESLEY PHP und XML Education p
97. den hier ausgelassenen Modifikationen wird es jedoch interessant Der Container von parameter wird dem vordefinierten return_value Contai ner zugeordnet Um seinen Inhalt auf effektive Weise zu kopieren wird der Copy Konstruktor aufgerufen Der Copy Konstruktor arbeitet direkt mit dem bereitgestellten Argument wobei standardm ig die R ckgabewerte FAILURE bei einer fehlgeschlagenen Aktion bzw SUCCESS bei einer erfolgreichen Aktion ausgegeben werden Wenn Sie in diesem Beispiel den Aufruf des Copy Konstruktors weglassen w rden sowohl parameter als auch return_value auf dieselben internen Daten zeigen was bedeutet dass return_value eine nicht zul ssige zus tzliche Refe renz auf dieselben Datenstrukturen w re Sobald nderungen in den Daten vorgenommen werden auf welche parameter zeigt k nnte auch return_value betroffen sein Um separate Kopien zu erstellen m ssen Sie demnach den Copy Konstruktor verwenden 423 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Das Gegenst ck des Copy Konstruktors in der Zend APl ist der Destruktor zval_dtor er tut genau das Gegenteil vom Konstruktor Der entsprechene Alias in der PHP API lautet pval_destructor 9 17 R ckgabe von Werten Auf die R ckgabe von Werten aus Funktionen in PHP sind wir in einem vor angegangenen Abschnitt bereits kurz eingegangen In diesem Abschnitt erfahren Sie n here Einzelheiten R ckgabewerte wer
98. den Typ besitzen den Sie in die Liste einf gen m chten typedef struct int resource_link int resource_type my_resource void destructor_handler my_resource resource do all deallocation relating to the resource here free container efree resource Um nun eine Ressource zur Liste hinzuzuf gen verwenden Sie zend_list_ insert my_resource resource allocate resource here and fill it with values resource my_resource emalloc sizeof my_resource resource _value zend_list_insert resource resource_handle Die Funktion hat zwei Argumente Das erste ist der Zeiger auf die Ressource die Sie in die Liste einf gen m chten Das zweite gibt den Typ der Ressource an fiir den Sie zuvor einen Destruktor registriert haben Anschlie end k n nen Sie den R ckgabewert des zend_list_insert Aufrufs im value Feld des entsprechenden zval Containers IS_RESOURCE verwenden 419 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Um beispielsweise die zugewiesene Ressource als R ckgabewert zu verwen den geben Sie Folgendes ein RETURN RESOURCE resource _value Oder etwas eleganter return_value gt type IS RESOURCE return_value gt value val resource_value Wie Sie sehen werden die Ressorcen im Feld 1val gespeichert Nun verfolgt Zend alle Referenzen auf diese Ressource Sobald es keine Refe renzen auf diese Ressource mehr gibt w
99. die sogenannten Container laut PHPLib Terminologie um Session Daten zu speichern Alle Container Klassen beginnen mit dem Pr fix CT_ blicherweise werden Session Daten in einer SQL Datenbank gespeichert aber PHPLib kennt auch andere Containerklassen In PHPLib 7 2 sind folgender Container Klassen verf gbar Der Standard Container ist CT_Sq Er speichert die Session Daten in einer Datenbank Er besitzt folgende Klassenvariablen Name Beschreibung database_class Name der Klasse DB_Sq1 die f r den Verbindungsaufbau mit der Datenbank verwendet werden sollte database table Name der Tabelle die zur Speicherung der Session Daten ver wendet wird encoding_mode Diese Variable steuert die Art wie Session Daten gespeichert werden Sie kann zwei Werte annehmen base64 oder sla shes Normalerweise sollten Sie den Standardwert base64 nicht ndern Auf diese Weise werden Session Daten mit Base64 verschl sselt bevor sie in der Datenbank gespeichert werden M glicherweise m chten Sie aber die alternative Me thode slashes verwenden um Session Daten als Klartext in der Tabelle abzulegen und die Fehlersuche zu erleichtern 268 Pearson vy ADDISON WESLEY Education Datenbankabstrahierung In Bezug auf Funktionen ist CT_Split_Sq identisch mit CT_Sql Verwenden Sie diese wenn die zugrunde liegende Datenbank nicht gen gend Daten in einem Feld f r die Session Daten speichern kann insbesondere wenn d
100. diesen Wert mehr was eine automatische Frei gabe dieses Wertes zur Folge hat Tab 9 5 Zend Struktur zval 402 Pearson vy ADDISON WESLEY Education Annahme von Argumenten Eintrag Beschreibung lval Verwenden Sie diesen Parameter wenn die Variable vom Typ IS_LONG TS BOOLEAN oder IS_ RESOURCE ist dval Verwenden Sie diesen Parameter wenn die Variable vom Typ IS_ DOUBLE ist str Diese Struktur kann verwendet werden um auf Variablen des Typ IS_ STRING zuzugreifen Das Mitglied len enth lt die Lange des Strings Das Mitglied val zeigt auf den String selbst Zend verwendet C Strings Die Langenangabe endet mit 0x00 ht Dieser Eintrag zeigt auf des Hash Tabelleneintrag der Variablen wenn die Variable ein Array ist obj Verwenden Sie diesen Parameter wenn die Variable vom Typ IS_OB JECT ist Tab 9 6 Zend Struktur zvalue_value Konstante Beschreibung S_NULL ein NULL leerer Wert S_LONG ein Long Integer Wert S_DOUBLE ein Double Flie komma Wert S_STRING ein String S_ARRAY bezeichnet einen Array S_OBJECT ein Objekt S_BOOL ein boolescher Wert S_RESOURCE eine Ressource zur Er rterung von Ressourcen siehe den ent sprechenden Abschnitt weiter unten S_CONSTANT ein konstanter definierter Wert Tab 9 7 Zend Variablentyp Konstante Um auf einen Long zuzugreifen verwenden Sie zval value val um auf eine Double zuzugreifen verwenden sie zval value dval usw D
101. 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 list 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 Pearson A ADDISON WESLEY Education Array Funktionen k nnten auf
102. eine Art von Zeitplanung zu erhalten Prozesse konnten so dar auf warten bis auf einem Ger t Zeit verf gbar war oder hnliches In der Zeit in der Sie darauf warten dass ein Semaphor frei wird wird der war tende Prozess schlafen gelegt und kann keine anderen Aufgaben berneh men Wenn nun der Hauptprozess darauf wartet dass das Benutzereingabe feld eine neue Nachricht ank ndigt kann er den ankommenden Netzwerkdatenstrom nicht verarbeiten weil er gerade schl ft Trotzdem ist das noch kein Grund jetzt aufzugeben Es gibt noch andere L sungen Setzen von Flags im Shared Memory Das Shared Memory hnelt den Semaphoren ist aber vielseitiger Hierbei handelt es sich um einen Speicher der f r jeden Prozess in einem System ver f gbar ist Multitasking Systeme sind in der Regel so konzipiert dass jeder Prozess aus Sicherheitsgr nden vollst ndig unabh ngig von den anderen Prozessen ausgef hrt wird Mehrere Prozesse k nnen dieselben Daten benut zen indem sie spezielle Speicherbl cke sogenannte Shared Memory Bl cke 149 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel einrichten und eine Verbindung zu diesen herstellen Diese Bl cke k nnen Variablen enthalten oder jede andere Art von Daten wobei PHP nur die Spei cherung von konkreten Variablen unterst tzt Genau dies wollen wir die M glichkeit einen booleschen Wert an einer Stelle im Speicher abzulegen an der jeder Pro
103. eine lokale Verbindung erreichen wie Abbildung 3 1 zeigt Er ist zwar nicht so leistungsf hig wie wir es gerne h tten aber immerhin ein Anfang Als N chstes k nnten wir im Web surfen um Seiten zu suchen die eine der heute schon fast obligatorischen Chat Verbindungen haben Sie unterscheiden sich zwar stark im Aufbau und Layout aber die meisten lassen sich auf die folgenden Punkte reduzieren Java f r aufwendige Schnittstellen auch wenn einige reines HTML ver wenden Ein propriet res Protokoll mit einem einzelnen Server oder einfach daten bankbasiert Kaum vordefinierte R ume Kaum vordefinierte Befehle 131 Pearson vy ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel Abbildung 3 1 Der konventionelle Befehl talk Neben diesen Chat Einrichtungen gibt es weitere Chat Programme und Netzwerke wie etwa ICO von Mirabilis oder die verschiedenen Instant Messaging Systeme die nicht immer Echtzeit Dienste bereitstellen und in der Regel zus tzliche propriet re Client Software ben tigen um auf jedem teil nehmenden System installiert werden zu k nnen Ein System hebt sich jedoch von der Menge ab IRC Internet Relay Chat ist ein weit verbreitetes und seit langem verwendetes Chat Protokoll das von vielen Netzwerken benutzt wird von denen einige Hunderttausende Benut zer gleichzeitig bedienen Das IRC Protokoll ist textbasiert was von Nachteil ist wenn Sie unter hoher Belastung arbeite
104. erfordert oder h ufig von vielen Skripten auf Ihrer Website verwendet wird Die Notwendigkeit PHP neu zu kompilieren wird schnell durch den Gewinn an Geschwindigkeit und seine Benutzerfreund lichkeit wettgemacht Eingebaute Module sind jedoch nicht ideal wenn Sie rasch kleine Zus tze entwickeln m chten 9 3 3 Die Zend Engine Nat rlich k nnen Erweiterungen auch direkt in der Zend Engine realisiert werden Diese Strategie ist geeignet wenn Sie eine nderung im Sprachver halten ben tigen oder spezielle Funktionen brauchen die direkt im Sprach kern integriert sind Im Allgemeinen sollten Modifikationen an der Zend Engine jedoch vermieden werden nderungen f hren hier zu Inkompatibili t ten mit anderen Programmen und es wird kaum jemand Anpassungen an eine speziell zusammengestellte Zend Engine vornehmen Da Modifikationen stets direkt im PHP Quellcode durchgef hrt werden werden sie berschrie 370 A ADDISON WESLEY Pearson Education Struktur der Quellen ben sobald Sie ein Update mit den offiziellen Quellen machen Daher wird diese Methode im Allgemeinen als schlechte Praxis betrachtet und aufgrund seiner Seltenheit in diesem Buch nicht behandelt 9 4 Struktur der Quellen Bevor wir uns direkt mit Fragen des Programmcodes besch ftigen sollten Sie sich mit der Baumstruktur der Quellen vertraut machen um sich schnell durch die PHP Dateien durchzufinden Dies ist unbedingt notwendig um Erweiterungen einbin
105. erneut ffnen vielleicht sogar erst nach einem Jahr haben Sie m glicherweise einige der Strukturen vergessen und wissen nicht mehr warum Sie diese benutzten Das haben wir h ufig selbst erlebt sowohl in unseren Program men als auch in jenen von anderen Als goldene Regel merken Sie sich ein fach dass Sie kaum zu viele eingebettete Kommentare schreiben k nnen Die einzige Ausnahme hiervon ist wenn zu viele Kommentare den Programm code den sie beschreiben sollen zu un bersichtlich machen Offensichtliche Dinge sollten Sie nicht kommentieren Ein paar Beispiele finden Sie in Listing 1 7 function calculate_next_index base_index base_index base_index 1 increase base index by one 45 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte Ep Table of contents 1 Introduction 2 About the authors LOTS of lines cut out new_index base_index COMPLICATED NUMBER 3 14 sin base_ windex Listing 1 7 Schlechte eingebettete Kommentare In der ersten Zeile wird base_ index um 1 erh ht muss dass kommentiert werden Wir bezweifeln es Jeder kann sehen dass base_index erh ht wird Aber warum wird es erh ht und warum gerade um 1 Ein besserer Kommen tar w re Jump to the next ordinal index we want to point to it s exactly one element away Springe zum Index mit der n chsten Ordnungszahl er ist genau ein Element weit entfernt Dieselbe
106. experimentieren Sie mit den Archiven auf der CD ROM und versuchen Sie von dort aus fortzufahren Stellen Sie sicher dass Sie eine funktionierende PHP Umgebung selbst kom pilieren k nnen Auf diesen Aspekt werden wir hier nicht n her eingehen da Sie ber diese grundlegenden Kenntnisse bereits vor der Lekt re dieses Buches verf gen sollten Die folgende Tabelle beschreibt den Inhalt der wichtigsten Verzeichnisse Verzeichnis Inhalt php 4 Wichtigste PHP Quelldateien und Headerdateien hier finden Sie alle API Definitionen Makros usw von PHP wichtig dl Verzeichnis f r dynamisch ladbare Module enth lt die spezielle Headerdatei phpdl h sowie die notwendigen Dateien f r die Auto matisierung des make Prozesses Dieses Verzeichnis ist ein ber bleibsel aus dem vorherigen PHP Erstellungssystem und soll aus dem Programmverzeichnis entfernt werden Von seiner Verwen dung wird daher abgeraten ext Verzeichnis f r dynamische und eingebaute Module standardm Big sind dies die offiziellen PHP Module die in das Hauptpro grammverzeichnis integriert wurden In PHP 4 0 k nnen diese Stan darderweiterungen als dynamisch ladbare Module kompiliert wer den zumindest jene die diese Funktion unterst tzen pear Verzeichnis f r die Ablage von PHP Klassen Zum Zeitpunkt der Bucherstellung befindet sich dieses Verzeichnis noch in der Konzep tion es soll aber etwas hnliches wie CPAN f r Perl eingerichtet werden s
107. f r dieses Beispiel hier nicht ab Sie finden ihn auf der CD ROM Abbildung 7 4 zeigt einen Screen shot dieser Ausgabe Normalerweise reicht die Verwendung einer einzigen Tiefenvariable nicht aus Die Verwendung von ereignisbasierten Parsern f hrt schnell dazu dass Sie am Ende doch Ihre eigenen Stapel oder Listen verwenden um Informatio nen ber die Dokumentenstruktur zu speichern Dies zeigt auch das n chste Beispiel das Sie in Listing 7 3 sehen require xml php3 The first argument is the file to process file argv 1 Initialize variables elements stack array total_elements total_chars 0 The base class for an element class element var count 0 var chars 0 var parents array var childs array Utility function to print a message in a box function print_box title value printf n 2 60s n printf 20s title printf 414s value printf 426s n printf 60s n Utility function to print a line function print_line title value 5 printf 20s title printf 15s n value Sort function for usasort function my_sort a b 322 Pearson Education A ADDISON WESLEY PHP und XML return is_object a amp amp is_object b b gt count a gt count 0 function start_element parser name attrs global elements stack
108. fehlerhaften Eingabefeld wird eine Fehlermeldung ange zeigt wodurch der Benutzer eine sofortige R ckmeldung erh lt In allen For mularfeldern sind die Eingaben des Benutzers vorab eingetragen so dass Daten nie verloren gehen Wenn w hrend der berpr fungsphase kein Fehler entdeckt wurde wird count errors auf Null gesetzt und das Programm kann die Daten verarbeiten d h sie in eine Datenbank speichern sie per Email weiterschicken usw 3 Web Application Development With PHP Netscape E l x Fie Edit View Go Communicator Help q Aue Bookmarks a Location frie www phpwebdey com book Forms PHP_Normal_Form php3 eng What s Rel Web Application Development with PHP There were some errors Please see below for details eee TOBIAS Ratschiller The name you entered is not a valid string EMail ftobias dnet The email address you entered is not valid BE Er Document Done p WE gP 5 Astant FX Web Application D amp Posteingang Outlook g PuTTY www phpwebd 4 a 3 E i AAO 1057 Abbildung 5 2 Das PHP Standardformular in Aktion 226 Pearson vy ADDISON WESLEY Education Die PHP Normal Form Ein weiterer kleiner Trick den wir fiir sehr niitzlich halten ist alle Formular daten in einem Array zusammenzufassen Im Beispiel nennen wir es form Wenn Sie eine Uberpriifungsregel auf jedes einzelne Element anwenden m chten das vom Benutzer eingegeben wur
109. finden Dies f hrt h ufig zu Fehlern da nicht alle versteckten Fallen die manchmal wirklich nicht leicht zu finden sind gefunden werden YIIIIIT III III TATTLE LLL int irc get channel by name string name VIII TIITTIITT ALTA TAT TTT AEA Searches a channel by its name in the internal channel table and returns its handle FILTILLTLLLTTT ATLL TTT TTT TATA TT TATA AAA TATA AAA TAT Parameter name name of channel to search for 44 Pearson A ADDISON WESLEY Education Kodierungskonventionen LITTILTLLLLTTT TTL LTT TT TTT TT TATA TTT ATTA TATA TAA ATT AAT Return value Channel handle numeric 0 on error nr Global references irc_channel_array nor Listing 1 6 Typischer Funktions Header Kommentar Ein Funktions Header Kommentar sollte einige der folgende Punkte enthal ten in geordneter Reihenfolge Funktionsprototyp Detaillierte Beschreibung der Funktionen Anmerkungen Hinweise Parameterbeschreibung Beschreibung des R ckgabewertes Globale Verweise OSs Or S w Ye oe Autor und Datum der letzten Anderung Eingebettete Kommentare Eingebettete Kommentare werden direkt im Programm eingefiigt Sie sollen die Fragen beantworten die an dieser Stelle auftreten Wahrend Sie program mieren ist Ihnen natiirlich alles ganz klar Das ist meist die Ursache dafiir dass zu wenige Kommentare eingef gt werden Wenn Sie die Datei sp ter
110. gt print lt p gt Listing 6 1 Erstes einfaches Beispiel f r die Verwendung von DB_Sql 263 Pearson A ADDISON WESLEY 6 Datenbankzugriff mit PHP Education Die erste Zeile erzeugt eine neue Instanz der Klasse DB_Sql Standardm ig wird diese Klasse in der Datei db_mysq inc definiert die in prepend php3 gela den wird und verwendet als Datenbankprozessor MySQL Als N chstes wird eine Verbindung zur Datenbank hergestellt Nat rlich m ssen Sie die Werte auf Ihre Situation anpassen In diesem Beispiel stellen wir eine Verbindung zur Datenbank test auf localhost her wobei wir den Benutzernamen root und kein Passwort verwenden Sie k nnen diese Parameter auch direkt ber die entsprechenden Klassenvari ablen setzen db new Example Db db gt Database test db gt Host localhost db gt User root db gt Password Beim Aufruf von db gt query stellt PHPLib fest dass bisher noch keine Ver bindung hergestellt wurde und ffnet automatisch eine wobei es die zuvor in den Klassenvariablen definierten Werte verwendet Unser Beispiel wird mit db gt query fortgesetzt Dieser Aufruf behandelt alle Aspekte die zum Abschicken einer Abfrage an die Datenbank erforderlich sind Er stellt eine Verbindung zur ausgew hlten Datenbank her wenn dies nicht bereits erfolgt ist und behandelt auftretende Fehler Wenn wir db gt Debug auf true gesetzt haben gibt diese Funktion die SQ
111. h ngt vom einzelnen Projekt ab Einige wichtige Prinzipien sind jedoch f r die Entwicklung aller benutzerorientierten Programme g ltig Fr he Konzentration auf den Benutzer direkter Einbezug desselben in die Konzeption Fr he und kontinuierliche Bewertung des Programms Empirische Messung der Tauglichkeit selbst in fr hen Phasen der Ent wicklung Iterative Konzeption und Entwicklung 4 3 1 Tauglichkeit in Webanwendungen Webanwendungen unterscheiden sich grundlegend von Desktop Program men Mit HTML k nnen Sie das Layout nicht zu 100 zuverl ssig kontrollieren Sie m ssen bei der Anzeige Kompromisse eingehen M glicherweise wird Ihre Website auf einer Vielzahl von Anzeigeger ten dargestellt Dies kann von Palm Pilots bis Web TV mit einem Standardbrowser auf einem 800 x 600 Bildschirm variieren Die Benutzerinteraktion wir aufgrund der heute noch niedrigen Bandbreite stark gebremst Auf der Client Seite k nnen Sie damit nur die einfachsten Basisskripte mit JavaSkript ausf hren 208 Pearson A ADDISON WESLEY Education Die Bedeutung der Tauglichkeit Bei der traditionellen Softwareentwicklung k nnen Sie die Aktionen des Benutzers beeinflussen Sie k nnen Men punkte grau hinterlegen oder modale Dialogboxen ausgeben welche das Programm solange blockieren bis der Benutzer die Fragen beantwortet hat Auf der Website k nnen Sie jedoch nicht kontrollieren wie sich der Benutzer bewegt Er kann ber direkte Links
112. hohem Datenverkehr nutzt stammt von Ph D Eric B Schor vitz und John E Joganic von MarketPlayer com 8 3 1 Firmenhintergrund MarketPlayer com bietet ein reales Finanztraining f r einzelne Investoren die erlernen m chten wie sie an der B rse Geld machen MarketPlayer coms Werkzeuge zur B rsen berwachung und Diagrammerstellung die Institu tionsqualit t haben helfen Investoren ihre eigenen Investitionsstrategien zu entwickeln und die risikolosen spa igen und aufregenden B rsenwettbe werbe erm glichen Investoren ein Investmentportfolio zu handeln und zu testen Die Produkte von MarketPlayer com sind ber die firmeneigene Website unter www marketplayer com frei verf gbar au erdem ber strategische inhalts bezogene Allianzen mit f hrenden Medien Service Providern und Finanz dienstleistern einschlie lich AOL CNBC E TRADE money com Compu Serve ESEC Pan European Partner internet com und anderen MarketPlayer com besch ftigt 24 Mitarbeiter in den Bereichen Marketing Produktentwicklung Kundenservice und Programmierung Drei der Pro grammierer besitzen fundierte Kenntnisse in C und PHP zwei weitere sind begnadete PHP Programmierer 8 3 2 Die PHP Produkte Die von MarketPlayer com angebotene Produkte lassen sich in zwei grundle gende Kategorien unterteilen quantitative Finanzanwendungen und Simula tionsprogramme f r den Online B rsenhandel Um sich in diesen Bereichen zu behaupten muss sich MarketPlaye
113. i Replace placeholder for this loop iteration tpl gt set_var BLOCK_PLACEHOLDER Loop 1 Parse block append the result to itself tpl gt parse block_handle block true Parse and output page tpl gt parse page page tpl gt p page Auf die Weise erh lt der Programmdesigner die M glichkeit Zeilenschablo nen zu definieren ohne sich um den PHP Code k mmern zu m ssen Es macht zwar die Aufgabe des Entwicklers flexibler trotzdem gibt es noch einige Szenarien in denen Sie keine andere M glichkeit haben als Code und Layout zu mischen Ein Beispiel hierf r ist die Suchergebnisseite unserer Anwendung Im Programmcode f r diese Seite finden Sie folgenden Abschnitt entries kb get entries by keyword keywords Any entries found if entries tpl gt set_block tip summary tip entries kb_entries_to_template entries tpl tpl gt set_var array RESULTS TITLE gt sprintf count entries s found count entries gt 1 entries entry KEYWORDS gt keywords 298 Pearson A ADDISON WESLEY Education Wissensrepr sentation else tpl gt set_var MESSAGE lt div align center gt lt i gt No entries _ wfound lt i gt lt div gt tpl gt parse entries tip true Der Programmcode berpr ft ob Eintr ge in der Datenbank gefunden wur den die mit dem Suchbegriff bereinstimmen Entsprechend wird
114. in den USA der tech nische Redakteur lebt in Australien und alle greifen auf einen zentralen Datenbestand namens phpBook auf einen CVS Server zu der sich in Nordita lien befindet Zu dem Datenbestand geh ren alle Texte sowie einige PHP Werkzeuge die dazu dienen einheitliche Versionen der einzelnen Kapitelda teien zu erstellen einige Ressource Dateien f r XMetal auf die wir in K rze eingehen die Codebeispiele und die Abbildungen Auf unseren lokalen Systemen verwenden wir WinCVS oder ein Befehlzeilen CVS um die Dateien zu verwalten w hrend wir den Text mit XMetaL SoftQuad s XML Editor auf recht bequeme Art und Weise bearbeiten k nnen 233 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien Viele Softwareprojekte haben ein hnliches Szenario Die Entwickler sind ber die ganze Welt verteilt CVS eignet sich hervorragend f r internetba sierte Softwareentwicklung Sie ist eine Client Server Anwendung die das Netz als Transportschicht verwendet und den Quellcode zentral pflegt und verwaltet Innerhalb des gesamten Datenbestandes werden die einzelnen Pro jekte in Modulen organisiert Jeder Entwickler muss sich f r das Modul mit dem er aus diesem Datenbestand arbeiten m chte anmelden arbeitet dann aber mit der lokalen Version Auf diese Weise werden die Onlinezeiten erheb lich reduziert insbesondere wenn Sie einen Internetzugang ber W hlleitung verwenden m ssen Wenn der Entwickler al
115. ist Ihre ganz spezielle Einstellung wieder herzustel len PHP arbeitet zwar zu 99 systemunabh ngig aber einige Dinge h ngen eben doch vom System ab W gen Sie jedes Mal sorgf ltig ab ob die Festle gung des Systems auf bestimmte Gegebenheiten einen m glicherweise riesi gen Verlust von Kunden wert ist 3 5 4 Schnittstelle zum Benutzer Nachdem wir alle f r den Datenaustausch problematischen Aspekte beseitigt haben ist die eigentliche HTML Schnittstelle zum Benutzer trivial Wir wis sen wie wir mit Eingaben des Benutzers umgehen m ssen und wie die Netz werkkommunikation zu verwalten ist Das letzte Problem besteht darin die erzeugte Ausgabe f r den Benutzer auf eine bequeme Art und Weise zu verpacken HTML bietet nur eine M glichkeit um mehrere Fenster im Brow ser unabh ngig voneinander anzuzeigen Frames Die Schnittstelle besteht in der Regel aus dem Benutzereingabefeld dem Chat Ausgabefeld einer Liste 150 Pearson A ADDISON WESLEY Education Schnittstelle zum Netzwerk mit Benutzernamen die andere teilnehmende Clients in demselben Raum zeigt und eine Aktionsleiste Mit letzterer k nnen Sie einige Aktionen durch f hren wie etwa nderungen des Benutzernamens Verbindungsaufbau Teile Verbindungsabbau usw Diese Aktivit ten k nnen alle ber denselben Prozess verwaltet werden der das Ergebnis in einem Frame ausgibt Der Hauptprozess der auch f r den Datenstrom der Chat Ausgabe verant wortlich ist
116. ja f hrt es das Skript den nicht bedingten Test aus z B with myext yes in diesem Fall ist der Wert der Op tion in der Variablen withval enthalten An sonsten f hrt es den bedingten Test aus PHP _EXTENSION Modulname Diese Makro ist ein Muss f r PHP um Ihre Er shared weiterung zu konfigurieren Sie k nnen neben Ihrem Modulnamen ein zweites Argument lie fern das angibt ob Sie ein Kompilierung als ge meinsam genutztes Modul Shared Modul be absichtigen Dies f hrt dazu dass Ihre Quelle w hrend der Kompilierung als COMPILE_DL_ lt Modulname gt definiert wird Tab 9 18 M4 Makros fiir config m4 9 22 2 Zus tzliche API Makros Kurz vor der Freigabe dieses Buches wurden eine Reihe von Makros f r die Zend API eingef hrt die den Zugriff auf zval Container vereinfachen siehe Tabelle 9 19 Wir haben jedoch beschlossen sie in den Beispielquellcodes nicht zu verwenden da sie nicht h ufig Zugriff auf zval Container nehmen und die Makros zu Quellcode gef hrt h tten der schwieriger zu lesen gewe sen w re Makro Referenziert auf Z_LVAL zval zval value lval Z_DVAL zval zval value dval Z_STRVAL zval zval value str val Z_STRLEN zval zval value str len Tab 9 19 Neue API Makros fiir den Zugriff auf zval Container 437 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Makro Referenziert auf Z_ARRVAL zval
117. 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 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 Pearson vy ADDISON WESLEY Education Verknupfte Listen Y 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_ l
118. korrekt zu schlie en Listing 7 5 setzt unser voriges Hello World Beispiel fort und generiert ein 337 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie komplettes RSS Dokument RSS steht f r Rich Site Summary ein XML For mular zur Bereitstellung von Inhalten f r Websites Das Beispiel verwendet setattr um Attribute zu einem Element hinzuzuf gen und new_child um Elemente einem Knoten hinzuzuf gen Haben Sie bemerkt wie new_ child verwendet wird Die Funktion gibt ein Knotenobjekt zur ck aber es steht Ihnen frei den ausgegebenen Wert einfach zu verwerfen wenn Sie ihn nicht brauchen Sie ordnen ihn einfach nur dann einer Variablen zu wenn Sie Tochterelemente zu dem gerade erzeugten Knoten hinzuf gen m chten doc new_xmldoc 1 0 root doc gt add_root rss root gt setattr version 0 91 channel root gt new_child channel channel gt new_child title XML News and Features from XML com channel gt new_child description XML com features a rich mix of winformation and services for the XML community channel gt new_child language en us channel gt new_childC Tink http xml com pub channel gt new_child copyright Copyright 1999 O Reilly and Associates wand Seybold Publications channel gt new_child managingEditor dale xml com Dale Dougherty channel gt new_childC webMast
119. m glich sind Kerbe ros verwendet dieses Verfahren Ein zentrales Thema bei kritischen Daten bleibt jedoch das potentielle Risiko Ein Nachteil ist m glicherweise die Leistung Viele Algorithmen mit gehei men Schl sseln sind bedeutend schneller als Systeme mit ffentlichen Schl s seln Die Verschl sselung mit ffentlichen Schl sseln soll die Verschl sselung mit geheimen Schl sseln nicht ersetzen In einigen Situationen ist die Verschl s selung mit ffentlichen Schl sseln unn tig und nur die Verschl sselung mit geheimen Schl sseln reicht aus Wenn Sie Daten auf dem Server speichern verwenden Sie wahrscheinlich eine Verschl sselung mit einem einzigen Schl ssel Da es keine unterschiedlichen Benutzer in diesem Szenario gibt und das System den Schl ssel zur Verschl sselung und Entschl sselung kennt bringt es keinen Vorteil einen ffentlichen und einen privaten Schl s sel zu haben F r die bertragung von Daten zu einem entfernten System z B beim Verschicken von Bestellungen von einem Onlineshop via E Mail wird die Verschl sselung mit ffentlichen Schl sseln vorgezogen da Sender und Empf nger zwei unterschiedliche Benutzer sind die ber einen unsiche ren Kanal kommunizieren Der Verschl sselungsstandard Pretty Good Privacy PGP Leider bietet PHP noch keine Unterst tzung f r PGP Pretty Good Privacy Da es jedoch bereits einige Open Source Alternativen gibt z B Gnu Privacy Guard www gnupg org sind
120. m ssen die WDDX Pakete nicht g ltig sein da sie keine Dokumen tentypdeklaration im Dokumentenprolog besitzen m ssen Der grundlegende Gedanke ist dass WDDX die Umwandlung einer beliebi gen Standarddatenstruktur Integer Strings Arrays usw in eine XML Dar stellung erm glicht die der WDDX DTD entspricht Diese Daten k nnen dann ber einen Kommunikationskanal bertragen werden der XML f hig ist HTTP FTP Email usw Die Daten k nnen zu jedem Zeitpunkt aus dem WDDX Format wieder in dieselbe Struktur wie zuvor zur ck bertragen werden W hrend des gesamten Konvertierungsprozesses bleiben die Daten typen erhalten Wenn Sie ein Array als WDDX Paket serialisieren wird es nach der Deserialisierung wieder ein Array sein Wenn dies alles w re w re es nicht sehr aufregend Immerhin k nnen Sie eine beliebige Datenstruktur in PHP mithilfe von serialize in eine propriet re Form umwandeln und sie mit deserialize wieder in ihr urspr ngliches For mat zur ckwandeln und das so h ufig Sie wollen Der interessante Aspekt von WDDX ist dass die serialisierte Darstellung ein XML Format ist und die 342 Pearson A ADDISON WESLEY Education Datenaustausch mit WDDX Serialisierungs und Deserialisierungsmodule klar von dieser getrennt sind Alle Programmiersprachen die WDDX unterst tzen k nnen WDDX Pakete serialisieren und deserialisieren Serialisieren Sie ein PHP Array in ein WDDX Paket deserialisieren Sie das Paket
121. make Prozess hat etwas von Hackercode ist veraltet und soll aus dem Quellverzeichnis entfernt werden Zugegeben es ist zun chst sehr viel einfacher es zu verwenden um dynamische Erweiterun gen zu erzeugen aber wir raten trotzdem davon ab das Verzeichnis d zu ver wenden da es nicht die M glichkeiten des Verzeichnis ext hat und in K rze sowieso gel scht werden soll Die dritte Methode eignet sich f r jene denen aus welchen Gr nden auch immer nicht das gesamte PHP Quellverzeichnis zur Verf gung steht die nicht Zugriff auf alle Dateien haben oder einfach nur auf ihrer Tastatur her umspielen wollen Diese F lle sollten zwar extrem selten sein aber der Voll st ndigkeit halber gehen wir auch auf diese Methode ein 9 7 1 Kompilierung mithilfe von Make Zur Kompilierung der Beispielquellen ber den Standardmechanismus kopieren Sie alle zugeh rigen Unterverzeichnisse in das Verzeichnis ext Ihrer PHP Quellstruktur Anschlie end f hren Sie buildconf aus dies erzeugt ein neues configure Skript das die entsprechenden Optionen enth lt Standard m ig sind alle Beispiel Quelldateien sind von der Kompilierung ausge schlossen Sie brauchen also keine Angst zu haben dass Sie Ihren Erstellungs prozess zerst ren Nachdem Sie buildconf ausgef hrt haben listet configure help die folgen den zus tzlichen Module auf enable array_experiments Aktiviert Array Experimente enable call_userland Aktiviert das Userland Modul
122. module und enable my module Verwenden Sie die erste Option wenn Sie auf externe Dateien referenzieren so etwa die Anweisung with apache um auf das Apache Verzeichnis zu referenzieren Verwenden Sie die zweite Option wenn der Benutzer einfach nur entscheiden soll ob Ihre Erweiterung freigegeben wird Ganz egal welche Option Sie verwenden Sie sollten die andere nicht ben tigte auskommentieren Wenn Sie z B enable my module verwenden sollten Sie die Unterst tzung f r with my_ module ausschalten und umgekehrt Standardm ig akzeptiert die von ext_skel erzeugte Datei config m4 beide Anweisungen und gibt automatisch Ihre Erweiterung frei Die Freigabe der Erweiterung geschieht ber das Makro PHP_EXTENSION Um das Standardver halten zur Einbindung Ihres Moduls in die PHP Bin rdatei zu ndern wenn der Benutzer dies w nscht indem er explizit enable my_ module oder with my_module angibt ndern Sie den Test f r PHP_MY_MODULE auf yes if test PHP_MY MODULE yes then an Action PHP_EXTENSION my_ module ext_shared fi 377 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Damit m ssten Sie enable my_module jedes Mal verwenden wenn Sie PHP neu konfigurieren und kompilieren Hinweis Stellen Sie sicher dass Sie buildconf jedes Mal ausf hren wenn Sie config m4 ndern Auf die M4 Makros die f r Ihre Konfigurationsskripte verf gbar sind gehe
123. nicht verwenden m chten Verwenden Sie dieses Makro in Verbindung mit ZEND_NAMED FUNCTION ZEND_FALIAS Definiert einen Alias namens Alias fur Name Arg_ Name Alias Arg _typen typen muss auf NULL gesetzt sein Ben tigt keine entsprechende C Funktion referenziert statt des sen auf das Aliasziel PHP_FE Name Arg_typen Alte PHP API quivalent zu ZEND_FE PHP_NAMED FE Alte PHP API quivalent zu ZEND_NAMED_FE Laufzeit_name Name Arg_typen Tab 9 2 Makros zur Definition von Funktionen 387 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Hinweis ZEND_FE kann nicht zusammen mit PHP_FUNCTION verwendet wer den genauso wenig wie PHP_FE mit ZEND_FUNCTION Zul ssig ist jedoch ZEND_ FE und ZEND FUNCTION mit PHP_FE und PHP_FUNCTION zu kombinieren wenn Sie bei den zu deklarierenden Funktionen stets im selben Makrosatz bleiben Die Vermischung ist jedoch nicht empfehlenswert Statt dessen sollten Sie nur ZEND Makros verwenden 9 10 5 Deklaration des Zend Modulblocks Dieser Block wird in der Struktur zend_module_entry gespeichert und enth lt alle notwendigen Informationen um den Inhalt des Moduls f r Zend zu beschreiben Die internen Definition dieses Moduls zeigt Listing 9 6 typedef struct _zend module entry zend module entry struct _zend module entry char name zend_function_entry functions int module_startup_func CINIT_FUNC_ARGS int m
124. nken reduzieren Sie damit das Risiko angegriffen zu werden Dies f hrt uns direkt zu der Frage ob wir ein reales Protokoll wie IRC ber haupt brauchen Oder w rde es ausreichen ein datenbankgesteuertes Proto koll mit einer Fernsynchronisierungsfunktion zu verwenden um die erfor derlichen Netzwerkfunktionen zu erhalten Fragen wie diese werden jedes Mal auftauchen wenn Sie ein Programm pla nen und sie tauchen h ufig auf Vergewissern Sie sich dass Sie alle Aspekte bedacht haben und stellen Sie sicher dass zu einem sp teren Zeitpunkt der Entwicklung keine Fragen mehr offen sind Hier und jetzt ist der Punkt an dem Sie sich mit diesen Fragen befassen k nnen Sp ter sind Sie vielleicht nicht mehr in der Lage sie zu l sen und m ssen schlie lich Ihr Projekt aufge ben Ein gutes Projekt ist ein Projekt ohne Zweifel ohne Unsicherheiten ohne Inkonsistenzen und ohne unvorhergesehene Eventualit ten Stellen Sie sicher dass Sie nach der Planungsphase eine stabile und vollst ndig ausgewertete Situation gew hrleisten k nnen Lassen Sie uns damit zur Beantwortung der Frage zur ckkehren Brauchen wir ein offenes und m glicherweise zu kompliziertes Protokoll wie IRC oder sollten wir beim konventionellen Datenbankansatz bleiben Die ein fachste Methode dies herauszufinden ist gleichzeitig die logischste W gen Sie die Pro und Contra Argumente gegeneinander ab und w hlen Sie die Option mit den besten Ergebnissen Wenn
125. nnen kein eigenes Tag f r einen Eintrag in ein Inhaltsverzeichnis definieren Au erdem eignet es sich nicht f r andere Medien als Computerschnittstellen Wenn Sie jemals versucht haben Artikel auszudrucken die an mehrere Dateien verteilt wurden wissen Sie was dies hei t Die sehr offene Spezifikation von HTML f hrte dazu dass sich viele verschiedene HTML Dialekte entwickelt haben Wie Sie wissen ist es eine Kunst f r sich browserneutrales HTML zu schreiben So entstand die Notwendigkeit ein neues Format zu generieren mit dem strukturierte Dokumente im gesamten Web verwendet werden k nnen Um die Beschr nkungen der einzigen beiden ernsthaften Alternativen HTML und SGML zu berwinden wurde XML entwickelt 303 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Der Entwurf von XML sah einige klar definierte Ziele vor Es sollte einfach zu verwenden sein sowohl f r Benutzer als auch f r Entwickler welche die XML Parser erstellten Die Komplexitat von SGML bedeutete eine Beschrankung die beseitigt werden sollte XML sollte offen sein um eine Vielzahl von Anwendungen und Unterpro tokolle unterst tzen zu k nnen Es sollte keine Abh ngigkeit zu einem einzigen unflexiblen Dokumententyp entstehen wie bei HTML XML sollte eine strikte Syntax haben Optionale Funktionen k nnen zu Kompatibilit tsproblemen f hren wenn mehrere Benutzer ein Dokument gemeinsam verwenden Es gab die Bef r
126. objektiv gesehen eine sehr kurze Wartezeit sein f r den Benutzer erscheint sie jedoch extrem lang und rgerlich Ankommende Nachrichten sollten daher sofort angezeigt wer den oder zumindest so bald wie m glich HTTP ist jedoch ein zustandsloses Protokoll das sofortige Aktualisierung von Seiten nur erm glicht wenn ein vollst ndiges Dokument neu geladen wird Nat rlich gibt es mehrteilige Dokumente und eine automatische Auffrischung aber bei jeder dieser Aktio nen entsteht ein l stiges Flimmern wenn eine Seite neu geladen wird die 143 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel Datenbank muss f r die Ausgabe zwischengespeichert werden und durch die st ndigen Neuverbindungen und Daten bertragungen vom Webserver entstehen Verz gerungen Eine L sung hierf r ist Streaming HTML Diese Option wird zwar nir gendwo offiziell unterst tzt funktioniert aber trotzdem Das Skript das f r die Schnittstellenausgabe verantwortlich ist l uft einfach in einer Endlos schleife leer und beendet die HTML Seite die der Browser erh lt nicht Wenn etwas an den Benutzer geschickt werden muss wird es ausgegeben und sofort aus dem Zwischenspeicher des Servers gel scht Auf diese Weise gibt der Browser st ndig Informationen aus und zeigt stets die aktuellsten Daten Ein Problem birgt dieser Ansatz jedoch HTML Entit ten lassen sich nicht ein fach so darstellen Sie k nnen beispielsweise die Z
127. of one and data element count 1 value data_element else this has been a count assign it count ord data_element try to retrieve the data element itself if read_from_input value input data is corrupted return zero count count 0 indicate failure return 0 return success return 1 function decode_data initialize output array output array decompress all data into the array whi le get_encoded_pair amp count amp value for i 0 i lt count i 109 Pearson Education output value eturn output Listing 2 4 Der RLE Expandierungsalgorithmus is declaration must exist and be eq A ADDISON WESLEY 2 Erweiterte Syntax ual both for the compressor and decompressor compressor and decompressor to read d function read_from_input amp data_element e COUNTER_THRESHOLD 32 is tool function is needed for both This is a dummy function to retri the ata eve a data element from the input data It could con from an array from the standard completely different As an example this function read file Not a good idea to have gl just for the example s sake lobal file_handle tain code to read input or something s from a global obal files but check if we have reached the end of the file f feof file_handle we did return error return 0
128. old time max_lifetime Delete old values from the MySQL session table result mysql_db_query sess_mysqI db DELETE FROM sess mysqI table WHERE UNIX TIMESTAMP t_stamp lt old or wdie mysql_error return true Basic Example Registering above functions with session _set_save_ whandler foo 10 session set_save_handler sess_mysql_open sess mysql_read sess mysql write sess mysql destroy sess mysql_gc session start session_register foo echo foo foo foot Listing 4 2 Ein MySQL Speichermodul fiir die PHP 4 0 Sitzungsbibliothek Seiten Caching Mit der Sitzungsbibliothek k nnen Sie auch kontrollieren wie Seiten gecacht werden Hierzu steht Ihnen die HTTP Anweisung HTTP Cache Control zur Verf gung In der PHP Konfiguration kann die Anweisung cache_limiter auf nocache private oder public gesetzt werden Wie wir in Kapitel 6 zeigen wer den hnelt dies dem Verhalten von PHPLib beachten Sie jedoch dass PHPLib no anstelle von nocache verwendet Das Seiten Caching ist standardm ig auf nocache gesetzt Damit wir Caching vollst ndig verhindert was wie Sie vielleicht wissen dem Standardverhal ten aller PHP Seiten entspricht Bei dynamisch erstellten Seiten sollten Sie diese Einstellung bevorzugt verwenden da diese Seiten h ufig von Anfrage zu Anfrage differieren Bei einigen Teilen Ihres Programms die sich nicht h ufig n
129. r die Darstellung der Daten f r den Benutzer Benutzerschnittstelle verantwortlich w hrend der Server bzw die zweite Stufe f r die Bereitstellung von Datendiensten f r den Client und die Verwaltung der Programmlogik zust ndig ist So weit so gut Aber wie Sie sehen kombiniert das zweistufige Modell immer noch zwei verschiedene Konzepte in der zweiten Stufe dem Server Datendienste und Programmlogik Die Programmlogik bildet das Herz des Programms das f r die Daten ber pr fung Verarbeitungsregeln usw verantwortlich ist Die Datendienste verwalten die Rohdaten der Anwendung H ufig bestehen sie aus einem relationalen Datenbankverwaltungssystem RDBMS oder einem schon vorhandenen Mainframesystem in das die Firma bereits viel Zeit und Geld investiert hat Die Vermischung beider Konzepte in einer zwei stufigen Anwendung f hrt zu Problemen der Skalierbarkeit Wiederverwen dung und Datenpflege Nehmen wir als Beispiel den k rzlich eingef hrten 249 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien Euro als offizielle W hrung der Europ ischen Gemeinschaft Wenn hier die Programmlogik nicht klar von den Daten getrennt worden w re m ssten beide Stufen ge ndert werden Fest in der Daten berpr fung einprogram mierte Kurswerte m ssten genauso ge ndert werden wie das Datenspeicher format der W hrungsbetr ge Mithilfe eines mehrstufigen Ansatzes k nnen Sie alle drei Konzepte klar von
130. satz zu referenzieren den die Funktionen verarbeiten sollen F r die Funktio nen ist es unerheblich wie der Handle erzeugt wurde Sie arbeiten sowohl mit ganzen Schablonendateien als auch mit Platzhaltern oder dynamischen Bl cken Sehen wir uns ein weiteres einfaches Beispiel an Angenommen Sie haben eine Schablonendatei mit einem Platzhalter und einem dynamischen Block lt b gt PLACEHOLDER lt b gt lt ul gt lt BEGIN block gt lt li gt BLOCK_PLACEHOLDER lt END block gt lt ul gt Um die Datei zu analysieren m ssen Sie zun chst mit set_file einen Handle f r die gesamte Datei definieren Der normale Platzhalter l sst sich ganz normal verarbeiten wie wir fr her schon gezeigt haben Anschlie end definieren wir einen Block Handle Diesen Block k nnen Sie nun genauso behandeln wie den Datei Handle selbst Er ist ein genauso wichtiger unab 297 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie h ngiger Teil innerhalb der Datei Dadurch k nnen Sie auch zwei Handles kombinieren wie wir es bereits mit zwei separaten Dateien getan haben Im Programmcode sieht dies folgendermafsen aus tpl gt set_file page page inc html Assign value to scalar placeholder tpl gt set_var PLACEHOLDER This is just a test Create block handle named block tpl gt set_block page block Create three block instances for i 0 i lt 3
131. schnell vonstatten und ist trotzdem effizient Die gesparte Zeit l sst sich besser zum Durchf hren weiterer Tests und zum Testen verschiedener Iterationen einer Schnittstelle verwenden Heuristische Auswertung Die heuristische Auswertung ist ein Verfahren um Eignungsprobleme in einer Schnittstelle zu finden Eine kleine Anzahl von Bewertern testet die Schnittstelle und bewertet ihre bereinstimmung mit den Designprinzipien etablierter Benutzerschnittstellen der Heuristik Diese Prinzipien k nnen die hier beschriebenen zehn empfohlenen heuristischen Methoden von Niel sen sein die sich auf den Entwurf einer Benutzerschnittstelle beziehen oder eine Reihe von benutzerspezifischen Prinzipien die auf eine bestimmte Umgebung zugeschnitten sind Die Bewerter m ssen keine Tauglichkeitsexperten sein Selbst Laien k nnen viele Tauglichkeitsm ngel durch heuristische Auswertung aufdecken und viele der verbleibenden Probleme lassen sich mit der vereinfachten Version des lauten Denkens entdecken Da verschiedene Leute unterschiedliche Taug lichkeitsprobleme finden werden kann es au erdem hilfreich sein drei bis f nf Leute eine heuristische Auswertung vornehmen zu lassen Ein Projektlei ter sollte die Ergebnisse von den einzelnen Bewertern sammeln und einen ausf hrlichen Testbericht erstellen der dann auf einem fach bergreifenden Treffen vorgestellt werden sollte Bei der heuristischen Methode wird nur die Schnittstelle auf Probleme ber
132. server making all IRC commands easily available by a predefined API a See phpIRC inc php3 for configuration options Author Till Gerken Last modified 09 17 99 Copyright c 1999 by Till Gerken kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk Listing 1 4 Datei Header Kommentar mit mehrzeiligen Kommentaren Extraktion von Blockkommentaren in UNIX Auf UNIX Systemen werden Blockkommentare mit dem Befehl grep aus der Quelle gelesen grep source php3 Welchen Stil Sie zur Formatierung Ihres Kopfes w hlen ist unwesentlich vielmehr z hlt welche Informationen Sie in den Datei Header einf gen Wie in diesem Beispiel gezeigt sollten im Kopf allgemeine Informationen ber das Modul den Autor usw enthalten sein Die Punkte sollten in sinnvoller Reihenfolge aufgef hrt werden z B macht es keinen Sinn erst eine lange Beschreibung und dann eine Kurzbeschreibung zu geben nachdem Sie die lange gelesen haben brauchen Sie die kurze nicht mehr Die folgende Liste zeigt Empfehlungen nach Wichtigkeit geordnet 1 Dateiname des Moduls 2 Kurzbeschreibung des Moduls eine Zeile 3 Ausf hrliche Beschreibung des Moduls 42 Pearson A ADDISON WESLEY Education Kodierungskonventionen Angaben ber Verwendung Anforderungen Warnungen usw Name des Autors und Kontaktadresse Erstellungsdatum des Moduls und Datum der letzten nderung Urheberrechtsvermerk Lize
133. sich als unersch pfliche Quelle f r Ideen und Unterst tzung erwies Ich bin sicher dass Ihnen dieses Buch hilft etwas ber das erweiterte PHP und die Entwicklung von Webanwendungen zu erfahren Es ist eins der weni gen B cher die ber die reine Beschreibung der Syntax hinausgeht Es bringt Ihnen die Konzepte hinter der Programmiersprache nahe und kann Ihnen helfen Ihre Probleml sungsstrategien f r die Web Programmierung zu ver bessern Viel Gl ck Zeev Suraski Pearson A ADDISON WESLEY Education Pearson A ADDISON WESLEY Education Einf hrung In der Antike versuchten die alten Meister nicht die Menschen zu erziehen son dern brachten ihnen bei nicht zu wissen Der Erfolg der Open Source Software wie Linux oder Apache wurde in allen gro en Medien ausf hrlich dokumentiert Trotzdem blieb der Aufstieg von PHP gr tenteils unbemerkt Gem einer E Soft Umfrage www e softinc com survey ist die Web Skriptsprache PHP immer noch das verbrei tetste Modul f r den Apache Webserver Netcraft Studien haben ergeben dass PHP auf ber 6 aller Web Dom nen in der Welt siehe www netcraft com sur vey verwendet wird Dies ist eine unglaubliche Marktdurchdringung f r ein so spezialisiertes Produkt Und die Beliebtheit steigt weiter an Dies zeigt sich verst rkt in den traditionellen Medien Bis zum Mai 2000 wurden ber 20 B cher ber PHP in verschiedenen Sprachen ver ffentlicht und weitere sind in Vor
134. sierung umgehen k nnen PHPLib hat Klassen zur besseren Handhabung der Benutzer Authentisierung und Verwaltung von Zugriffsrechten PHPLib erteilt Authentisierungen f r Sessions dementsprechend h ngt es von der Klasse Session ab Auf denjenigen Seiten auf denen Sie eine Authenti sierung ben tigen sollte die folgende Anweisung page_open aufgerufen werden um eine Instanz einer Session und einer Authentisierung zu erzeugen page_open array sess gt Session Example auth gt Auth_Example Sessions als Basis fiir die Authentisierung heranzuziehen bringt eine Reihe von Vorteilen Der Benutzername und das Authentisierungselement werden nur einmal und zwar bei der Anmeldung verschickt Sobald er authentisiert ist spei chert der Server die Authentisierungsdaten in der Session und bertr gt den Benutzernamen oder das Authentisierungselement kein weiteres mal Hier unterscheidet sich PHP von HTTP bei der der Benutzername und das Passwort in den HTTP Headern bei allen Abfragen bertragen werden 273 Pearson A ADDISON WESLEY 6 Datenbankzugriff mit PHP Education Dies bedeutet jedoch auch dass Sie die Authentisierung verlieren sobald die Session verloren geht Der Authentisierungsprozess auf dem Server kann kompliziert sein Er kann ber eine Datenbank oder einen beliebigen anderen Mechanismus ausgef hrt werden Die Authentisierung wird ber eine nicht definierte Funktion der Klasse Auth durchgef hrt a
135. speziellen Verarbeitungsroutine Er setzt sich zusammen aus lt und einem Zielnamen der die Anwendung angibt auf welche sich der Befehl richtet Das lange PHP Tag lt php ist ein Beispiel hierf r es wird in XML Dokumenten verwendet um PHP Code zu markieren Hinweis Um XML kompatibel zu sein m ssen Sie den Befehl short_tags in Ihrer PHP Konfiguration auf Off setzen und konsequent das lange ff nende Tag lt php verwenden Das kurze ffnende Tag w rde XML verwir ren da es kein g ltiger Verarbeitungsbefehl w re Auf der anderen Seite w rden sich Tags wie lt xml nicht mit PHP vertragen da XML von PHP f r Programmcode gehalten und dementsprechend ein Analysefehler angezeigt w rde Entit ten Der Teil des Textes der keine Auszeichnung darstellt wird als Zeichendaten des Dokuments bezeichnet Innerhalb dieses Textes muss ein Autor Sonderzei chen wie lt oder gt einf gen k nnen die normalerweise den Beginn oder das Ende von Auszeichnungsabschnitten kennzeichnen Genau wie HTML kennt XML die Schreibweise von Entit ren Es gibt f nf vordefinierte Entit ten 310 Pearson vy ADDISON WESLEY Education PHP und XML Entit t Zeichen Symbol alt lt kleiner als amp gt gt gr er als amp amp amp Ampersand amp quot doppelte Anf hrungsstriche amp apos einfache Anf hrungsstriche Apostroph Hinweis Wenn Sie eine Document Type Definition benutzen m ssen diese
136. spezifischen Anforderungen anzupassen sollten Sie sich eine eigene Klasse in local inc definieren Listing 6 6 zeigt ein Beispiel f r die Verwendung von Perm Es enth lt ein paar mehr Funktionen als notwendig da Sie sich in diesem Beispiel abmelden und mit einem anderen Benutzernamen wieder anmelden k nnen Dies erm glich uns leichter festzustellen welche Berechtigungsebenen in Gebrauch sind Der von PHPLib zur Verf gung gestellte Beispielbenutzer Benutzername kris Passwort test hat admin Privilegien Wenn Sie sich mit diesem Benutzer namen anmelden werden Sie mit der Nachricht Welcome Admin begr t Da die PHPLib Distribution nur diesen einen Benutzer hat m ssen Sie einen neuen Benutzer generieren wenn Sie wissen m chten wie die Seite f r Benutzer mit Privilegien unterhalb von admin aussieht 279 Pearson A ADDISON WESLEY Education 6 Datenbankzugriff mit PHP page_open array sess gt Example Session auth gt Example Auth perm gt Example_Perm if isset mode amp amp mode reload auth gt unauth print You have been logged out lt br gt printf If you want you can lt a href s gt login again w sess gt url basename PHP SELF else if perm gt have_perm admin print lt b gt Welcome Admin lt b gt lt br gt print You are logged in with admin permissions lt br gt else printf You are logged in with s permissions lt
137. symbol_ table global_variable new_var2 RETURN _NULL Listing 9 10 Erzeugung von Variablen mit verschiedenen Giiltigkeitsbereichen 9 12 2 Longs Integer Befassen wir uns nun mit der Zuordnung von Daten zu Variablen Wir begin nen mit Longs Longs sind die Integer von PHP und sehr einfach zu spei chern Wenn Sie sich noch einmal die besprochene Containerstruktur zval value ansehen k nnen Sie feststellen dass der Datentyp Long direkt im Verbund enthalten ist und zwar im Feld lval Der entsprechende type Wert f r Longs ist IS_LONG siehe Listing 9 11 zval new_long MAKE_STD_ZVAL new _long new _long gt type IS_LONG new_long gt value Ival 10 Alternativ k nnen Sie das Makro ZVAL_LONG verwenden zval new_long MAKE_STD_ZVAL new_long ZVAL_LONG new_long 10 Listing 9 11 Generierung eines Longs 411 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern 9 12 3 Doubles Flie kommazahlen Doubles sind die Flie kommazahlen von PHP und genauso einfach zuzuwei sen wie Longs Auch ihr Wert ist direkt im Verbund enthalten Das entspre chende Mitglied im zval value Container hei t dval der zugeh rige Typ ist IS DOUBLE zval new double MAKE_STD_ZVAL new_double new _double gt type IS DOUBLE new_double gt value dval 3 45 Alternativ k nnen Sie das Makro ZVAL_DOUBLE verwenden zval new_double MAKE_STD_ZVAL new_double
138. und damit bis auf das Wurzelverzeich nis des Servers zugreifen von dem es stammt Der wichtigste Abschnitt ist folgende Zeile exec Is la dir lines rc Die Variable dir wird sofern sie dem Benutzer zur Verfiigung steht direkt an exec weitergeleitet Wie Sie vielleicht wissen k nnen Sie Shell Befehle durch Semikolon miteinander verkniipfen Was glauben Sie also wird passie ren wenn dir gleichzusetzen ist mit etc cat etc passwd Wenn Sie diese Zeichenfolge als Argument bergeben wollten m ssten Sie sie mit URL kodieren so dass der Skript folgenderma en aufgerufen w rde Directory_Viewer php3 dir etc 3B cat 2Fetc 2Fpasswd Und damit w rde tats chlich der Inhalt von etc passwd angezeigt Anstelle des Befehls cat k nnten Sie auch jeden anderen Befehl ausf hren z B fetch und damit ein trojanisches Pferd von Ihrem eigenen Server holen und instal lieren Abhilfe f r dieses spezielle Problem schaffen Sie wenn Sie die Variable dir mit EscapeShelICmd bergeben Damit werden alle kritischen Zeichen 188 Pearson A ADDISON WESLEY Education Sicherheitsaspekte maskiert die man verwenden k nnte um die Shell auszutricksen und ver kn pfte Befehle auszuf hren Au erdem k nnten Sie den Befehl soweit ein schr nken dass er nur Unterverzeichnisse auflistet secure_dir str_replace dir secure_dir DOCUMENT ROOT dirname PHP_SELF secure_dir secure_dir EscapeShel1Cmd
139. 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 117 Pearson vy ADDISON WESLEY Education 2 Erweiterte Syntax ruffunktionen in einem internen Array Sobald Daten ankommen durchsucht es sein R ckruf Array nach Funktionen die auf diesen entdeckten Datentyp passen und ruft alle passenden Funktionen 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 deklariert
140. verwendet wer den kann der sich hnlich 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 Programmierungsaufwand f hrt aber zu einem stabileren Programmcode Programmcode wie der oben gezeigte sollte nur f r Optimierungszwecke implementiert werden Die SOL Abfrage w hlt die Werte car_type c
141. weiterzuleiten berpr fen Sie alle Daten aus dem Benutzerraum inklusive Kodierung bzw Ersetzen des kleiner als lt und gr er als Zeichens gt sowie des Ampersands amp Achten Sie auch auf doppelte Anf hrungsstriche einfache Anf hrungsstriche l und Leerr ume zumindest in Tag Attribu ten und Attributwerten Stellen Sie sicher dass Ihr Programm in einer zuverl ssigen Umgebung arbeitet Achten Sie besonders auf die Reihenfolge der PHP Variablen siehe n chs ter Abschnitt Reihenfolge der PHP Variablen Wie Sie wissen stellt PHP alle GET und POST Variablen automatisch im globa len Namensraum zur Verf gung Wussten Sie dass Sie diese Funktion in PHP 4 0 abschalten k nnen Die automatische Einf hrung einer Variablen ist zwar eine Funktion welche die Verwendung von PHP f r unerfahrene Benutzer vereinfacht sie kann 191 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte jedoch in gr eren und komplexeren Programmen problematisch werden Wenn Sie auf Variablen aus dem globalen Namensraum zugreifen die vom Benutzer bergeben wurden k nnen Sie nicht sicher sein woher sie wirklich kommen GET POST oder Cookies Wenn ihnen die Reihenfolge der Variablen nicht wichtig ist akzeptieren Sie dass jeder Benutzer Ihr Skript sowohl mit GET als auch mit POST aufrufen kann Auch wenn es kein Sicherheitsproblem darstellt ist es schlechter Stil Sie soll ten w hlen k nnen wie die Dat
142. wir berzeugt dass dies nur noch eine Frage der Zeit ist Zwischenzeitlich haben wir die in Listing 4 4 aufgef hrte Basisklasse entwickelt um eine Befehlszeilenversion von PGP nutzen zu k nnen Diese Klasse erm glicht Ihnen Dateien oder Zeichenketten mit PGP 6 5 1 zu ver schl sseln zu entschl sseln und zu signieren class pgp var pgp_bin usr bin pgp Path to PGP binary var tmp_path tmp Path where temporary files are stored var error Used to store the last error message function pgp Check if the PGP binary exists if file_exists this gt pgp_bin 195 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte this gt error PGP binary file this gt pgp_bin does not wexist n return false Check if the PGP binary is actually executable ift is_executable this gt pgp_bin this gt error PGP binary file this gt pgp_bin is not wexecutable n return false return true function _check_file file ift file_exists file Create a temporary filename in the path specified as class variable temp_file tempnam this gt tmp_path PGP asc Gently touch the file touch temp_file Open the newly created file write the string passed as wargument file to it fp fopen temp file w if fp this gt error Could not open temporary file temp file for writing in check_file n retu
143. wird mehr zur Versi onsverwaltung weiter unten 2 Entwickler testen eine Kopie des Programmzweigs Entwicklung 3 Die Entwickler leiten ihre nderungen an den Programmzweig Entwick lung weiter 4 Sobald ein wichtiger Meilenstein erreicht wurde und das System zum Tes ten bereit steht transferiert der Projektleiter den Entwicklungscode zum bergangsserver 5 Das Qualit tssicherungs und Sicherheitspersonal f hren auf dem ber gangsserver Tests durch Fehler und Probleme werden an die Entwickler weitergeleitet 6 Die Entwickler beheben die Fehler und leiten das Projekt solange an die Qualit tssicherung zur ck bis keine Fehler mehr gefunden werden 7 F r die Freigabe wird der bergangsserver auf den Produktionsserver kopiert Vergessen Sie nicht die Freigabe geb hrend zu feiern Bedenken Sie dass wir hier nur ber den Teil des Projektes reden der sich mit der Entwicklung des Programmcodes befasst Das gesamte Projekt durchl uft nat rlich alle Zyklen der Softwareentwicklung 1 Projektstart 2 Analyse 3 Entwurf 232 Pearson A ADDISON WESLEY Education 4 5 6 7 Versionsverwaltung mit CVS Technische Spezifikation und Entwurf der Datenbankstruktur Implementierung dies ist unser Thema Qualit tssicherung Freigabe 5 3 Versionsverwaltung mit CVS Wenn mehrere Entwickler am selben Projekt arbeiten entstehen m glicher weise Versionskonflikte Dies ist umso wahrscheinlicher wenn die
144. wis sen wie Unterfunktionen definiert werden Funktionale Zerlegung h rt sich gro artig an bis Sie es ausprobiert haben Sie kann Sie in eine vollkommen falsche Richtung f hren und sobald Sie einmal angefangen haben ist es nahezu unm glich Entscheidungen zu korrigieren da Sie die Funktionen nur immer wieder teilen k nnen Sie m ssen also komplett von vorn beginnen Statt dessen versuchen wir das gesamte Problem in Entwurfsmuster zu unterteilen Wir versuchen Probleme zu erkennen f r die wir bereits eine L sung entwickelt haben Die L sung f r ein hnliches Problem zu kennen ist die beste Ausgangssituation um ein neues Problem zu l sen F r das Pro blem der Authentisierung brauchen wir beispielsweise keine Art von funktio naler Zerlegung vornehmen da wir wissen dass wir einfach Teile von PHPLib daf r verwenden k nnen Die Struktur f r die Eintr ge und Kategorien k nnen bereits auf den Pro grammcode abgebildet werden Unsere Anwendung h lt die Eintrags und Kategoriestrukturen in Klassen fest class category class entry extends category var cat_id cat_name parent_id var entry_ id title body t_stamp author views votes rating 291 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Klassen zu verwenden war eine Entscheidung die durch den Entwurf ent stand Sie war nicht durch den Anforderungskatalog bestimmt Unsere bishe rige Erfa
145. 259 259 260 260 262 262 263 266 266 267 267 267 271 272 273 273 274 275 279 280 286 Pearson Education Inhaltsverzeichnis 7 Anwendungen der Spitzentechnologie 7 1 Wissensrepr sentation 71 1 Anforderungskatalog 712 Spezifikation 71 3 Die Klasse Template 7 1 4 Rekursion mit SQL 71 5 Authentisierung 71 6 Das fertige Produkt 72 PHP und XML 7 2 1 Was ist XML 72 2 DocBook 72 3 WML Wireless Markup Language 72 4 RDF Resource Description Framework 72 5 XML Dokumente 72 6 PHP und Expat 72 7 DOM das Dokumentenobjektmodell 72 8 LibXML ein DOM basierter XML Parser 73 Datenaustausch mit WDDX 7 3 1 Datenaustausch ber das Web WDDX 7 3 2 Die Herausforderung 73 3 M gliche Szenarien 7 3 4 Abstrahierung von Daten mit WDDX 7 3 5 WDDX Datentypen 736 PHP und WDDX 7 3 7 Die WDDX Funktionen 74 Zusammenfassung 8 Fallstudien 8 1 BizChek com 8 1 1 Web Mail 8 1 2 Entscheidung f r PHP 8 1 3 Begierig auf Updates 8 1 4 Schluf folgerung 82 SixCMS 8 2 1 Firmenhintergrund 82 2 Open Source Geschaft A ADDISON WESLEY 287 287 289 290 293 300 301 301 302 302 306 307 308 308 317 327 332 340 341 341 342 342 343 345 345 347 349 349 349 350 352 353 353 353 354 Pearson Education 8 3 8 4 8 5 Inhaltsverzeichnis 82 3 Warum PHP 8 2 4 Technologietiberlegungen 825 PHP im Einsatz 8 2 6 PHP Ein Gesch ftsvorteil MarketPlayer com 8 3 1 Firmenhintergrund 8 3 2 Die PHP Pr
146. 3 phplRC php3 if cselect and category and qsearch and country echo lt p gt nbsp lt ul gt lt ul gt lt ul gt lt ul gt lt hl gt Insufficient Input Datal lt hi provide more Information ezit if enpty cselect amp amp category select and category JOBS if category select and category category elseif cselect select and cselect OBS WANTED Sfilter where recruiters active yes and jobs expiry and description select else filter stripslashes filter query select unlix_timestamp expiry as nx_inserted from jobs left join recruiters on jobs recruiterlD recruiters recruiterlID filter order by inserted desc For Help pre Ln 29 Col 1 Mod 04 10 99 15 28 14 File Size 779 Abbildung 1 1 Schlechter Code 39 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte UltraEdit 32 C phpIRC phpIRC_0 9b phpIRC php3 OF x J Ele Edit Search Project View Format Column Macro Advanced Window Help lal x Deee GQ8 W HER AAAA DBS5EHTE 4 ek heawy php3 PhpIRC php3 open a socket irc_connection_handle fsockopen server_name port_nr return error if connection failed if irc_connection_handle return l ok we have a connection now set up send USER command we don t e t on that one fputs irc_connection_handle USER irc_identd irc_host server now send N
147. 3 7 3 8 Projekt berblick Vergleich von Technologien Grundlagen des IRC Netzwerks Einpassen der Anwendung in das Netzwerk Schnittstelle zum Netzwerk 3 5 1 Struktur der Schnittstelle 3 5 2 Downstream Kommunikation 3 5 3 Upstream Kommunikation 3 5 4 Schnittstelle zum Benutzer 3 5 5 Schnittstelle zum Entwickler 3 5 6 Schnittstelle zum HTML Entwickler 3 5 7 Schnittstelle zum Programmcodeentwickler Verwaltung und Sicherheit 3 6 1 Auf der Netzwerkebene 3 6 2 Auf der PHP Webserver Ebene 3 6 3 Auf der Datenbankebene 3 64 Auf der IRC Ebene Implementierung Zusammenfassung A ADDISON WESLEY 83 85 85 88 88 99 102 103 118 120 126 128 129 129 131 134 137 139 142 143 145 150 151 152 152 158 159 159 160 160 161 161 Pearson A ADDISON WESLEY Education Inhaltsverzeichnis Teil 2 Webanwendungen 4 Webanwendungskonzepte 165 4 1 HTTP und Sitzungen 165 4 1 1 Statuskontrolle 165 4 1 2 Sitzungskennnummer Verteilung mit Cookies 168 4 1 3 Manuelle nderung der URL 169 4 1 4 Dynamische Pfade 169 4 1 5 DNS Tricks 173 4 1 6 Ein Kompromiss f r die Praxis 174 4 1 7 PHPs eigene Sitzungsbibliothek 175 4 2 Sicherheitsaspekte 185 42 1 Vertrauen Sie dem Web nicht 186 4 2 2 Erfinden Sie die Kryptografie nicht neu 193 4 2 3 Integrieren Sie Fachleute in Ihr Team 202 42 4 Authentisierung 204 4 3 Die Bedeutung der Tauglichkeit 207 4 3 1 Tauglichkeit in Webanwendungen 208 4 3 2 Einfache Tauglichkeitspr fu
148. 432 Pearson A ADDISON WESLEY Education Aufruf von Benutzerfunktionen 9 20 1 Unterst tzung f r Initialisierungsdateien PHP 4 0 bietet eine neu konzipierte Unterst tzung f r Initialisierungsdateien Damit k nnen Sie Standardinitialisierungseintr ge direkt in Ihrem Code angeben diese Werte zur Laufzeit lesen und ndern und Nachrichtenroutinen f r nderungsbenachrichtigungen schreiben Um einen ini Abschnitt in Ihrem eigenen Modul zu erstellen verwenden Sie die Makros PHP_INI_BEGIN um den Beginn eines solchen Abschnitts zu mar kieren und PHP_INI_END um das Ende zu markieren Dazwischen k nnen Sie PHP_INI_ENTRY verwenden um Eintr ge zu erzeugen PHP_INI_BEGINC PHP_INI_ENTRYC first_ini_entry has_string_value PHP_INI ALL gt NULL PHP_INI_ENTRY second_ini_entry 2 PHP_INI_ SYSTEM wOnChangeSecond PHP_INI_ENTRYC third_ini_entry xyz PHP_INI_USER gt NULL PHP _END Das Makro PHP_INI_ENTRY hat vier Parameter den Namen des Eintrags den Wert des Eintrags die Anderungsberechtigungen und einen Zeiger auf eine Anderungsbenachrichtigungsroutine Sowohl der Name als auch der Wert des Eintrags m ssen als String angegeben werden ungeachtet dessen ob sie tats chlich Strings oder Interger sind Die Berechtigungen sind in drei Gruppen unterteilt PHP_INI_SYSTEM erm g licht eine nderung nur direkt in der Datei php3 ini PHP_INI_USER l sst w h re
149. 7 Einbindung aller exportierten Funktionen 393 9 10 8 Zusammenfassung 393 9 11 Annahme von Argumenten 393 9 11 1 Anzahl der Argumente feststellen 394 9 11 2 Auslesen von Argumenten 395 9 11 3 Verarbeitung mit einer variablen Anzahl von Argumenten optionalen Parametern 396 9 11 4 Zugriff auf Argumente 398 9 11 5 Verarbeitung von Argumenten die durch Referenz bergeben wurden 404 9 11 6 Gew hrleistung der Schreibsicherheit f r andere Parameter 406 9 12 Erzeugen von Variablen 407 9 12 1 berblick 407 9 12 2 Longs Integer 411 9 12 3 Doubles Flie kommazahlen 412 9 12 4 Strings 412 9 12 5 Boolesche Werte 413 9 12 6 Arrays 413 9 13 Objekte 417 9 14 Ressourcen 418 9 15 Makros zur automatischen Erstellung von globalen Variablen 420 9 15 1 Erstellen von Konstanten 421 Pearson Education 12 9 16 9 17 9 18 9 19 9 20 9 21 9 22 Inhaltsverzeichnis Duplizierung variabler Inhalte Der Copy Konstruktor R ckgabe von Werten Ausdrucken von Informationen 9 18 1 zend_printf 9 18 2 zend_error 9 18 3 Ausgabe einbinden in phpinfo 9 18 4 Informationen ber die Ausf hrung Initialisierungs und Deinitialisierungsfunktionen Aufruf von Benutzerfunktionen 9 20 1 Unterst tzung f r Initialisierungsdateien Wie geht es weiter Referenz Einige Konfigurationsmakros 9 22 1 config m4 9 22 2 Zus tzliche API Makros Stichwortverzeichnis A ADDISON WESLEY 422 424 426 426 426 427 428 429 430 433 435 436 436
150. ARNING This function has been called with empty arguments Tabelle 9 16 zeigt eine Liste der m glichen Werte siehe Abbildung 9 8 Auf diese Werte wird auch in php ini Bezug genommen Je nachdem welchen Feh lertyp Sie w hlen werden Ihre Meldungen protokolliert XY Netscape olx File Edit View Go Communicator Help Warning This is an E WARNING in home wwwrhtdocs infoprint php on line 5 Parse error This is an E PARSE in home wwwrhtdocs infoprint php on line 5 Abbildung 9 8 Anzeige von Warnungen im Browser 426 Pearson vy ADDISON WESLEY Education Ausdrucken von Informationen Fehler Beschreibung E_ERROR Signalisiert einen Fehler und beendet sofort die Ausf h rung des Skripts E_WARNING Signalisiert eine allgemeine Warnung die Ausf hrung wird fortgesetzt E_PARSE Signalisiert einer Parser Fehler die Ausf hrung wird fort gesetzt E NOTICE Signalisiert einen Hinweis die Ausf hrung wird fortge setzt Beachten Sie dass die Anzeige dieses Typs von Feh lermeldung in php ini standardmaBig ausgeschaltet ist E_CORE_ERROR Interner Fehler des Kerns sollte nicht in vom Benutzer ge schriebenen Modulen verwendet werden E_COMPILE_ERROR Interner Fehler des Compilers sollte nicht in vom Benut zer geschriebenen Modulen verwendet werden E_COMPILE_WARNING Interne Warnung des Compilers sollte nicht in vom Be nutzer geschriebenen Modulen verwendet werden Tab 9 16 vordefinierte
151. Art von Problem stellt sich auch beim zweiten Kommentar aller dings aus einem anderen Grund Der Programmierer hat die vollst ndige Referenz f r den Algorithmus eingef gt darunter leider auch M ll Nat rlich ist es gut ausf hrlich zu beschreiben was man tut aber Sie m ssen unter scheiden was wichtig ist und was nicht Wenn Sie Programme kommentieren stellen Sie sich selbst folgende Fragen Was tun Sie gerade Warum tun Sie es Warum tun Sie es auf diese Weise Warum tun Sie es an dieser Stelle Wie wirkt sich dieser Programmteil auf das brige Programm aus Was ben tigt dieser Programmteil Hat dieses Verfahren Nachteile Wenn Sie beispielsweise Zeichenketten analysieren dokumentieren Sie das Format der eingegebenen Zeichenketten die Toleranzen Ihres Parsers seine Reaktion auf Fehler und falsche Eingaben und die Ausgabe Wenn dies alles zu viele Informationen sind um sie direkt im Programm einzuf gen hinter lassen Sie zumindest einen Verweis auf die externe Dokumentation in wel 46 Pearson A ADDISON WESLEY Education Kodierungskonventionen cher sich der Leser ber alle Aspekte des Parsers informieren kann Denken Sie auch daran Ihren Funktions Header zu aktualisieren indem Sie dort einen Verweis auf die Dokumentation platzieren 1 3 4 Ausw hlen von sprechenden Namen Wie bereits erw hnt ist die Auswahl eines geeigneten Namen f r eine Variable oder eine Funktion ein wichtiger Punktin der Pro
152. CDATA_SECTION_ NODE XML_NOTATION_NODE XML_GLOBAL_NAMESPACE XML_LOCAL_NAMESPACE ult for i 0 i lt depth i print amp nbsp printf s lt br gt isset node gt content node gt content Pearson A ADDISON WESLEY Education PHP und XML Output stylesheet gt lt style type text css gt lt l xml font family Courier New Courier mono font size 10pt color 000000 element color 0033CC attribute color 000099 pi color 990066 gt lt style gt lt span class xml gt lt Process the file passed as first argument to the script file test xml Initial indenting depth 0 Check if file exists if file_exists file Create xmldoc object from file doc xmldocfile file or die XML error while parsing file file die Can t find file file Access root node root doc gt root Start traversal output_node root depth End stylesheet span print lt span gt Listing 7 4 XML Pretty Printer Beispiel f r die Verwendung der LibXML Funktionen Einer der gro en Vorteile die LibXML im Vergleich zu Expat hat besteht darin dass Sie diesen Parser auch zum Konstruieren von XML Dokumenten verwenden k nnen Damit ersparen Sie sich eigene Routinen zur XML Erzeugung schreiben zu m ssen Au erdem m ssen Sie beispielsweise keine Verschachtelungsebenen mehr erfassen um Tags
153. Code direkt in HTML einzubetten Wenn Sie Ihr Programm umgestalten m ssten h tten Sie dann aber schwer zu k mp fen um den HTML Code manuell zu ndern Warum haben wir nicht FastTemplate verwendet Zun chst einmal w re es f r diese Situation leicht bertrieben und wenn eine solche bertreibung einen Leistungsverlust von 120 bedeutet berlegen wir nicht lange ob wir nicht besser doch eine spezifischere L sung finden Die Tatsache dass wir das PHP Standardformular zur berpr fung von For mulardaten verwenden bedeutet nicht dass es die beste oder gar die einzige Methode ist um Ihr spezifisches Problem zu l sen Vielleicht wenden Sie ein dass das PHP Standardformular wie wir es hier vorstellten keine High Level Schnittstelle f r Formulare bietet F r jedes Formular das Sie schreiben m ssen Sie ein Skript erstellen um die Daten zu berpr fen Sie sind ein klu ger Kopf und haben sicherlich recht Andere kamen bereits auf denselben Gedanken Die Standard PHP Bibliothek PHPLib verfolgt einen objektorien tierten Ansatz f r die Handhabung von Formularen 00H Forms und tp1_form Diese Klassen bieten eine objektorientierte Schnittstelle zu HTML Formula ren Sie k nnen Benutzereingaben auf der Clientseite mit JavaScript berpr fen und auf der Serverseite mit regul ren PHP Ausdr cken Mit 00H Forms m ssen Sie nicht direkt in HTML Code schreiben sondern k nnen mithilfe seiner Funktionen Formularelemente erstellen
154. DISON WESLEY Education Kodierungskonventionen st rend und irritierend als hilfreich beim Strukturieren des Textes Zugege ben manchmal stimmt dies tats chlich In den Beispielen dieses Buches wird dieses Formatierungsmittel nicht immer eingesetzt Wir berlassen es Ihnen ob Sie dieses Methode verwenden Am wichtigsten ist dass Sie konsequent sind Wenn Sie sich f r einen bestimmten Stil entschieden haben behalten Sie ihn zumindest f r das aktuelle Projekt bei Wenn Sie nderungen an Quell codes von anderen vornehmen versuchen Sie ebenfalls ihren Stil einzuhal ten Konsistenz ist eine der wichtigsten Aspekte in der Entwicklung Lesen Sie alle Beispiel Codes aufmerksam und versuchen Sie den Stil zu kopieren Passen Sie dabei Ihren Stil soweit an bis Sie dem Original recht nahe gekommen sind Sobald Sie damit zurechtkommen werden Sie merken dass die M he nicht umsonst war Bevor Sie weiterlesen hier zur Motivation zwei Beispiele Der Programmcode in Abbildung 1 1 soll eine SQL Anweisung erzeugen Mit Ausnahme der letzten Zeile in der eine Zeichenkette mit dem Inhalt select einer Variablen namens query zugeordnet wird weist wohl nichts in Abbildung 1 1 auf den Zweck des Codes hin Beim Code aus Abbildung 1 2 sehen Sie leicht was passiert UltraEdit 32 C temp heavy php3 ioj xi Ele Edit Search Project View Format Column Macro Advanced Window Help laj x Dee EREK W H t ne AAAA GSAS 4 ek heavy php
155. Daten die nur vom Client selbst benutzt werden Warum sollte ein Benutzer auch b swilligen Programmcode eingeben den nur der Benutzer sieht Der Punkt ist dass die Infizierung eines Programms mit einem Skript oder einem HTML Code eine ernsthafte Vertrauensverletzung darstellt Der b s willige Code wird mit der Sicherheitsebene des Programms ausgef hrt denn er scheintja vom Programm selbst zu kommen H ufig k nnen Benutzer beim Einsehen von Inhalten die urspr nglich nur f r die Augen eines anderen Benutzers bestimmt waren hereingelegt wer den Ein Beispiel Nehmen wir an Sie haben eine Suchmaschine namens lt script gt alert Hello World lt script gt konstruiert Ein Benutzer gibt einen Schliisselbegriff ein und die Suchmaschine sucht im Web danach Bei der Pla nung gingen Sie davon aus dass nur der Benutzer der die Suche tats chlich gestartet hat die Ergebnisse sehen wird Deshalb k mmerten Sie sich nicht darum in den Schl sselbegriffen bestimmte Zeichen zu kodieren Ein Benut zer k nnte lt script gt alert Hello World lt script gt als Schl sselbegriff einge ben und bek me im Browser eine JavaScript Meldung angezeigt sofern Java Script aktiviert ist Solange die Benutzer die Suchbegriffe selbst eingeben gibt es keine gro en Probleme Das Schlimmste was passieren kann ist dass ihr eigener Browser aufgrund von Fehlern in JavaScript abst rzt Doch warten Sie Warum sollten Benutzer nicht andere auf d
156. Dieses objektorientierte Ver fahren kommt einigen Leuten entgegen und wir m chten Sie ermuntern sich dieses Paket einmal anzusehen Die APl ist zwar recht komplex aber sehr gut 228 Pearson vy ADDISON WESLEY Education Projektstruktur auf der Website dokumentiert und zwar unter http phplib netuse de Wir f rchten dass die Automatisierung der Formular berpr fung im realen Leben nicht funktioniert weil die Situationen h ufig sehr komplex sind Einige Formulareingaben h ngen von zuvor eingetragenen Daten ab ver wenden komplexe Zeichenketten berpr fungsregeln die sich nicht mit regul ren Ausdr cken ausdr cken lassen oder beziehen auch andere externe Quellen wie Datenbanken ein Dies l sst sich nicht hinreichend abstrahieren um vollst ndig generische berpr fungsroutinen zu erstellen Hinweis Zum Zeitpunkt der Erstellung dieses Buches gab es bereits erste Bem hungen eine Schablonen API in PHP 4 0 zu integrieren Dies ist sicherlich zu begr en da es eine standardisierte und offene Handhabung von Schablonen erm glicht 5 2 Projektstruktur Die Zeit kommt da ein Zw lf Stunden Tag Wochenendarbeit sowie Tonnen von Kaffee und ebensoviel Cola nicht ausreichen dass ein einzelner Entwick ler ein Projekt rechtzeitig fertig stellt F r den Durchschnittsprogrammierer ist dies ein bedeutender Einschnitt in seinem Leben kein einsames Einha cken seines eigenen Codes mehr und kein cooler Programmierstil mehr
157. Education 7 Anwendungen der Spitzentechnologie Create the XML parser parser xml_parser_create Set the default handler for all events xml_set_default_handler parser default_handler Parse file and check the return code ret xml_parse_from_file parser file if ret Print error message and die die sprintf XML error s at line d xml_error_string xml_get_error_code parser xml _get_current_line_number parser Free the parser instance xml_parser_free parser Listing 7 2 Entfernen von Kommentaren aus einem XML Dokument Das Beispiel funktioniert auf recht einfache Weise Zun chst wird mit xml_ parser_create eine XML Parserinstanz erzeugt In allen folgenden Funktio nen verwenden Sie den auf diese Weise erzeugten Parserbezeichner hnlich wie wir es bei dem Ergebnisbezeichner in den MySQL Funktionen tun Anschlie end wird die Standardbearbeitungsroutine registriert und die Datei analysiert xml_parse_from_file ist eine anwendungsspezifische Funktion die wir in einer Bibliothek bereitstellen Diese Funktion ffnet die im Argu ment angegebene Datei und analysiert diese in Bl cken von je 4KB Die urspr nglichen XML Funktionen von PHP xml_parse und xml_parse_into_ struct arbeiten nur mit Zeichenketten Wenn Sie dagegen eigene Funktio nen und Routinen zum ffnen Lesen und Schlie en einer Datei verwenden und die Inhalte an die entsprechende Funktion bergeben k nne
158. Entit ten deklariert werden wenn Sie sie verwenden wollen Mithilfe von Zeichenreferenzen k nnen Sie ein beliebiges Unicode Zeichen in Ihr Dokument einf gen Sie werden wie andere Referenzen geschrieben wobei hinter dem Ampersand ein Pfund Zeichen steht Danach wird ent weder ein dezimaler oder hexadezimaler Verweis auf die Unicode Position eingef gt Zum Beispiel referieren sowohl 8 amp 8478 als auch amp x221E auf das Unendlich Zeichen 8 Entit ten sind jedoch nicht auf ein einzelnes Zeichen begrenzt Sie k nnen beliebig lang sein Eine DTD k nnte beispielsweise eine Entit t amp footer definieren die den Inhalt Copyright c 2000 Pearson Educa tion enth lt Kommentare XML verwendet dieselbe Schreibweise f r Kommentare wie HTML lt comment gt Kommentare k nnen beliebige Daten au er der Zeichenfolge enthalten und zwischen den Auszeichnungseintr gen an einer beliebigen Stelle in Ihrem Dokument eingef gt werden In der XML Spezifikation ist ausdr cklich angegeben dass Kommentare nicht Teil des Dokumenteninhalts sind Es wird kein Parser ben tigt um sie an die verarbeitende Anwendung zu bergeben Sie k nnen Kommentare also nicht f r versteckte Anweisun gen o verwenden wie Sie es m glicherweise von HTML gewohnt sind denken Sie an die Verwendung der Kommentar Tags mit denen Sie Java Script vor lteren Browsern verstecken CDATA Abschnitte Ein spezieller Inhaltstyp sind CDATA Abschnitte S
159. Ereignis kann u a eine Benutzereingabe eine Bewegung mit der Maus ein Netzwerkereignis ankommende Pakete usw sein Sobald ein Ereignis angek ndigt wird ver l sst das Programm seine Hauptschleife und sucht nach einer Prozedur die dieses Ereignis bearbeitet Alle Prozeduren die das gerade aufgetretene Ereignis abarbeiten m chten werden mit den angegebenen Parametern des Ereignisses aufgerufen z B Paketdaten des ankommenden Netzwerkver kehrs Bei der konventionellen Programmierung w rde ein ankommendes Ping beispielsweise wie in Listing 3 1 verarbeitet again wait_for_network_data if incoming_data ping send_pong update _traffic_counter goto again Listing 3 1 Pseudocode f r die Handhabung eines Pings Dieser Programmcode wartet bis er Daten vom Netzwerk erh lt Danach ver sucht er herauszufinden ob die Daten ein Ping waren Wenn ja schickt der Code ein Pong zur ck und aktualisiert aus statistischen Gr nden einen Datenverkehrsz hler Danach springt er an die Stelle zur ck an der es begann Stellen Sie sich nun einen Code mit Hunderten von Ereignissen vor von denen einige m glicherweise von anderen abh ngen einige nicht andere nur unter bestimmten Umst nden eine Horrorvorstellung Ereignisbasierte Programmierung macht es deutlich einfacher wie Listing 3 2 zeigt event_handler ping send_pong 140 Pearson A ADDISON WESLEY Education Schnittstelle zum
160. Es macht berhaupt keinen Sinn eine Variable a_key oder the_key zu nennen denn es ist offensichtlich dass es sich um einen Schl ssel handelt Sinnvoller ist es zu beschreiben welche Art von Schl ssel es ist z B last_user_key Listing 1 12 zeigt die nochmals umbenannten Funktionen void calendar_add_event int day int month int year int hour int wminutes int seconds string description void calendar delete event int day int month int year int hour int wminutes int seconds Listing 1 12 Endg ltige Funktionsnamen Auf zum n chsten Punkt Diese Funktionen haben eine lange Parameterlisten Ist dies notwendig Die Parameter wurden so wie sie oben zu sehen sind intuitiv ausgew hlt und zwar nach dem herk mmlichen Datenformat das in Tag Monat Jahr Stunde Minute und Sekunde unterteilt ist Ein Datenaus tausch ber eine solche Schnittstelle ist jedoch relativ komplex Eine Funktion sollte normalerweise nicht mehr als f nf Parameter akzeptieren Wenn mehr Parameter bergeben werden m ssen sollten Sie sich berlegen ob Sie diese 57 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte nicht strukturiert bergeben Mit Strukturen halten Sie die Schnittstelle sau ber Dies ist manchmal wichtiger als die Bem hung die zus tzliche Belas tung zu vermeiden die durch Strukturen entstehen wenn sie initialisiert und oder modifiziert werden Bevor Sie versuchen alle Parameter in einer Struktur
161. Fall eine vollst ndige berpr fung der offiziellen Syntax die in RFC 822 definiert ist RFC l sst Email Adressen in der Form Name mail host com zu die bei unserer berpr fung abgelehnt w rden Unsere berpr fung kontrolliert aber auch nicht ob die Email Adresse tats chlich existiert Hin und wieder k nnen Sie auch einen anderen Ansatz sehen der zun chst stringenter erscheint sich aber im realen Leben h ufig als nicht n tzlich erweist Dies liegt daran dass SMTP das Simple Mail Transfer Protocol eine R ckmeldung gibt ob ein lokaler Benutzer existiert Wenn wir einen SMTP Kopf senden der die Adresse des Empf ngers oder den Benutzernamen auf dem lokalen System enth lt antwortet der SMTP Server mit einem Statuscode von 250 wenn der Benutzer existiert oder dem Statuscode 550 wenn der Benut zer dem System unbekannt ist So weit so gut theoretisch Leider sind viele Mailserver so konfiguriert dass sie alle Benutzer akzeptieren Sie beantworten alle Anfragen mit 250 Empf nger OK Wir haben es mit einem der Mailser ver ausprobiert die wir verwenden Da unser Mailserver auf diese Weise kon figuriert war erhielten wir die erwartete Antwort dass alle Benutzer akzep tiert werden Da SMTP ein Klartextprotokoll ist k nnen Sie dieses Verhalten sehr einfach berpr fen indem Sie per Telnet eine SMTP Sitzung simulieren bash 2 01 telnet smtp dnet it 25 Trying 194 242 192 2 Connected to ns dnet it Escape ch
162. Fehler gefunden nein ja Meldung Erfolg Meldung Fehler Meldung ausgeben Formular anzeigen Abbildung 5 1 Die PHP Normal Form Lassen Sie uns nun beispielhaft ein einfaches Formular erstellen Listing 5 1 zeigt den Programmcode Hierin soll der Benutzer seinen Namen und seine Email Adresse eintragen Zu Beginn des Skripts pr ft die Programmlogik ob 221 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien das Skript beim Weiterleiten des Formulars aufgerufen wurde Wenn dies der Fall ist wird die CGI Umgebungsvariable REQUEST_METHOD auf POST gesetzt Damit wei das Programm dass es mit der berpr fung der Formulardaten beginnen soll mixed sprint_error string string x Return a formatted error message or nothing if the passed argument wis empty xj function sprint_error string if empty string return lt br gt lt font color red gt lt b gt amp nbsp amp nbsp lt b gt lt font gt string wn Initialize message message Please fill out this form Has the form been posted if REQUEST METHOD POST Initialize the errors array errors array Trim all submitted data while list key value each form Check submitted name if is_clean_text form name 4 30 formL key trim value errors name The name you entered is not valid
163. Fehlermeldungen von Zend 9 18 3 Ausgabe einbinden in phpinfo Nachdem Sie ein reales Modul erstellt haben m chten Sie m glicherweise Informationen ber das Modul in phpinfo ausgeben zus tzlich zu dem Modulnamen der standardm ig in der Modulliste erscheint Mit der Funk tion ZEND_MINFOC k nnen Sie in der phpinfo Ausgabe einen eigenen Abschnitt erzeugen Diese Funktion sollte in den bereits besprochenen Deskriptorblock des Moduls eingef gt werden Sie wird aufgerufen wenn ein Skript phpinfo aufruft Wenn Sie die Funktion ZEND_MINFO angeben gibt PHP automatisch einen Abschnitt in phpinfo aus einschlie lich des Modulnamens in der ber schrift Alles andere m ssen Sie selbst formatieren und ausdrucken In der Regel k nnen Sie mithilfe von php_info_print_table_start einen HTML Tabellenkopf ausdrucken und anschlie end die Standardfunktonen php info_print table header und php info print_table_row verwenden Als Argumente geben Sie die Anzahl der Spalten als Integer und den Spal teninhalt als String an Listing 9 14 zeigt eine Beispiel f r einen Quellcode Abbildung 9 9 zeigt die Ausgabe Um den Tabellenfu auszugeben verwen den Sie php_info_print_table_end php_info_print_table_start php_info_print table header 2 First column Second column php_info_print_table row 2 Entry in first row Another entry 427 Pearson A ADDISON WESLEY Education 9 Erweiterung vo
164. 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 Pearson A ADDISON WESLEY Education 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 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 Bib
165. 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 die 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 sh
166. ICK command we might get backtalk on this one fputs irc_connection_handle NICK irc_nick n r fake connection status s sage works irc_connected 1 e if we got an erroneous nick mess ge our nick is not correct done 0 while done msg irc_get_message rf For Help pre Ln 547 Col 1 Mod 02 09 99 21 47 00 File Size 61817 INS 7 Abbildung 1 2 Besserer Code So oder wenigstens ungef hr so sollte unserer Meinung nach Programm code aussehen Der Code ist klar strukturiert gut kommentiert und leicht zu verstehen 1 3 3 Hinzuf gen von Kommentaren Wir k nnen es nicht genug betonen auch wenn Sie es w hrend der Program mierung f r das berfl ssigste von der Welt halten Kommentierung ist wichtig wenn Sie qualitativ hochwertigen Code produzieren Bei der L sung von komplizierten Problemen denken selten zwei Menschen auf dieselbe Weise Was dem Einen vollkommen klar erscheint kann f r den Anderen unklar sein In diesen Situationen sind Kommentare sehr hilfreich Sie sollten daher wenn m glich immer eingef gt werden Es gibt zwei Hauptarten von Kommentaren Header Kommentare z B Kom mentare im Datei Header Modul Header oder Funktions Header und im Text eingebettete Kommentare Header Kommentare sollten zur Einf hrung verwendet werden um den Leser ber allgemeine Dinge in einer Datei zu informieren oder ber den n chsten gr eren Programmabschnitt Eingebet tete Kom
167. Industrieexperten selbst Ihr System pr fen Open Source mit seinem offe nen Entwicklungsprozess erfordert wirkliche Sicherheit nicht Sicherheit durch Verschleierung sondern Sicherheit gegen alle m glichen Attacken durch einen Hacker der sich sehr gut mit dem System und seinem Quellcode auskennt Selbst wenn Open Source f r Sie keine M glichkeit ist k nnen Sie viele der Programmentwicklungsprinzipien die in der Open Source Gemeinde ver wendet werden auch f r Ihr eigenes Produkt einsetzen Eine kontinuierliche Kontrolle durch Experten kann beispielsweise helfen die blichen Sicher heitsfehler zu vermeiden die durch unzureichendes Testen entstehen Diese Kontrolle kann in Form von regelm igen berpr fungen des Pro grammcodes formalisiert werden Damit werden nicht nur sicherheitsbezo gene M ngel sondern auch allgemeinere Softwarefehler vermieden In w chentlichen Sitzungen geht ein Team von bis zu f nf Personen den neuen Quellcode durch und berpr ft ihn auf bekannte Fehler wie etwa fehlende Bereichs berpr fungen nicht verwendete Variablen oder Sicherheitsfragen Ein Moderator zeichnet alle gefundenen Fehler auf und stellt sicher dass sie sp ter vom urspr nglichen Entwickler korrigiert werden Ein typisches Test szenario k nnte folgenderma en aufgebaut sein 1 Ein Team von zwei bis f nf Entwickler wird gebildet 2 Etwa 60 Minuten lang wird der Quellcode etwa 200 bis 300 Zeilen Pro grammcode berpr f
168. L Abfrage zur ck bevor sie diese an die Datenbank schickt Anschlie end wird db gt next_record in einer while Schleife aufgerufen Die Funktion erh lt die n chste Zeile aus einer Reihe von Ergebnissen und spei chert sie im Array db gt Record Wenn keine weitere Zeile im Ergebnis vorhan den ist gibt die Funktion false zur ck und beendet die Schleife Die zweite Schleife durchsucht das Array db gt Record und gibt die Feldnamen mit ihren entsprechenden Inhalten zur ck Da dieses Array den Inhalt sowohl mit einem numerischen Index hnlich wie bei Arrays die standardm ig mit mysql_fetch_array verwendet werden als auch den Feldnamen als Schl ssel enthalten stellen Sie sicher dass nur die Array Eintr ge zur ckgegeben wer den bei denen der Index ein Feldname ist Vergleichen Sie das PHPLib Beispiel aus Listing 6 1 mit dem Beispiel der her k mmlichen Programmierung in Listing 6 2 Sie sind in etwa gleich lang aber das PHPLib Beispiel besitzt alle Vorteile die wir zuvor erl utert haben Durch ndern einer Datei k nnen Sie die zugrunde liegende Datenbankschicht ndern Auch die Fehlerbehandlung ist sehr viel leistungsf higer als im ande ren Beispiel Durch ndern einer Klassenvariablen weisen Sie PHPLib an das Programm bei Fehlern zu unterbrechen eine Fehlermeldung auszugeben 264 Pearson A ADDISON WESLEY Education Datenbankabstrahierung oder sie zu ignorieren w hrend das herk mmliche Beispiel bei
169. L und verwandte Themen kennen gelernt haben wollen wir die gewonnenen Erkenntnisse in die Praxis umset zen indem wir uns Expat ansehen einen Parser ohne G ltigkeitspr fung der in PHP integriert ist 7 2 6 PHP und Expat Expat ist der Parser der f r die XML Verarbeitung in Mozilla Apache Perl und vielen anderen Projekten zust ndig ist Er kann seit der Version 3 0 6 in PHP eingebunden werden und ist Teil der offiziellen Apache Distribution seit der Apache Version 1 3 9 Da Expat ein Parser ohne G ltigkeitspr fung ist ist es schnell und klein und eignet sich damit gut f r Webanwendungen 317 Pearson vy ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Ereignisbasierte API Es gibt zwei Arten von APls f r XML Parser Parser die auf Baumstrukturen basieren und eine Schnittstelle f r das Document Object Model mehr dazu sp ter bereitstellen und jene die XML Dokumente mit einem ereignisbasier ten Ansatz verarbeiten Expat stellt eine ereignisbasierte API zur Verf gung Ereignisbasierte Parser nehmen eine datenbezogene Sichtweise der XML Dokumente ein Sie analysieren das Dokument von oben nach unten und mel den Ereignisse wie etwa den Beginn eines Elements das Ende eines Elements den Beginn von Zeichendaten usw an die Anwendung in der Regel ber eine R ckruffunktion Das Beispieldokument Hello World weiter oben wird von einem ereignisbasierten Parser als eine Reihe dieser Ereignisse beric
170. M glichkeit dies automatisch durchzuf hren Bei gr eren Websites kann das zu erheblichen Leistungseinbu en f hren und diese Methode funktio niert nicht mit PHP 3 0 M glicherweise haben wir eine L sung f r Sie Zun chst die Voraussetzungen Sie m ssen in der Lage sein den DNS Daten satz f r Ihren Server zu ndern und der Server den Sie f r diese Art der Sit zungskennnummer Verbreitung verwenden m chten braucht eine eigene statische IP Virtuelle namensbasierte Hostrechner funktionieren hier nicht Sie k nnen diese Anforderungen erf llen Gro artig Wenn Sie sich mit Namensservern auskennen wissen Sie vielleicht dass Sie bei der DNS Konfi guration Wildcard Eintr ge machen k nnen Diese Eintr ge bilden in der Regel einen willk rlichen Hostnamen auf eine bestimmte IP ab z B folgen den Eintrag der Anfragen f r alles unterhalb von phpwebdev com an die IP 194 242 199 228 umleitet phpwebdev com IN A 194 242 199 228 Eine Anfrage nach http this is one cool domain phpwebdev com wird zu der angegebenen IP umgeleitet Da der Hostname willk rlich ist muss der Apa che Server so konfiguriert werden dass er mit der IP arbeitet im Gegensatz zu namensbasierten virtuellen Hostverfahren bei denen der Hostname fest und bekannt sein muss Unserer Apache Konfiguration sieht folgenderma en aus lt VirtualHost 194 242 199 228 gt ServerAdmin tobias dev phpwebdev com DocumentRoot home www htdocs ServerName php
171. Makros ein spezielles Namens schema f r Ihre Funktionen einf hren Ihre C Funktionen erhalten das Pr fix zend_if_ Demnach referenziert ZEND_FE first_module auf eine C Funktion namens zend_if_first_module Behalten Sie dies im Hinterkopf wenn Sie Makros und manuell kodierte Eintr ge mischen m chten was keine gute Pra xis ist Tipp Kompilierungsfehler die auf Funktionen namens zend_if_ ver weisen beziehen sich auf Funktionen die mit ZEND_FE definiert wurden Tabelle 9 2 zeigt eine Liste aller Makros die Sie zur Definition von Funktionen verwenden k nnen Makroname Beschreibung ZEND_FE Name Arg_typen Definiert einen Funktionseintrag des Namens Name in zend_function_entry Ben tigt eine ent sprechende C Funktion Arg_typen muss auf NULL gesetzt sein Diese Funktion verwendet eine auto matische Generierung von C Funktionsnamen durch Voranstellung des Pr fix zend_if_ vor den PHP Funktionsnamen ZEND_FE first_module NULL f hrt beispielsweise die Funktion first_mo dule in PHP ein und verkn pft sie mit der C Funktion zend_if_first_module Verwenden Sie dieses Makro in Verbindung mit ZEND_FUNCTION ZEND_NAMED_FE Definiert eine Funktion die ber den Namen PHP_ PHP Name Name Arg_typen Name f r PHP verf gbar ist und verkn pft diese mit der entsprechenden C Funktion Name Arg_ty pen muss auf NULL gesetzt sein Verwenden Sie diese Funktion wenn Sie das von ZEND FE einge f hrte Namensprafix
172. N WESLEY Education 2 Erweiterte Syntax dem enthalten sie n tzliche Hinweise Fine M glichkeit sind dynamische Funktionsparser auf die wir im n chsten Abschnitt eingehen 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 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 Strukt
173. N WESLEY Education Kodierungskonventionen Programm schreiben wissen Sie genau was an welcher Stelle Ihres Pro gramms passiert und k nnen schnell von einer zu einer anderen Stelle sprin gen Anderen f llt dies m glicherweise nicht so leicht Wenn Sie eine Quellda tei von jemand anderem aus Ihrem Team erhalten und ihr eine Reihe von Funktionen hinzuf gen wollen m ssen Sie sich zun chst einen berblick verschaffen und die verschiedenen Abschnitte des Programms erkennen Ide alerweise geschieht dies w hrend Sie den Code lesen Dies geht aber nur wenn Sie den Quellcode mithilfe von Hinweisen und bekannten Mustern strukturieren Deshalb sollten Sie soviel zus tzliche Informationen wie m g lich in den Quellcode packen ohne die eigentlichen Daten zu berfrachten Wie k nnen Sie diese Informationen also erhalten und sie in Ihren eigenen Code integrieren Machen Sie Ihren Code leicht lesbar F gen Sie wo m glich Kommentare hinzu W hlen Sie sprechende Variablennamen wenn es passt Sorgen Sie f r klare und konsistente Funktionsschnittstellen Unterteilen Sie Ihren Code in logische Funktionsgruppen Trennen Sie separate Teile des Codes ab Verwenden Sie Dateien um Ihre Funktionen nicht nur logisch sondern auch physikalisch in Gruppen zu unterteilen Erstellen Sie eine Dokumentation Auf die einzelnen Punkte werden wir in den folgenden Abschnitten n her eingehen 1 3 2 Lesbarmachen Ihres Codes Um den Text w
174. N WESLEY Education Vergleich von Technologien oder Entscheidung getroffen werden kann versuchen Sie ihre eigenen Entschei dungen zu treffen Werten Sie alle Fakten sorgf ltig aus und vergleichen Sie ihre Ergebnisse mit den Schlussfolgerungen die wir im Buch getroffen haben 3 2 Vergleich von Technologien Bevor Sie ber das Layout des Programmcodes nachdenken gibt eine Phase die wir hier spontan als Dinge zusammenbringen bezeichnen Dies ist ein Zwischenschritt zwischen der Idee und dem Erstellen der Spezifikation bzw des Codelayouts Es geht darum die innere Funktionsweise und deren Basis herauszufinden Um dies zu verdeutlichen lassen Sie uns zum Beginn zur ckkehren Was wollen wir erstellen Wie wollen wir es erstellen Gibt es bereits Realisierungen hierf r Gibt es ein hnliches System das fast dieselbe Aufgabe erf llt Wenn ja k nnen wir etwas von diesem Design wiederverwenden Konnen wir fremde Techniken verwenden z B um unser System zu erweitern Fragen tiber Fragen Die erste ist einfach zu beantworten Wir m chten ein Chat System erzeugen Wie Nun mit PHP und irgendwie auf der Server Seite Mehr wissen wir zu diesem Zeitpunkt noch nicht Gibt es bereits irgendwelche Chat Systeme oder hnliches Ja die gibt es Da f ngt bereits auf Ihrer Shell an Der Befehl talk erm glicht Ihnen mit ande ren Benutzern zu kommunizieren die Sie ber eine g ltige Netzwerkverbin dung oder ber
175. NSERT INTO categories VALUES 3 Sub Category II 2 Beim Aufruf von cat_idmit dem Anfangswert 3 liest die Funktion kb_cat_get_ parents zun chst die Eltern Kennnummer f r diesen Knoten aus die in unserem Beispiel 2 lautet Anschlie end ruft sie sich in einer rekursiven Funktion mit dieser Kennnummer selbst auf Den Abschluss dieser rekursi 300 Pearson A ADDISON WESLEY Education Wissensrepr sentation ven Funktion bildet parent_id 0 Dies ist die Stammkategorie ber welcher keine Knoten liegen k nnen Die Funktion ruft sich solange selbst auf bis diese Bedingung erf llt ist 7 1 5 Authentisierung Eine Anforderung der Anwendung ist dass nur registrierte Benutzer neue Ein tr ge machen d rfen Dank PHPLib l sst sich die Authentisierung berpr fen indem Sie in dem Skript das Sie sch tzen wollen den Aufruf page_open einf gen in unserem Fall submit php berpr fen Auf diese Weise kann der Benutzer auf den Seiteninhalt nur zugreifen nachdem er authentisiert wurde In der Tabelle entries speichern wir die eindeutige Benutzerkennnummer die von PHPLib geliefert wird Wie wir in diesem Kapitel bereits gezeigt haben k nnen Sie auf diese Kennnummer ber das Array auth zugreifen Sie wird in auth gt auth uid gespeichert w hrend auth gt auth uname gibt den Benutzernamen angibt Unsere Anwendung k mmert sich nicht um die Benutzerverwaltung Des halb m ssen Sie irgendw
176. Netzwerk event_handler incoming_data update_traffic_counter case of ping handle _event ping whi le not_done wait_for_event case of network_data handle_event incoming_data Listing 3 2 Ereignisbasierter Pseudocode f r die Handhabung eines Pings Dieser Code ist l nger aber auch klarer Die Hauptschleife wartet dass ein Ereignis passiert Wenn sie herausfindet dass ein Ereignis stattgefunden hat und es durch ankommende Netzwerkdaten ausgel st wurde fertig sie dieses Ereignis mithilfe der zentralen Prozedur handle_event ab Diese Funktion bestimmt dann eine Routine f r das Ereignis und ruft sie auf Die Routine aktualisiert ihrerseits den Datenverkehrsz hler und startet ein weiteres Ereig nis wenn das erste Ereignis ein Ping war Nachdem dieses Ereignis wiederum mit handle_event abgefertigt worden ist wird ein Pong gesendet Alternativ k nnten sich sowohl ping als auch incoming_data sich bei dem Ereignis incoming_data anmelden Die Erstellung zweier verschiedener Ereignisse erm glicht jedoch eine gr ere Vielfalt an Ereignissen und erlaubt somit eine detailliertere zielgerichtete Verarbeitung Es ist zun chst seltsam sich mit der ereignisbasierten Verarbeitung von Infor mationen vertraut zu machen sie funktioniert hnlich wie eine Finite State Maschine aber sie hat viele Vorteile Der Anwendung wird eine modulare Struktur aufgezwungen Jedes Modul arbeitet unabh ngig von den
177. P Basisbibliothek Wie wir im Buch bereits erw hnt haben kann PHPLib bei der t glichen Pro grammierroutine einen betr chtlichen Teil der Arbeit abnehmen Einige Kon zepte tauchen bei der Entwicklung von Webanwendungen immer wieder auf Sitzungsverwaltung Genehmigung Trennung von Layout und Programm code PHPLib besteht aus einem festen Satz von Objekten die L sungen f r diese unerl sslichen Aufgaben bieten F r viele Programmierer wirkt PHPLib einsch chternd wenn sie die Doku mentation und die Beispiele betrachten Tats chlich besteht die Bibliothek aus einem recht komplexen Satz von Klassen und die einzelnen Objekte h ngen auf nicht ganz einfache Weise voneinander ab Sobald Sie jedoch die Installa tion erfolgreich gemeistert und Ihre eigenen Basisklassen geschrieben haben werden Sie feststellen dass es gar nicht so schwierig zu verwenden ist und die Beispiele direkt und leicht zu verstehen sind 257 Pearson A ADDISON WESLEY Education 6 Datenbankzugriff mit PHP PHPLib k nnen Sie unter http phplib netuse de herunterladen Seine Dokumentation enth lt ausf hrliche Installationsanweisungen so dass wir hier nicht weiter darauf eingehen Wir gehen davon aus dass Sie eine korrekt eingerichtete PHPLib Umgebung haben bei welcher jedem Skript automa tisch prepend php3 vorangestellt wird diese Einstellung wird in der Dokumen tation empfohlen Wir geben hier auch keine Beschreibung der einzelnen Funktionen und Para
178. P erstmals im Oktober 1999 als das Unter nehmen beschloss die Produktentwicklungsgruppe zu erweitern Zuvor setze MarketPlayer com das SSI Verfahren ein um dynamische Seiten zu erstellen Ein Gro teil der Firma verwendete also zur Webentwicklung ganz bequem WYSIWYG Anwendungen PHP erm glichte MarketPlayer com anspruchsvolle dynamische Websites zu erstellen und gleichzeitig die Bega bungen der existierenden Gruppe zu nutzen die den WYSIWYG Ansatz f r die Webentwicklung verwendete Vor PHP hatte die Firme bereits L sungen mit Perl und Java realisiert doch nach der Einf hrung von PHP blieben diese anderen Sprachen bald auf der Strecke Die Tatsache dass PHP ein Open Source Programm ist bietet f r Market Player com gegen ber anderen Skriptsprachen viele Vorteile Anwendungen k nnen leicht optimiert werden indem zum PHP Quell code Module und Funktionen hinzugef gt werden die MarketPlayer com spezifisch sind Die Unterst tzung f r diese Technologie w chst t glich Viele Einzelpersonen stellen der Gemeinschaft erstklassige PHP Anwen dungen zur Verf gung und die GNU Lizensierung beschleunigt die Ent wicklung von Schl sselprodukten erheblich 8 3 4 Vorteile von PHP f r die Produktentwicklung von MarketPlayer com MarketPlayer com zieht PHP anderen Technologien nicht nur wegen des ein fachen Designs vor sondern auch wegen der Verf gbarkeit und Erweiterbar keit des Quellcodes der guten Integration auf dem Apache W
179. 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 Pearson vy ADDISON WESLEY Education Assoziative Arrays Hinweis PHP 3 0 hat keine vern nftige 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 Vari ablenverarbeitung in PHP sind die Arrays Wahrscheinlich kennen Sie den herk mmlichen Array Iyp das indexierte Array Indexierte Arrays 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 Spra chen wie Pascal lassen eine Indexierung mit versch
180. Pearson A ADDISON WESLEY Education Webanwendungen mit PHP 4 0 entwickeln Pearson A ADDISON WESLEY Education Pearson A ADDISON WESLEY Education Tobias Ratschiller Till Gerken Webanwendungen mit PHP 4 0 entwickeln vy ADDISON WESLEY An imprint of Pearson Education M nchen e Boston e San Francisco e Harlow England Don Mills Ontario e Sydney e Mexico City Madrid e Amsterdam Bitte beachten Sie Der originalen Printversion liegt eine CD ROM bei In der vorliegenden elektronischen Version ist die Lieferung einer CD ROM nicht enthalten Alle Hinweise und alle Verweise auf die CD ROM sind ung ltig Pearson A ADDISON WESLEY Education Die Deutsche Bibliothek CIP Einheitsaufnahme Ein Titeldatensatz fiir diese Publikation ist bei Der Deutschen Bibliothek erh ltlich Die Informationen in diesem Produkt werden ohne R cksicht auf einen eventuellen Patentschutz ver f fentlicht Warennamen werden ohne Gew hrleistung der freien Verwendbarkeit benutzt Bei der Zusam menstellung von Texten und Abbildungen wurde mit gr ter Sorgfalt vorgegangen Trotzdem k nnen Fehler nicht vollst ndig ausgeschlossen werden Verlag Herausgeber und Autoren k nnen f r fehler hafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung ber nehmen F r Verbesserungsvorschl ge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar Alle Rechte vorbehalten auch die der fotomechanischen Wiede
181. Programms verf gbar zu machen Dies erreichen Sie beispiels weise indem Sie einen Cookie setzen der die ID enth lt Wenn Sie einen Benutzer ber mehrere Sitzungen hinweg identifizieren wollen ist die Ver wendung eines Cookies sogar die einzige M glichkeit Ungl cklicherweise wird ein Teil der Benutzer den Cookie in ihrem Browser deaktiviert haben Sch tzungen zufolge sind es bis zu 20 Je nach Zielgruppe lohnt es sich m glicherweise die Benutzer auf eine Hilfsseite umzuleiten die ihnen zeigt wie Sie die Cookies aktivieren k nnen Die Sitzungskennnummer mit Cookies zu bergeben ist f r den Entwickler die bei weitem einfachste Methode Ihr Programm muss nichts anderes tun als das Cookie zu setzen 168 Pearson A ADDISON WESLEY Education HTTP und Sitzungen 4 1 3 Manuelle nderung der URL Eine weitere Alternative um die Sitzungskennnummer zu verbreiten ist die URL manuell zu ndern Damit leiten Sie die Sitzungskennnummer entweder ber GET POST weiter oder verstecken sie im URL Dazu m ssen Sie die HTML Tags frame form und a ndern um auf Ihre ID zu referenzieren A frame source definition printf lt frame src page php3 session_id 4s gt session_ id A hidden form field printf lt input type hidden name session_id value s gt session_ id A normal link printf lt a href page php3 session_id s gt Link lt a gt session_id Wenn Ihr Programm Abbildungen eingebette
182. Projekten auftauchen k nnen k nnten Sie wenn Sie den Namen den Typ und die Deklaration jeder Variablen auflisteten ein kleines Telefonbuch erstellen Wie soll Ihr Verzeichnis aussehen Im Laufe der Zeit haben sich verschiedene Namensschemata etabliert hinter denen jeweils eine eigene Philosophie steht Jedes hat seine Vor und Nachteile Prinzi piell lassen sie sich in zwei Gruppen unterteilen kurze und einfache Variablen und Funktionsnamen oder sprechende Variablen und Funktionsnamen das sind l ngere Namen die Auskunft ber den Typ und den Zweck geben Das Telefonbuch k nnte folgenderma en aussehen Name Adresse Nummer J D 382 W S 3951 M S 204 E R 8382 33 A Pearson wW y ADDISON WESLEY Education 1 Entwicklungskonzepte Sehr informativ Nun wissen Sie dass Ihr Telefonbuch zwei Eintr ge enth lt aber auch nicht viel mehr Sie kennen die Initialen der Person aber nicht ihren vollst ndigen Namen Sie wissen die Hausnummer aber nicht den genauen Stra ennamen Und Sie sehen nur einen Teil der Telefonnummer Betrachten wir ein anderes Beispiel Name Adresse Nummer ht5ft9in_age32_John Doe_male_married ht5ft6in_age27_Mary Smith_female_single 386 West Street Los Angeles California USA Earth 204 East Road Los Angeles California 1 555 304 3951 1 555 306 8382 USA Earth In diesem Beispiel beinhaltet der Name der
183. R RDF Resource Description Framework Spezifikation 308 register_globals 177 Request For Comments RFC 135 Resource Description Framework RDF 308 Ressource Datentyp 418 RFC Request For Comments 135 225 RLE Run Length Encoding Algorithmus 105 RSA Verschl sselung 194 S Schnittstelle 142 zum Benutzer 150 zum Entwickler 151 Schorvitz Eric B MarketPlayer com 359 Seiten Caching 183 Semaphore 149 Serialisierung 179 Session ID verbreiten 168 Session Klasse PHPLib 268 273 Session Lebenszyklus 232 Sessions 266 SGML Standard Generalized Markup Language 303 Shared Memory 149 269 Shared Module 437 Shared Object 369 Simple Mail Transfer Protocol SMTP 225 Sitzungsablauf 176 Sitzungsvariablen 177 Sitzungsverwaltung 362 Six Offene Systeme GmbH 353 SixAIM 357 SixCMS 354 357 Skript versus Anwendung 165 SMTP Simple Mail Transfer Protocol 225 Education Speicherbereinigung 178 Speichermodule 179 Speichern auf der Clientseite Nachteile 166 Speicherverwaltung 373 Sperrdateien erstellen 148 sprechende Variablennamen 33 47 standalone Dokumente XML 312 Standard Generalized Markup Language SGML 303 Standardformular siehe PHP Normal Form 221 Stapel Expat XML Parser 321 statistische Informationserfassung 325 Statuscodes CVS 237 Streaming HTML 144 String variablen 375 Strings Variablen 412 Swap Speicher 145 Symmetrische Verschliisselung 193 Szenarien 214 T Tauglichkeitspriifung Heuri
184. RN NULL make changes to the parameter parameter gt type IS LONG parameter gt value lval 10 Listing 9 9 Austesten der Paramteriibergabe durch Referenz 405 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern yy Netscape iof xi File Edit View Go Communicator Help Trying without reference operator Before Type string Content hello Warning Parameter wasn t passed by reference in home wwwihtdocs reference_test php on line 18 After Type string Content hello Trying with reference operator Before Type string Content hello After Type integer Content 10 Document Done Se ES PEs 2 FZ Abbildung 9 6 Austesten der Parameteriibergabe durch Referenz 9 11 6 Gew hrleistung der Schreibsicherheit fur andere Parameter M glicherweise kommen Sie in eine Situation in der Sie Schreibzugriff f r einen Parameter ben tigen der mit zend_get_parameters_ex ausgelesen wurde aber nicht durch Referenz bergeben wurde F r diesen Fall k nnen Sie das Makro SEPARATE_ZVAL verwenden das eine zval Separation in bereitge stellte Container durchf hrt Der neu erzeugte zval wird von den internen Daten abgetrennt und hat nur einen lokalen G ltigkeitsbereich Damit kann er ge ndert oder entfernt werden ohne dass dies Auswirkungen auf die glo bale Umgebung des Skripts h tte 406 Pearson A ADDISON WESLEY Education Erzeugen v
185. 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_array 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 Pearson A ADDISON WESLEY Education 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 und 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 Spei
186. Sie IRC als Protokoll in Ihrem Chat System einsetzen m ssen Sie auf grund der Protokollverarbeitung mit erheblichen Komplikationen rechnen Die Verarbeitung von Netzwerkprotokollen erfordert eine nicht lineare Pro grammierung was in PHP eigentlich nicht unterst tzt wird Um auf Netz werknachrichten reagieren zu k nnen brauchen wir ein ereignisbasiertes System Dar ber hinaus ben tigen wir ein Verfahren um den Nachrichten austausch effizient zu bewerkstelligen d h mit Nachrichten von einem Benutzer und f r einen Benutzer umzugehen was leider nicht immer auf die selbe Art und Weise gehandhabt werden kann Dieses Problem gibt es nat r 133 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel lich auch bei der datenbankgest tzten L sung Diese hat allerdings nicht das Problem der Protokollhandhabung Viele Datenbanken werden direkt von PHP unterst tzt und die meisten der anderen werden indirekt durch OBDC unterst tzt Um netzwerkf hige Chat Boxen zu erhalten brauchen wir ledig lich ein Werkzeug das Chat Boxen synchronisieren kann sofern Sie nicht einen zentralen Datenbank Server einrichten m chten auf den alle Boxen gleichzeitig zugreifen k nnen F r was w rden Sie sich entscheiden Antwort phpChat basiert auf IRC und zwar aus folgenden Gr nden F r eine Datenbank ben tigten wir eine Art von propriet rem privatem Protokoll das nicht mit anderen Standardsystemen kommuniz
187. Sie entwickelten den Skripterstellungsprozesser von PHP der inzwi schen auf ber einer Million Leitrechnern installiert ist Nach der Einf hrung von PHP 4 0 hat sich Zend Engine zu einem vielseitigen Skriptprozessor gemausert Andi Gutmans und Zeev Suraski entwickeln gerade eine Reihe von Produkten um die Leistungsf higkeit und den kommerziellen Nutzen von PHP zu erh hen 14 Pearson A ADDISON WESLEY Education Danksagungen Danksagungen Ein gro es Dankesch n gilt den Mitarbeitern von New Riders Sie hatten es wahrscheinlich schwer mit uns und wir m chten uns wirklich f r Ihre Freundlichkeit und Professionalit t bedanken Auch an Robin Drake unserer Herausgeberin besonderen Dank f r ihre Geduld mit uns Au erdem bedan ken wir uns bei unserem technischen Berater Graeme Merrall und unserer Herstellerin Ann Quinn Die folgenden Leute haben uns in den verschiedenen Phasen der Bucherstel lung geholfen Auch bei ihnen m chten wir uns bedanken Alan Bower Nancy Maragioglio Jakob Nielsen Kristian Koehntopp Zeev Suraski Andi Gutmans Leon Atkinson Alexander Aulbach Uwe Steinmann Boaz Yahav und Rafi Ton Ebenso bei den Verfassern unserer Fallstudien Zuletzt bedan ken wir uns bei SoftQuad f r die Bereitstellung ihres hervorragenden XMe taL XML Editors mit dem wir den Text erstellen und bearbeiten konnten Danksagungen von Tobias Die Person welcher der gr te Dank geb hrt ist nat rlich Till Gerken der ein
188. Sie mit Ihrem bevorzugten Editor f r jeden Kommentartyp Makros und weisen Sie diesem Tastaturk rzel zu z B E F E F EcNF fiir Dateik pfe E amp f E i F Ec f r Modulk pfe usw Wenn der Editor es unterst tzt f gen Sie auch Variablen in diesen Kommentaren ein so dass Sie ausgefeilte und aus sagekr ftige Kommentare ber einen kurzen Frage Antwort Dialog erzeugen k nnen Datei Header Kommentare Datei Header Kommentare sollten in etwa so aussehen wie jene im Listing 1 3 FTLTTLETLTLT LETT LTT UL UUE TT TT ATT TTT phpIRC php3 IRC client module for PHP3 IRC clients anne ran cnt This module will handle all major interfacing with the IRC server making all IRC commands easily available by a predefined API 7 See phpIRC inc php3 for configuration options i Author Till Gerken Last modified 09 17 99 41 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte Copyright c 1999 by Till Gerken LILTTLLTLLLTTT TATTLE TTT TTA AAT TT Listing 1 3 Datei Header Kommentar M glicherweise m chten Sie lieber einen umrandeten Kasten verwenden der von mehrzeiligen Kommentaren erzeugt wird Manche Leute finden ihn sthetischer siehe Listing 1 4 kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk phpIRC php3 IRC client module for PHP3 IRC clients a KERLE aces eas ge te ee HUREN This module will handle all major interfacing with the IRC
189. Sie nicht was phpPolls macht aber der Name legt nahe dass es etwas mit Pollen zu tun hat lastIP besagt dass es sich um die letzte IP handelt Welche IP Das wissen Sie nicht Offensichtlich ist der Name f r diese Variable nicht sehr gl cklich gew hlt weil er den Inhalt nicht genau erkl rt Angenommen Sie fragten nach dem Zweck dieser Variablen und erhielten die Antwort Sie enth lt die IP des letz ten Benutzers der zuletzt angerufen hat Jetzt denken Sie sich einen Namen aus Wie w re es mit phpPolls_last_voters_IP Besser oder Aber auch wenn der Name selbst jetzt in Ordnung ist passt er nicht weil es noch zwei weitere globale Variablen aus der Reihe phpPolls gibt die jeweils mit dem Pr fix phpPolls_ beginnen w hrend der Rest in einem Wort geschrieben wird Aus Konsistenzgr nden sollten Sie die W rter innerhalb des Namens nur durch Gro buchstaben trennen phpPolls_lastVotersIP Funktionsnamen sollten mit genauso soviel Sorgfalt ausgew hlt werden wie Namen globaler Variablen wenn auch mit ein paar nderungen Funktions namen sollten Auskunft ber ihre Funktion geben und sich in den Lesefluss einpassen Diese Integration erreichen Sie indem Sie die Aktion ermitteln die eine Funktion durchf hrt und einen in den meisten F llen akzeptablen Namen f r diese Aktion w hlen Wenn eine Funktion feststellt ob ein Benutzer gerade online ist k nnte der Name dieser Funktion z B folgenderma en aussehen
190. Sie zumin dest selbst einen Blick auf den Quellcode werfen k nnen wenn etwas nicht so funktioniert wie erwartet Six hat au erdem die Erfahrung gemacht dass es einfacher und schneller geht Unterst tzung nderungen und Fehlerkorrek turen f r Open Source Elemente zu bekommen als f r kommerzielle Kompo nenten Eine einfache Anfrage bei einer der Newsgroups oder Mailinglisten bringt h ufig einige qualifizierte und hilfreiche Antworten in wenigen Stun den wenn nicht gar Minuten Kommerzielle und propri tere Anwendungen und Umgebungen sind kompliziert und h ufig in Hinsicht auf Kosten und propri tere Mechanismen alles andere als optimal Inzwischen unterst tzt Six die Entwicklung von PHP sowohl direkt als auch indirekt Ein Angestellter von Six Dr Egon Schmid geh rt zur PHP Entwick lungsgruppe und ist Mitverfasser des PHP Buchs PHP Dynamische Web auftritte professionell realisieren Markt u Technik M nchen 1999 Zus tz lich geben Six Entwickler regelm ig Empfehlungen und Meinungen in den PHP Mailinglisten und Usergroups Dieser Aufwand wird sowohl in als auch au erhalb der Arbeitszeit unterst tzt und gef rdert 355 Pearson vy ADDISON WESLEY Education 8 Fallstudien 8 2 4 Technologieuberlegungen Six empfiehlt in vielen Situationen die Verwendung von PHP und verwendet es selbst f r die meisten seiner Anwendungen einschlie lich SixCMS Insbe sondere fiir layoutorientierte Websites mit geringem ode
191. Tabelle beschrieben werden Funktion Beschreibung void EasyTemplate string Der Konstruktor der Klasse gibt im Argument den Schablone Dateiname Dateinamen der Schablone zur ck die Sie verwen den m chten Wenn ein Fehler auftritt wird die Feh lermeldung in der Variablen error ausgegeben bool assign String Tag Weist einem Schablonen Tag einen Wert zu Gibt bei Stringwert erfolgreicher Zuweisung true zur ck bei einem Feh ler false 227 Pearson vy ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien Funktion Beschreibung mixed easy_parse Analysiert die Schablone und gibt sie als Zeichen kette aus Wenn ein Fehler auftritt gibt die Funktion false zur ck und setzt die Variable error der Klasse auf eine sinnvolle Meldung mixed easy_print Analysiert die Schablone und druckt sie aus Wenn ein Fehler auftritt gibt die Funktion false zur ck und setzt die Variable error der Klasse auf eine sinnvolle Meldung Tipp Ein Konstruktor gibt in PHP stets void zur ck egal was Sie mit return zutun versuchen Worin besteht der Vorteil Schablonen zu verwenden Haupts chlich in der Trennung von Darstellung und Code Jeder Programmdesigner kann die Schablonendatei in seinem bevorzugten HTML Autorenprogramm ffnen ohne sich um den Skriptcode Sorgen machen zu m ssen Der Designer muss sich sogar berhaupt nicht mit HTML befassen Die Alternative w re den PHP
192. Table window Help lal x jose a may s maeloolsmivi R a What Is XML Used For El As a structured information markup language XML is of course used in content management systems archiving solutions and corporate document repositories But there exist plenty of other XML applications and sub protocols Due to the open nature of the standard DTDs have been developed at a fast pace DocBook The DocBookX DTD is one of those DocBook is a very popular set of tags for describing books articles and other prose documents particularly technical documentation It was originally developed in 1991 by the publisher O Reilly as an SGML DTD for their in house use It became soon popular with authors and spread to other publishing houses a change embraced by O Reilly who handed over further development to the Davenport Group In mid 1998 OASIS Organization for the Advance of Structured Information Standards took over the maintenance of DocBook officially When XML became increasingly popular an unofficial XML version 3 1 was created by Norman Walsh work is currently under way to transform this to an official release DocBook 5 will most probably come in SGML and XML flavors When we started writing this book it was clear for us that we wanted to use a open format like XML The DocBook DTD was consequently chosen because it offered all features we would ever need All the elements typically used in a techn
193. Variablen in ein WDDX Tag des Typs struct umgewandelt Der Unter schied ist dass die Transaktion in drei Schritten vonstatten geht Dies hat den Vorteil dass Sie PHP Variablen zu einem WDDX Paket langfristig hinzuf gen k nnen z B w hrend einer komplexen Berechnung Im Gegensatz dazu arbeitet die Funktion wddx_serialize_vars auf atomare Weise Sie beginnt mit der Zusammenstellung eines Pakets indem sie die Funktion wddx_packet_ start aufruft die ein optionales Argument hat den Header Kommentar f r das WDDX Paket Diese Funktion gibt einen Paketbezeichner zur ck hnlich den Dateibezeichnern die mit fopen zur ckgegeben werden Dieser Bezeichner wird als erstes Argument der Funktion wddx_add_vars verwen det Die brigen Argumente sind identisch mit jenen aus wddx_serialize_ vars eine beliebige Anzahl von Strings welche die Namen der PHP Variab len angeben Ein einfaches Beispiel i1 i2 13 Foo packet_id wddx_packet_start This is a comment for i l i lt 3 i print wddx_packet_end packet_id wddx_add_vars packet_id i i Dieses Beispiel f gt in einer for Schleife dem WDDxX Paket einfach drei String Variablen hinzu und erzeugt die folgende Ausgabe auch hier wurden zur besseren Lesbarkeit entsprechende Einz ge hinzugef gt 346 Pearson Education lt wddxPacket version 1 0 gt lt header gt A ADDISON WESLEY Zusammenfassung lt comment gt This is a c
194. WESLEY PHP und XML Ziel Funktion Beschreibung Notationsdeklara xml_set_notation_decl_handler Auftreten einer Notati tionen onsdeklaration Standard xml_set_default_handler Alle Ereignisse denen keine Bearbeitungsrou tine zugeordnet ist Beginnen wir mit einem wirklich einfachen Beispiel Der Quellcode in Listing 7 2 stellt ein Programm dar mit dem alle Kommentare aus einem XML Dokument entfernt werden Zur Erinnerung Kommentare haben die Form lt gt Das Beispiel registriert nur eine Bearbeitungsroutine die w hrend der Analyse f r alle Ereignisse aufgerufen wird Wenn Sie eine andere Bearbeitungsroutine registrieren z B durch Verwendung von xml set_character_data_handler w rde die Standardroutine f r dieses spezielle Ereignis nicht aufgerufen Die Standardroutine verarbeitet nur freie Ereig nisse denen keine Routine zugeordnet ist require xml php3 function default_handler p data global count count of comments found Check if the current contains a comment if ereg data matches line xml_get_current_line_number p Insert a tab before new lines data str_replace n n t data Output line number and comment print line t data n Increase count of comments found count Process the file passed as first argument to the script file argv 1 count 0 319 Pearson A ADDISON WESLEY
195. Wenn dieser fehlt geht die Funk tion davon aus dass Sie mit dem Blocknamen identisch ist In unserem Bei spiel w rde set_block folgenderma en aufgerufen werden set_block table blockname Die erzeugte Referenz blockname kann dann wie Referenzen gehandhabt werden die mit set_file erzeugt wurden und normal analysiert werden Zugegeben es klingt verwirrend wenn Sie dies zum ersten Mal h ren Sehen wir uns an wie die Klasse Template vom Konzept her funktioniert Eine wich tige logische Einheit der Klasse Template bilden die Handles Handles hneln Linkbezeichnern Ressourcen IDs sie zeigen auf einen bestimmten Daten satz und k nnen in verschiedenen Funktionen als Referenzen f r diesen Datensatz verwendet werden Sie k nnen Handles auf eine der folgenden drei Arten erzeugen set_file erzeugt einen Handle f r eine Schablonendatei set_var erzeugt einen Handle f r einen Platzhalter innerhalb einer Schablone set_block erzeugt einen Handle f r einen Block innerhalb einer Schab lone Mit jeder dieser Funktionen k nnen Sie den zu erzeugenden Handle ange ben In set_file und set_var wird der zu erzeugende Handle im ersten Argument angegeben bzw im Schl ssel des Array wenn als Argument ein assoziatives Array bergeben wird In set_block wird der Handle im zwei ten Argument angegeben In Funktionen wieparse subst oder get_ undefined verwenden Sie den zuvor erzeugten Handle um auf den Daten
196. Wer braucht jedoch ein Objekt f r eine einzelne Funktion Intern war die Ausf hrung des Programmcodes streng linear und der Hardwarezugriff wurde von 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 Pearson vy ADDISON WESLEY Education PHP und objektorientierte Programmierung Welche Vorteile haben Objekte nun und inwiefern unterscheidet sich OOP von dem prozeduralen Ansatz Warum sollten wir uns berhaupt damit befas sen 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 objektorientie
197. a Zend intern mit Referenzen arbeitet k nnen verschiedene Variablen m g licherweise auf denselben Wert referenzieren Der Schreibzugriff auf einen zval Container setzt voraus dass dieser Container einen separaten Wert ent h lt d h auf einen Wert auf den nicht von einem anderen Container referen ziert wird Wenn Sie mit anderen Containern auf den zval Container referen zieren und das referenzierte zval ndern m ssen Sie automatisch den Inhalt der anderen Container ndern die auf dieses zval referenzieren da Sie ein fach auf den ge nderten Wert zeigen und daher auch Ihren eigenen Wert ndern w rden zend_get_parameters_ex k mmert sich nicht um diese Situation Die Funk tion gibt einfach einen Zeiger auf den gew nschten zval Container aus egal ob sie aus Referenzen bestehen oder nicht Die entsprechende Funktion der traditionellen API zend_get_parameters pr ft sofort ob referenzierte Werte vorliegen Wenn sie eine Referenz findet erzeugt sie einen neuen separaten zval Container kopiert die referenzierten Daten in diesen neu zugewiesenen Speicher und gibt einen Zeiger aus den neuen separaten Wert aus Dieser Vorgang zval Separation oder pval Separation Da die _ex API keine zval Separation durchf hrt ist sie zwar um einiges schneller verhin dert aber einen Schreibzugriff Zum ndern der Parameter ben tigen Sie jedoch einen Schreibzugriff Zend l st dieses Problem auf eine spezielle Weise Sobald ein Paramete
198. a alle Werte in einer Verbund gespeichert werden f hrt der Versuch auf Daten mit falschen Mitglieder des Verbunds zuzugreifen zu einer sinnlosen Ausgabe Der Zugriff auf Arrays und Objekte ist etwas komplizierter und wird sp ter er rtert 403 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern 9 11 5 Verarbeitung von Argumenten die durch Referenz bergeben wurden Wenn Ihre Funktion Argumente annimmt die durch Referenz bergeben wurden und Sie diese ndern m chten m ssen Sie einige Vorkehrungen treffen Bisher nicht erw hnt haben wir dass wir unter den bisher beschriebenen Umst nden keinen Schreibzugriff auf zval Container haben die Funktionspa rameter spezifizieren die an Sie bergeben wurden Nat rlich k nnen Sie jeden zval Container ndern den Sie innerhalb Ihrer Funktion erzeugt haben Sie d rfen jedoch keine zvals ndern die auf Zend interne Daten referen zieren Wir haben bisher nur sogenannte _ex API er rtert Sie haben m glicher weise bemerkt dass die API Funktionen die wir verwendet haben nicht zend_get_parameters sondern zend_get_parameters_ex bzw nicht convert_ to_long sondern convert_to_long_ex usw lauten Die _ex Funktionen bilden die sogenannten neue erweiterte Zend API Sie bieten eine leichte Geschwindigkeitserh hung gegen ber der alten API sind daf r aber nur f r die Bereitstellung eines Nur Lese Zugriffs gedacht D
199. aben wir uns f r einen FILO Stapel First In Last Out entschieden Dieser Stapel der ein normales Array ist enth lt alle derzeit offenen Elemente In der Bear beitungsroutine f r die offenen Elemente wird das aktuelle Element mit array_push oben auf den Stapel gelegt Analog dazu entfernt die Funktion der Endelementroutine das oberste Element mit array_pop Hinweis array_pop und array_push sowie viele weitere n tzliche Funk tionen die sich mit Arrays befassen wurden erst in PHP 4 0 hinzugef gt Wir wollten sie nach PHP 3 0 portieren aber es ist schwierig sie im eigent lichen PHP zu integrieren um sie wieder nach PHP 3 0 zur ck zu portie ren Dies liegt an der Art und Weise wie unset arbeitet Um ein Element vom Stapel zu entfernen brauchen Sie einen Befehl wie den folgenden unset arrayLcount array 1 Wenn dies funktionierte w re es einfach array_pop zu implementieren es funktioniert jedoch nicht Bei PHP hinterll sst unset L cher im Array Es setzt den Indexz hler nicht zur ck Dies k nnen Sie leicht selbst berpr fen array array a unset array 0 array a _var_dump array Das Element a hat jetzt nicht den erwarteten Schl ssel 0 sondern 1 Dies f hrt zu fragmentierten Arrays was fiir einen Stapel sehr ungiinstig ist Dieses Verhalten liegt in den anderen Elementen in dem Array begriindet Wenn das Loch entfernt w rde m sste das Array neu organisiert w
200. able Hier h tten Sie auch EasyTemplate verwen den k nnen was wahrscheinlich schneller und intuitiver gewesen w re als der PHPLib Ansatz Wie leistungsf hig die Klasse Template wirklich ist zeigt sich wenn Sie diese in komplexeren Szenarien einsetzen 295 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Eine ihrer St rken besteht darin dass die Klasse Template mehrere Vorlagen dateien verarbeiten und diese in eine Ausgabedatei zusammenfassen kann Die Wissensdatenbank macht extensiven Gebrauch von dieser Funktion Eine Seitenschablone definiert das allgemeine Layout und die Struktur die Casca ding Style Sheets sowie Kopf und Fu zeile w hrend viele kleinere Schablo nen den Inhalt innerhalb der Eltern schablone festlegen Betrachten Sie die folgenden Ausz ge aus der Hauptseite der Anwendung index php stpl gt set_file array page gt page inc html table gt table ine html entry_summary gt en try summary inc html 233 rest of code assignments etc tpl gt parse CONTENTS table true tpl gt parse CONTENTS entries true tpl gt parse CONTENTS page tp1 gt p CONTENTS A Die Hauptschablone wird mit dem Bezeichner page referenziert Hierbei han delt es sich im Wesentlichen um einen HTML Frame der einen wichtigen Platzhalter n mlich CONTENTS f r den eigentlichen Inhalt der Seite enth lt Dieser Pla
201. ace bei welcher die umgekehrte Argumentenreihenfolge akzeptiert werden in str_replace nderten Nat r lich ist dieses Argument berechtigt Aber warum akzeptieren die regul ren Ausdrucksfunktionen ihre Argumente in einer der Zeichenketten Funktionen entgegengesetzten Reihenfolge Weil diese Funktionen in PHP jene in C reflektieren Bei der Entwicklung eines Programms ist es rgerlich zu sehen dass sich str_replace von dem Rest der Funktionsgruppe abhebt Wenn Sie die Schnittstellen Ihrer n chsten Bibliotheken entwickeln achten Sie darauf dass diese Situation bei Ihnen nicht vorkommt 1 3 6 Unterteilung des Programms in logische Gruppen Programme bestehen in der Regel aus mehreren Funktionsgruppen die sich jeweils einer speziellen Aufgabe und oder einem Anwendungsbereich wid men Beim Schreiben eines datenbankgest tzten Programms sollte eine sepa rate Funktionsgruppe f r den Datenbankzugriff verantwortlich sein Dieser Programmcode stellt eine eigene Einheit dar und kann sicher vom brigen 51 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte Programm abgetrennt werden sofern Sie es gut durchdacht haben Funk tionsgruppen die logisch nur eine bestimmte Aufgabe durchf hren k nnen sollten so konzipiert sein dass sie vom brigen Programm unabh ngig behandelt werden k nnen Diese Funktionen sollten auch physikalisch vom restlichen Hauptprogramm getrennt sein in Form eines Moduls Bevor Sie ein Prog
202. ache muss bereits im aller ersten Schritt d h der Installation auf die Sicherheit geachtet werden Wie Sie wissen kann PHP als Servermodul Apache Modul ISAPI NSAPI Plugin oder eigenst ndiges CGI Programm installiert werden Wenn Sie es als Servermodul installieren ist es Teil des zugrunde liegenden Webservers und erbt seine Sicherheit F r diese Art Einstellungen sind keine PHP spezifischen Attacken bekannt Nat rlich brauchen Sie noch einen sicheren Server aber dies ist ein zu weites Feld als dass wir es hier behandeln k nnten CGI Programme bieten dagegen eine hervorragende Angriffsfl che f r eine Vielzahl m glicher Attacken sowohl Einbruchs als auch Dienstverweige rungsattacken Traditionell entstehen die gr ten Probleme wenn Sie einen Skriptinterpreter in das Verzeichnis cgiwin eines Webservers einf gen Bei einigen Skriptinterpretern k nnen Benutzer jeden Befehl ber den Server schicken PHP versucht einige dieser Attacken zu verhindern Wenn es vom Web aus gestartet wird verwirft PHP Befehlszeilenparameter die von der CGI Schnittstelle kommen Anfragen wie etwa http server com cgi bin php etc passwd schlagen fehl Ungl cklicherweise kann eine andere Attacke die direkt mit M ngeln in der CGI Spezifikation zusammenh ngt immer noch durchkommen Sie k nnen auf jede Datei unterhalb des Webserver Dokumentenstamms zugreifen selbst wenn das Verzeichnis durch HTTP AUTH eine htaccess Datei gesch tzt ist Da
203. achtet PHP unterst tzt Objekte Im folgenden Abschnitt wollen wir die Vor und Nachteile der objektorientierten Programmierung mit PHP er rtern 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
204. al ar F gt im Array einen String der gew nschten ray uint idx char str uint Lange length hinzu diese Funktion ist schneller length int duplicate und bin rsicher Ansonsten verh lt sie sich wie add_index_string Tab 9 9 Zends API fiir indizierte Arrays Teil 1 Hinweis Die Funktionen aus der Tabelle 9 10 arbeiten mit dem Array array Diese Funktionen generieren automatisch einen neuen Index basie rend auf dem h chsten im Array gefundenen Index Funktion Beschreibung add_next_index_long zval F gt ein Element des Typs long hinzu array long n add_next_index_unset zval F gt ein nicht gesetztes Element hinzu array add_next_index_bool zval F gt ein boolesches Element hinzu array int b add_next_index_resource zval F gt im Array eine Ressource hinzu array int r Tab 9 10 Zends API f r indexierte Arrays Teil 2 415 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Funktion Beschreibung add_next_index_double zval F gt eine Flie kommazahl hinzu array double d add_next_index_string zval F gt im Array einen String hinzu Der Flag du array char str int dupli plicate gibt an ob der Stringinhalt in den in cate ternen Zend Speicher kopiert werden muss add_next_index_string zval F gt im Array einen String der gew nschten array char str uint L nge length Diese Fu
205. alisiert wurden Hier wird bei einer erfolgreichen Speicherbereinigung true zur ckgege ben bei einem Fehler false Das Beispiel in Listing 4 2 aktiviert die Benutzerriickruffunktionen und defi niert ein Speichermodul das die Sitzungsdaten in einer MySQL Datenbank ablegen soll Das komplette Beispiel einschlie lich dem erforderlichen MySQL Tabellenschema befindet sich auf der CD ROM die mit dem Buch mitgeliefert wird Da session_set_save_handler derzeit keine Klassenfunkti onen sondern nur einfache Funktionen akzeptiert haben wir anstatt einer Klasse die gute alte strukturelle Programmierung verwendet Vererbung und mehrere Instanzen w rden f r diese Art von Code sowieso keinen Sinn erge ben daher ist es hier kein gro er Verlust sess mysql array sess _mysql open_connection true w Establish a MySQL connection on session startup sess_mysql hostname localhost MySQL hostname sess_mysql user root MySQL username sess_mysql password S MySQL password sess_mysql db book Database where to store the sessions sess_mysqIi table sessions Table where to store w the sessions function sess _mysql_open save_path sess_name global sess_ mysql Establish a MySQL connection if sess_mysql open_connection wis true if sess_mysql open_connection link mysql_pconnect sess_mysql hostname sess_ wnysal l user s
206. ality for easy file access and includes error checking and reporting Functions int file_open string file name bool file close int file handle int file_read int file handle nr_bytes Remarks 43 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte provides no seek function does not allow write access FULTTLLTLTLTTLT TTT TTT TTT ATTA TATA TATA TATA TT TT Listing 1 5 Modul Header Kommentar Ein solcher Header k nnte folgende Informationen enthalten nach Wichtig keit geordnet 1 Kurzbeschreibung des Moduls 2 Ausf hrliche Beschreibung des Moduls 3 Funktionsprototypliste 4 Anmerkungen Hinweise Auch hier k nnen die Kommentare mehrzeilig sein Funktions Header Kommentare In den Funktions Header Kommentaren sollten so detailliert wie m glich f r jede Funktion Syntax Zweck und notwendige Aufrufdaten angegeben wer den siehe Listing 1 6 Diese Art des Kommentars ist in eingebetteten Kom mentaren nicht so wichtig Funktions Header Kommentare dienen dazu den Programmierer w hrend der Entwicklung und Erweiterung eines Moduls rasch ber die Anforderungen und Eigenarten der einzelnen Funktionen zu informieren Diese Informationen ben tigen haupts chlich fremde Entwick ler welche die urspr nglichen Funktionen nicht erstellt haben Sind solche Kommentare nicht vorhanden muss sich der Entwickler selbst ins Programm vertiefen um die gew nschte Information zu
207. alten Es w re einfacher wenn CVS den Bin rtyp in einigen Dateierweite rungen erzwingen k nnte Gl cklicherweise l sst sich dies einfach mit der Verwaltungsdatei cvswrappers bewerkstelligen In dieser Datei k nnen Sie Aktionen definieren die Dateien bei jeder R ck bertragung und jedem Aus lesen umwandeln Sie hnelt der Datei loginfo da sie bei einer R ck bertra gung aufgerufen wird aber im Gegensatz zu den Anweisungen in der Datei loginfo kann sie Aktionen ausf hren welche die betreffende Datei ndern Um Bilder und Archivdateien als Bin rcode zu behandeln k nnte die Datei cvswrappers etwa so aussehen gif kb jplelg kb png kb gz kb ta kb zip kb Hierdurch wird automatisch kb an alle CVS Befehle angeh ngt die auf den angegebenen Filter passen Die Option k verhindert dass CVS die Schl ssel worterweiterung verwendet Der Schalter b markiert eine Bin rdatei und deaktiviert die M glichkeit Text Diffs f r diese Datei zu erstellen Manchmal m ssen Sie im Web mit externen Kommandozeilenwerkzeugen kommunizieren Viele UNIX Programme erwarten die Eingabe ber die Stan dardeingabe und geben die Ergebnisse der Berechnung ber die Standardaus gabe aus z B sort Die einfachste M glichkeit Eingaben weiterzuleiten und Ausgaben aus dem Programm zu lesen bieten popen und PHP Streams popen ffnet eine einseitig gerichtete Pipe zu einem Programm ber welche Sie Daten an seine Standardeingabe bert
208. ame array gt lt array length 3 gt lt number gt 1 lt number gt lt number gt 2 lt number gt lt number gt 3 lt number gt lt array gt lt var gt lt var name hash gt lt struct gt lt var name foo gt lt string gt bar lt string gt lt var gt lt var name baz gt lt string gt fubar lt string gt lt var gt lt struct gt lt var gt 344 Pearson A ADDISON WESLEY Education Datenaustausch mit WDDX lt struct gt lt data gt lt wddxPacket gt Listing 7 6 Beispiel f r ein WDDX Paket 7 3 6 PHP und WDDX Da WDDX zur Darstellung der Datenstrukturen XML verwendet m ssen Sie PHP sowohl mit XML als auch mit WDDX kompilieren um es zu verwenden Danach stehen Ihnen folgende Funktionen zur Verf gung wddx_serialize_value wddx_serialize_vars wddx_packet_start wddx_add_vars wddx_packet_end wddx_deserialize Mithilfe dieser Funktionen k nnen Sie PHP Variablen in WDDX Pakete seria lisieren und die WDDX Pakete deserialisieren 7 3 7 Die WDDX Funktionen Die WDDX Funktionen bieten Ihnen drei M glichkeiten ein Paket zu kon struieren Die einfachste Methode ist die Verwendung von wddx_serialize_ value Diese Funktion besitzt eine Variable und einen optionalen Kommen tar und erzeugt hieraus ein WDDX Paket var This is a string print wddx_serialize_value var This is a comment Das ist schon alles Dieser Programmabschnitt gibt das folgen
209. anach gehen wir auf die fortgeschrittene 367 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern API Funktionalit t von Zend ein Alternativ k nnten wir auch versuchen die Funktionalit t das Design Tipps Tricks usw als Ganzes zu erl utern um Ihnen einen Gesamteindruck zu verschaffen bevor wir Sie in die Praxis entlassen Dies ist zwar das bessere Verfahren da es keine groben H ckereien erfordert doch es kann auch sehr frustrieren und au erdem sehr energie und zeitaufwendig sein Deshalb haben wir uns f r den direkten Ansatz entschieden Auch wenn dieses Kapitel versucht soviel Wissen wie m glich ber die innere Funktionsweise von PHP zu vermitteln sollten Sie bedenken dass es unm g lich ist einen vollst ndigen Leitfaden f r die Erweiterung von PHP zu geben der in allen F llen immer zu 100 funktioniert PHP ist ein solch gro es und komplexes Paket dass seine innere Funktionsweise nur dann verstanden wer den kann wenn Sie sich mit ihm durch praktische Erfahrung vertraut machen Deshalb m chten wir Sie ermutigen mit dem Quellcode zu arbeiten 9 2 Was ist Zend und was ist PHP Der Name Zend bezieht sich auf die Sprachmaschine den Kern von PHP Der Begriff PHP bezieht sich auf das komplette System wie es sich nach au en darstellt Dies mag zun chst etwas verwirrend erscheinen aber es ist gar nicht so kompliziert siehe Abbildung 9 1 Um einen Webskriptinterpre
210. ange timestamp next_event_timestamp description next_event_description Angesichts der grofsen Bandbreite neuer Ereignisse wiirde dieser Pseudocode zwei Arrays ausf llen n mlich timestamp und description Demnach w rde der Timestamp f r Ereignis 1 in timestamp 0 und die Beschreibung von Ereignis 1 in description 0 gespeichert Dies ist jedoch eine suboptimale L sung denn es zeugt von schlechtem Stil zusammenhangende Elemente in zwei separaten Variablen zu verwalten Besser ist zusammenh ngende Elemente durch einen Gruppendatentyp zu erfassen entweder in einer Klasse der einzigen M glichkeit in PHP struktu rierte Typen zu generieren oder in einem assoziativen Array Assoziative Arrays haben den Vorteil dass sie sowohl per Schl ssel dem indizierenden Element in regul ren Arrays 0 1 2 3 usw als auch per Wert der informativen Komponente durchsucht werden k nnen aber keine vor definierte Struktur haben Vielmehr haben sie eine variable Struktur die quasi im Vor bergehen ge ndert werden kann Dies kann allerdings zu Daten f h ren die nicht unbedingt eine g ltige Struktur haben und umst ndlich zu ver walten sind Klassen haben den Vorteil dass ihre Struktur absolut sichtbar ist Allerdings ben tigen Sie einen vordefinierten Datentyp Wenn wir nun einen Datentyp f r den zur ckzugebenden Wert definieren sollten wir diesen Datentyp aus Konsistenzgr nden auch dazu verwenden um Ereign
211. api Enth lt den Code f r die verschiedenen Server Abstraction Layers TSRM Verzeichnis f r den Thread Safe Resource Manager TSRM f r Zend und PHP Zend Verzeichnis f r Zends Datei hier finden Sie alle API Definitionen Makros usw von Zend wichtig Alle Dateien zu er rtern die im PHP Paket enthalten sind w rde den Rah men dieses Kapitels sprengen Sie sollten sich jedoch folgende Dateien n her ansehen php h die sich im Hauptverzeichnis von PHP befindet Die Datei enth lt die meisten Marko und API Definitionen von PHP zend h die sich im Hauptverzeichnis von Zend befindet Die Datei enth lt die meisten Makros und Definitionen von Zend zend API h die sich ebenfalls im Zend Verzeichnis befindet und die API von Zend definiert 372 Pearson vy ADDISON WESLEY Struktur der Quellen Education Daneben sollten Sie sich auch einige der Dateien betrachten von denen diese Dateien abh ngen z B jene die sich auf den Zend Executor die Unterst t zung f r PHP Initialisierungsdateien und dergleichen beziehen Nachdem Sie diese Dateien studiert haben nehmen Sie sich die Zeit ein wenig im Paket herumzuwandern um sich einen Einblick in die gegenseitigen Abh ngigkei ten aller Dateien und Module zu verschaffen wie sie sich aufeinander bezie hen und insbesondere wie sie einander nutzen Dies hilft Ihnen auch sich an den Programmierstil anzupassen in dem die PHP Quellen verfasst sind Um PHP zu erweit
212. ar_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 Pearson A ADDISON WESLEY Education 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 gibt 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 int
213. aracter is 220 ns dnet it ESMTP Sendmail 8 9 3 8 9 3 Tue 26 Oct 1999 14 02 43 0200 MET HELO www profi it 250 ns dnet it Hello ww profi it 194 242 192 194 pleased to meet you MAIL FROM tobias dnet it 250 tobias dnet it Sender ok RCPT TO this user doesnt exist for sure 250 this user doesnt exist for sure Recipient ok QUIT 221 ns dnet it closing connection Connection closed by foreign host Eine bessere Idee w re zu berpr fen ob der MX Mail eXchange Host exis tiert indem Sie beispielsweise die Funktion getmxrr benutzen Dies kann die berpr fung jedoch erheblich verlangsamen wenn der DNS Server des ent 225 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien fernten Host einen langsameren Zugriff hat oder Lookups sich nicht im loka len Cache befinden Verwenden Sie diese Methode also nur mit u erster Sorgfalt Bedenken Sie dass es mehr als einen MX Host geben kann und es ausreicht wenn einer von ihnen erreichbar ist Manchmal wird noch eine weitere Methode verwendet Das PHP Skript k nnte einen Fingerzeig auf den Benutzer des entfernten Host setzen um eine Email Adresse zu berpr fen Dies funktioniert nat rlich nur wenn a ein Fingerzeigserver eingerichtet wurde und b der Benutzername der E Mail Adresse entspricht Dies geschieht nicht sehr h ufig Abbildung 5 2 zeigt die Reaktion des Programms bei einer falschen Eingabe Direkt unter dem
214. arent children new_child getattr setattr attributes type name wenn verf gbar content Mit diesen Funktionen und Variablen k nnen Sie alle verf gbaren Informatio nen ber einen Knoten ermitteln Sie k nnen auf seine Attribute seine Toch terknoten sofern vorhanden und den Elternknoten zugreifen Dar ber hin aus k nnen Sie die Baumstruktur ver ndern indem Sie Tochterknoten hinzuf gen oder Attribute setzen Listing 7 4 zeigt wie diese Funktionen arbeiten Hierbei handelt es sich um den XML Pretty Printer den wir bereits im Expat Abschnitt erw hnt haben und der nach LibXML portiert wurde Statt die Funktionen der Bearbeitungsroutine zu registrieren wendet er je nach Knotentyp eine andere Formatierung an Jedem Knoten ist ein Typ zuge ordnet Der Typbezeichner ist eine PHP Konstante und der Quellcode dieses Beispiels zeigt die vollst ndige Liste aller Typen Mithilfe der Funktion chi1d ren welche die Tochterelemente des Knotens als Knotenobjekte zur ck gibt k nnen Sie das Dokument mehrfach durchlaufen Im Beispiel wird eine rekursive Schleife durchlaufen indem die Funktion output_node immer wie der aufgerufen wird Define tab width define INDENT 4 function output_node node depth Different action per node type switch node gt type case XML_ELEMENT NODE for i 0 i lt depth i print amp nbsp Print start element print lt span class element gt
215. as Konzept der PHP Streams wurde erst in PHP 4 0 eingef hrt und ist daher in der Version 3 x nicht verf gbar Auf UNIX Systemen k nnen Sie diese Beschr nkung umgehen indem Sie direkt auf die UNIX Ger te dev stdin dev stdout oder dev stderr zugreifen Dies funktioniert nat rlich nur auf Sys temen mit g ltigen Ger ten F r die meisten UNIX Systeme trifft dies zu auf Windows wiederum nicht Wenn Sie versuchen mit CVS alle Ihre Dateien eines Website Projektes zu ver walten d h nicht nur den Quellcode sondern auch Bilder Archive Flashs usw werden Sie bald feststellen dass es mit bin ren Dateien einige Ein schr nkungen gibt Einen Text Diff zu erstellen macht bei bin ren Daten kei nen Sinn In der Regel ist es f r Sie uninteressant welche Bits sich in einer Bilddatei ge ndert haben Wenn Sie alle Dateien als ASCII Code behandeln kann CVS tats chlich Pro bleme hervorrufen denn einige Zeichenfolgen werden von CVS als Schl ssel w rter betrachtet z B Id Basic_Web Application Strategies xml v 1 5 1999 12 15 15 49 55 tobias Exp Diese werden bei der Ubertragung zu Server durch die entsprechenden Lang formen ersetzt was bei bin ren Daten zu einigem Durcheinander f hren k nnte 246 Pearson A ADDISON WESLEY Education Versionsverwaltung mit CVS Sie k nnen zwar manuell die Option b angeben wenn Sie mit cvs add eine Datei hinzuf gen aber dies wird bald umst ndlich zu verwenden und einzu h
216. at sie die Version 1 0 wieder Sie wird im Verzeichnis f api abgelegt 240 Pearson A ADDISON WESLEY Education Versionsverwaltung mit CVS Das Konzept der Versionszweige ist etwas komplizierter aber Sie k nnen es sich wie strengere Tags vorstellen Wenn Sie eine st rkere Trennung von den beiden Codebahnen haben m chten die sich trotzdem noch auf dasselbe Pro jekt beziehen w rden Sie genaugenommen zwei separate Versionszweige erzeugen Auf unser Beispiel bezogen gehen wir einmal davon aus dass John und Jane zwei separate Versionen pflegen m chten eine f r die Entwicklung ihrer API und eine stabile Version so wie bei der Entwicklung des Linux Kernels Ein neuer Versionszweig wird mithilfe des Befehls cvs tag b erzeugt Um einen Entwicklungszweig mit der aktuellen Codebasis zu generieren f hrt Jane folgenden Befehl aus jane dev home jane f api gt cvs tag b dev Der neue Versionszweig erh lt den Namen dev Um eine lokale Kopie dieses Zweiges zu erzeugen braucht Jane ihn nur von CVS auslesen wie sie es bei einer mit Tag gekennzeichneten Version tun w rde jane dev home jane f api gt cvs checkout r dev f api Hier wird der Unterschied zwischen normalen mit Tag gekennzeichneten Dateien und Dateien eines Versionszweiges deutlich Alle Befehle die Jane zuk nftig ausf hrt betreffen nur diesen Zweig und haben keine Auswirkung auf den stabilen Hauptzweig Alle Daten werden im Zweig dev aktualisiert u
217. atei README im Verzeichnis ext java nachlesen Sobald Sie in PHP eine Java Unterst tzung haben ist die Syntax vergleichbar mit jener f r den Aufruf der COM Komponenten Tats chlich nutzen beide eine erweiterte interne Zend Funktion die sogenannte Objekt berladung berla dung bedeutet im Bereich der Softwareentwicklung dass ein Konstrukt je nach Kontext unterschiedlich reagieren kann Funktions berladung bedeutet demnach dass eine Funktion je nach Anordnung oder Typ der Argumente unterschiedlich sein kann In C gibt es beispielsweise zwei Funktionen deklariert die in etwa folgen derma en aussehen 255 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien void add int Left int Right void add double Left double Right Je nachdem ob Sie einen int oder double Wert an add bergeben wird die eine oder die andere Funktion aufgerufen In der Regel versuchen Program mierer jedoch solche Mehrdeutigkeiten zu vermeiden da sie bei der Fehler suche zu einem Alptraum werden k nnen Die Zend Engine erm glicht intern eine hnliche Funktions berladung und zwar zur Realisierung der Objekt berladung Je nach Kontext z B des Klas sennamens kann ein Objekt ganz unterschiedliche Bedeutungen haben Es kann eine normale vom Benutzer definierte Klasse sein oder aber auch etwas sehr viel Anspruchvolleres wie etwa eine COM oder Java Schnittstelle hnlich wie bei COM wird ein neues Java Obj
218. aten RDF Spezifikation 308 Mitgliedsfunktion Syntax 82 Mod_Perl im Vergleich zu PHP 350 356 mod_rewrite Apache Modul 171 Modulstruktur 384 multi tier applications support 251 Musone Mark BizChek com 349 N Namensschemata 47 Netzwerkschnittstelle 142 Nielsen Jakob 216 o Objekte 417 Objekte erzeugen 418 objektorientierte Programmierung versus prozedurale Programmierung 75 OFB Output Feedback 202 441 Pearson Education offene Standards 358 optionale Parameter 396 P Parameter 406 Passwortdateien 231 pear Verzeichnis 372 Perl im Vergleich zu PHP 351 356 Perm Klasse PHPLib 278 PGP 195 PHP Authentisierung 207 im Vergleich zu Java 255 PHP 3 0 Klassen 80 Speicherbereinigung 78 PHP 3 0 Klassen versus PHP 4 0 Klassen 80 PHP Normal Form 220 226 php h Datei 372 384 php4 Verzeichnis 372 PHP basierte Authentisierung 273 phpIRC 117 PHPLib 175 Anpassung 259 Authentisierung 207 PHP Streams 245 PHP Updates 352 PHP Variablen 191 physikalische Analyse des Textes 36 Plugins 153 polymorphe Programme 119 Portierbarkeit 260 POST 191 Pretty Good Privacy PGP 195 ProcessingInstruction Knoten DOM 330 Profiling 148 Programmentwicklung 129 Programmierstil guter 37 Projekte 129 Projektstruktur 229 Projektverwaltung 229 Prolog XML Dokumente 312 Protokollmeldungen CVS 248 442 A ADDISON WESLEY Stichwortverzeichnis prozedurale Programmierung versus objektorientierte Programmierung 75
219. ausf 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 urspr nglichen 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 w nschenswert sein die an einem Parameter vorgenommene nderung 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 Pearson vy ADDISON WESLEY Education Assoziative Arrays Wie Sie hier sehen ist hier nur ein Zeichen anders das Ampersand 8 das im vorherigen Programmcode fehlte Dieses einem Funktionsparameter voran gestellte Zeichen gibt an dass er per Referenz bergeben wurde Hinweis Um ein Ampersand 8 einzuf gen m ssen Sie nicht die Zeile ndern in w
220. ay this gt auth einrichten Dieses assoziative Array muss mindestens zwei Elemente enthalten die ein deutige Benutzerkennnummer uid und den vom Benutzer eingegebenen Benutzernamen uname Wenn Sie mit der Klasse Perm Berechtigungsebenen einrichten m chten mehr dazu sp ter m ssen Sie ein weiteres Element einrichten n mlich this gt auth perm Dieses Element sollte eine Liste aller Berechtigungen ent halten die der Benutzer hat wobei die einzelnen Berechtigungen durch ein Komma ohne Leerzeichen voneinander getrennt sind z B admin oder author editor In der Regel wird diese Liste aus demselben Speichermedium ausgelesen aus dem Sie auch die Benutzerdaten erhalten in unserem Beispiel die MYSQL Datenbank Wenn die Authentisierung fehlschl gt muss die Funktion false zur ckgeben und die Funktion auth_loginform wird erneut aufgerufen Haben Sie bemerkt dass wir this gt auth uname eingerichtet haben ungeachtet dessen ob die Authentisierung erfolgreich war Das Array this gt auth ist eine Session Vari able und bleibt daher ber mehrere Anmeldeversuche hin erhalten In der Funktion auth_loginform berpr fen wir auch ob der Benutzernamen bereits angegeben wurde und fiillen das Anmeldeformular dementsprechend aus 278 Pearson A ADDISON WESLEY Education Authentisierung Nachdem sich der Benutzer in Ihrer Anwendung korrekt angemeldet hat wissen Sie genau mit wem Sie es zu tun haben Zur Verwaltung der
221. b entschloss man sich eine Variable f r das include Verzeichnis zu erzeugen und bei der Einbindung der Headerdateien nur absolute Pfade zu verwenden In PHP 3 0 war es au erdem schwierig benutzerspezifische Erweiterungen zu integrieren MarketPlayer com hat PHP 4 0 bereits getestet und ist mit die ser Version sehr viel gl cklicher Aber solange die Betatestphase noch nicht abgeschlossen ist ist eine Einsatz auf Produktionsservern noch nicht zu emp fehlen Derzeit verwendet MarketPlayer com die Version 3 0 12 Bei Betrachtung aller Aspekte konnte MarketPlayer com keine Beschr nkung durch fehlende Komponenten in PHP feststellen Es besteht sicherlich Inte resse an einem Tool zur Fehlersuche das PHP bedient sofern dies jemand entwickelt In unmittelbarer Zukunft wird jedoch eher ein einfacherer Mecha nismus zur Erweiterung der Funktionalit t ben tigt bei dem kein Overhead durch einen d1 Aufruf entsteht oder der PHP Quellcode direkt modifiziert werden muss 8 3 5 Bew hrung im Alltag Die Anwendungen von MarketPlayer com reichen von einzelnen Skripten bis hin zu kompletten Websiteverwaltungspaketen Insgesamt gibt es derzeit mindestens 10 000 Programmzeilen in PHP und f r das n chste Quartal sind weitere 40 000 geplant Als Teil des Entwicklungsprozesses wurde bliche Funktionen zu eingebetteten Funktionen die in C realisiert wurden und deren C Code schlie lich in Bibliotheken integriert wurde die von niedrige ren Integratore
222. ben Umlaute und Anf hrungszeichen stellt optional die k rzeste und l ngste Zeichenfolge fest is_email Pr ft ob eine Zeichenfolge eine syntaktisch g ltige Email Adresse ist siehe sp ter die Er rterung ber die Grenzen dieser Funktion contains_bad_words Pr ft ob eine Zeichenfolge W rter enth lt die im Array bad_words innerhalb der Funktion definiert sind Dies ist hilfreich f r schwarze Bretter Diskus sionsr ume usw wo Sie Beleidigungen vermeiden wollen contains_phone_number Pr ft ob eine Zeichenfolge Telefonnummern enth lt d h Sequenzen von 10 und mehr Ziffern die durch Klammern Leerzeichen Bindestriche oder Schr g striche unterteilt sein k nnen Tab 5 1 berpr fungsfunktionen f r Zeichenketten aus String_Validation inc php3 berpr fung einer Email Adresse Die berpr fung einer Email Adresse ist ein bliches Problem In unserem Ansatz berpr fen wir die syntaktische Richtigkeit mit folgendem regul ren Ausdruck ret ereg La z0 9_I tLa z0 9_I N IH N a z 2 4 string 224 Pearson A ADDISON WESLEY Education Die PHP Normal Form Muss einen definierten Satz von Zeichen vor dem Zeichen enthalten Ein Zeichen Ein Hostname mit einer Mindestl nge von zwei Zeichen Eine Dom ne der obersten Ebene mit einer Mindestl nge von zwei Zei chen In den meisten F llen reicht diese berpr fung aus Aber es ist auf keinen
223. bereitung Immer mehr kommerzielle Anbieter springen auf den Zug auf PHP wird auf Webservern integriert zum Beispiel C2 s Stronghold und Linux Distributio nen Eine neue Firma namens Zend Technologies wurde gegr ndet die kom merzielle AddOns und Unterst tzung f r PHP entwickelt Eine lange Liste von gro en Websites benutzen PHP ebenso wie Hunderttausende kleiner bis mittlerer Websites F r uns Autoren begann dieses Buch im Juni 1999 als New Riders Publishing mit der Bitte an uns herantrat ein Buch ber das erweiterte PHP zu schreiben Die Idee ein PHP Buch zu schreiben geisterte bereits seit einiger Zeit in unse ren K pfen herum und das Angebot von New Riders kam sehr willkommen Nach ber 1 500 Emails 500 berarbeitete Dateien und unz hligen Stunden im IRC waren wir schlie lich fertig Es war Schwerstarbeit aber ich glaube das Ergebnis ist mehr als nur ein Referenzhandbuch Wir haben uns nicht darauf beschr nkt einen blo en berblick ber die PHP Funktionen zu geben sondern versucht die Konzepte zur Entwicklung von Webanwendun gen zu erl utern Die Entwicklung vom unerfahrenen Programmierer der keine oder nur eine geringe fachliche Ausbildung hat bis hin zum Software Entwicklungsexper ten geschieht in mehreren Schritten Der Programmierer beginnt seine Karri ere als Lehrling Zu diesem Zeitpunkt interessiert er sich in der Regel nicht f r Programmierstile Planung oder Testphasen unleserlicher Code fehl
224. bewert Beachten Sie die Verwendung der Konstruktor und Destruk toraufrufe am Ende M glicherweise ist es nicht notwendig es auf diese Weise zu tun da es sich hier um separate Werte handeln sollte ist die Zuwei sung wahrscheinlich sicher Aber diese Vorgehensweise ist absturzsicher zval function_name zval retval if ZEND_NUM_ARGS 1 zend_get_parameters_ex 1 amp function_name gt SUCCESS WRONG_PARAM_ COUNT if function_name gt type IS STRING CLS_FETCH zend_error E_ERROR Function requires string argument 431 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern if call_user_function_ex CG function_table NULL function_name amp retval 0 NULL 0 SUCCESS zend_printf We have i as type lt br gt retval gt type zend_error E_ERROR Function call failed return_value retval zval_copy_ctor return_value zval_dtor retval lt php dlt call_userland so function test_function print We are in the test function lt br gt return hello return_value call_userland test_function print Return value return_value lt br gt gt Listing 9 16 Aufruf von Benutzerfunktionen XY Netscape ojx File Edit View Go Communicator Help We are in the test function We have 3 as type Return value hello Abbildung 9 11 Aufruf von Benutzerfunktionen
225. bietet eine separate API f r diese Typen sie werden ber Hash Tabellen gespeichert Hinweis Um die Komplexit t in den folgenden Programmbeispielen zu reduzieren arbeiten wir zun chst nur mit einfachen Typen wie Integer Sp ter werden wir die Erstellung anspruchvollerer Typen er rtern 9 5 PHPs automatisches Erstellungssystem PHP 4 0 verf gt ber ein automatisches Erstellungssystem das sehr flexibel ist Alle Module befinden sich in einem Unterverzeichnis des Verzeichnisses ext Neben seinen eigenen Quellen umfasst jedes Modul eine M4 Datei siehe z B www gnu org manual m4 html_mono m4 html zur Konfiguration und eine Makefile in Datei die f r die Kompilierung zust ndig ist die Ergebnisse von autoconf und automake siehe z B http sourceware cygnus com autoconf autoconf html und http sourceware cygnus com automake automake htm Beide Dateien werden zusammen mit cvsignore automatisch von einem klei nen Shellskript namens ext_ske generiert das sich im Verzeichnis ext befin det Sein Argument gibt den Namen des Moduls an das Sie erstellen m ch ten Anschlie end erzeugt das Shellskript ein Verzeichnis desselben Namens zusammen mit den entsprechenden config m4 und Makefile in Dateien Nach und nach l uft folgender Prozess ab root dev usr local src php4 ext gt ext_skel my_module Creating directory Creating basic files config m4 Makefile in cvsignore done 375 Pearson A ADDISON WESLEY Educa
226. bliothek 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 Pearson A ADDISON WESLEY Education 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 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 Pearson A ADDISON WESLEY Education Verkn pfte Listen find a free node for i 0 i lt count tree_array i retrieve node from array node tree_array i is it in use if node gt free no it is not in use allocate it node gt free
227. bt jedoch im Speicher resident und ben tigt eigenen RAM Auf Intel x86 Systemem die mit Linux Apache und PHP 4 0 ausgestattet sind k nnen sol che Prozesse jeweils bis zu 2 MB gro sein Ein kleiner Server mit minimalem RAM w rde bald vom Swap Speicher ausgef hrt was seinen sicheren Tod bedeutet Haben Sie schon ber die Folgen von residenten Prozessen nachgedacht Wenn nicht denken Sie daran es das n chste Mal zu tun Werten Sie jede Situ ation komplett aus 144 Pearson vy ADDISON WESLEY Education Schnittstelle zum Netzwerk Hinweis Der Swap Speicher ist ein virtueller Speicher der den RAM erweitern soll den physikalischen Speicher auf einem Rechner Der Swap Speicher wird auf einer Festplatte abgelegt was extrem langsam ist Wenn der physikalische Speicher vollst ndig belegt ist beginnen moderne Be triebssysteme damit neuen Speicher in dem langsamen Swap Speicher zu belegen Sobald viele Clients gleichzeitig auf denselben Chatserver zugrei fen und dabei den gesamten physikalischen Speicher verbrauchen werden Daten in den Swap Speicher geschrieben Nun muss das Betriebssystem st ndig Teile des RAM gegen Teile aus dem Swap Speicher austauschen da Programme nicht vom Swap Speicher aus gestartet werden k nnen Dies setzt einen Teufelskreis in Gang Das Betriebssystem bemerkt dass ein Prozess im Swap Speicher ausgef hrt werden muss und l dt es in den RAM muss daf r aber einen anderen Prozess aus dem
228. bung der Zuordnung Zur ckgegeben wird bei den Funktionen nichts Die Namen sind sprechend Sprechend ja aber auch klar add_an_event ist sicherlich aussagekr ftig aber dennoch nicht sehr gl cklich gew hlt f r eine solche Funktion Vor allem weil die Funktion f r den globalen Zugriff gedacht ist Dies bedeutet es ist das Hauptelement f r die API Dementsprechend sollte es durch einen Pr fix als zur API zugeh rig gekennzeichnet sein Wie k nnte dieses Pr fix hei en calendar und scheduler sind gute Alternati ven in diesem Beispiel verwenden wir calendar siehe Listing 1 11 void calendar_add_ an _event int day int month int year int hour int wminutes int seconds string description void calendar delete _an event int day int month int year int hour int wminutes int seconds Listing 1 11 Umbenannte Funktionsprototypen Nun haben wir ein Pr fix aber die eigentlichen Namen sind noch unbefriedi gend Das an in calendar_add_an_event und genauso in calendar_delete_an_ event ist eigentlich berfl ssig es ist ein Relikt aus der Zeit als man zu sprechende Namen w hlte Eine gute Taktik ist ganz allgemein bei der Aus wahl von Funktionsnamen W rter wie an bzw ein wegzulassen Meis tens nehmen diese W rter nur Platz weg machen aber keinen gro en Unter schied weil sie keine erl uternde Funktion haben Bei der Definition von Variablennamen sollten Sie solche W rter tunlichst vermeiden
229. buted Data eXchange bietet Mittel um Programmierspra chenstrukturen Objekte Klassen Arrays usw ber das Internet auszutau schen Wir erl utern warum dies sinnvoll ist und zeigen wie Sie dies in Ihrer eigenen Anwendung realisieren k nnen 7 1 Wissensreprasentation In Firmenumgebungen hat sich in den letzten Jahren ein klarer Trend abge zeichnet weg von der produktbasierten Planung hin zu der kundenorientier ten Strategie Mit diesem Trend erlangte eine neue Technologie grofe Beliebt heit und Erfolg die Wissensrepr sentation F r eine Firma die einen strategischen Vorteil gegen ber ihren Mitbewerber haben m chte ist es erforderlich das Firmenwissen auf eine Weise zu organi sieren in der es f r jedermann jederzeit leicht zug nglich ist Mit dem Auf kommen von Firmen Intranets wurde dieses Thema aktueller denn je In herk mmlichen Intranets sind Informationen h ufig schwer zu finden da sie auf vielen verschiedenen Seiten verteilt sind und von unterschiedlichen 287 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Quellen kommen Die tats chlich vorhandenen Informationen sind h ufig unbrauchbar da sie nicht indiziert und nicht in kleinere logischere Einheiten unterteilt sind was die Suche erschwert Wie kann eine Firma diese Probleme effizient l sen Der Schl ssel liegt in der richtigen Wissensverwaltung Viele Firmen bieten hierf r anspruchsvolle L sungen Sie sollten abe
230. ch ausf hrlich besprechen m chten wir hier nicht n her darauf eingehen Wenn Sie weitere Einzelheiten ber die Ver wendung von Schablonen erfahren wollen lesen Sie Kapitel 5 Grundle gende Webanwendungsstrategien 3 5 7 Schnittstelle zum Programmcodeentwickler Die Bereitstellung einer Schnittstelle f r andere Entwickler istin der Regel mit dem Begriff API Application Programming Interface verkn pft Eine API also eine Anwendungsprogrammschnittstelle wird normalerweise von Bib liotheken wie phpIRC bereitgestellt aber nicht von vollst ndigen Program men Programme die sich durch einen Programmierer erweitern lassen sind jedoch sehr viel erfolgreicher als Programme die wie vorliegend verwen det werden m ssen Im Fall von PHP Anwendungen kann nat rlich jeder den Quellcode ndern einige Leute schrecken jedoch davor zur ck ein kom plexes System zu analysieren und nderungen darin durchzuf hren Daher muss das Programm selbst einige M glichkeiten zur Erweiterung aufzeigen Hinweis Wir unterscheiden hier zwischen Anwendung und Biblio thek Unter Bibliothek verstehen wir Programme die nicht eigenst n dig ausgef hrt werden k nnen und sich in der Regel leichter erweitern las sen als Anwendungen Anwendungen bestehen aus einem vollst ndig geschlossenen System Finden Sie heraus wie Sie herk mmliche Programme erweitern k nnen Pr fen Sie beispielsweise bei Ihrem bevorzugten Textverarbeitu
231. cherbereich 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 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
232. chtung dass dasselbe passiert wie bei HIML mehrere konkurrierende und nicht kompatible Pro gramme entstanden XML sollte zu SGML kompatibel sein Die Mitglieder des Entwicklungs komitees waren auch in den SGML Bem hungen einbezogen und inte grierten viele Daten aus SGML Systemen Die Entwicklung f hrte zu einer klaren Spezifikation die am 10 Februar 1998 vom World Wide Web Consortium W3C als Empfehlung der Extensible Markup Language XML 1 0 verabschiedet wurde XML unterscheidet sich von SGML XML verzichtet auf viele der komplexeren und weniger verwendeten Funktionen von SGML und erzeugt eine neue reduzierte SGML basierte Anwendung Da es eine Untermenge von SGML darstellt k nnen Sie ein XML Dokument mit jedem SGML kompatiblen Sys tem lesen Jedes g ltige XML Dokument ist ein g ltige SGML Element XML unterscheidet sich von HTML Es vermeidet nicht nur die schlechten Kon zepte von HTML sondern hat auch eine andere Syntax als HTML Zudem ist XML Unicode f hig Tags Attribute und Inhalte k nnen in jeder Zeichenket tenkodierungen enthalten sein die von Unicode definiert wird Sehen wir uns einen kleinen Ausschnitt aus dem Quellcode dieses Buchs an lt title gt Cutting Edge Applications lt title gt lt abstract gt lt para gt If you realize that all things change 1 there is nothing you will try to hold on to lt para gt lt abstract gt In diesem Beispiel sehen Sie die Verwendung von Tags mit denen e
233. cket_root und phpPolls_root in diesem Beispiel sollten in einer zentralen Konfigurationsdatei gespeichert sein und globale Optionen f r das gesamte Projekt enthalten Diese Konfigurationsdatei sollte nur diejenigen Optionen auff hren die von allen Quelldateien unabh ngig von den anderen ben tigt werden und daher global zur Verf gung gestellt werden m ssen Zu diesen Optionen k nnen Umgebungsoptionen geh ren wie z B der Name des Standorts die Speicherorte des Dateisystems usw Bleiben Sie auf dem allgemeinen Pfad Wenn Sie die Konfigurationsdatei aus einem Unterverzeichnis einf gen ver wenden Sie stets relative Pfade So stellen Sie sicher dass sich Ihr Projekt in Ihrem Dateisystem und den Systemen des Benutzers frei bewegen kann Ver lassen Sie sich nicht darauf dass spezielle Bedingungen Ihrer Entwicklungs umgebung auch in allen eingesetzten Umgebungen vorhanden sind Was immer Sie allgemein halten k nnen sollten Sie allgemein halten 1 5 Schreiben einer Dokumentation Neben der Kommentierung und Strukturierung ist die Dokumentation ein wichtiger Teil der Entwicklungsarbeit Die Dokumentation eines Projektes ist m glicherweise der erste Teil des Projekts den Ihr Kunde sieht und der erste Eindruck z hlt Professionell entwickelte Dokumentationen die mehr als das obligatorische Befolgen Sie die Installationsanweisungen in der README Datei enthal ten sollte Ihnen in Fleisch und Blut bergehen So wie Sie ein gut g
234. ckgabewert auf einen leeren String RETVAL_FALSE Setzt den R ckgabewert auf den booleschen Wert false RETVAL_TRUE Setzt den R ckgabewert auf den booleschen Wert true Tab 9 15 Vordefinierte Makros zum Setzen des Riickgabewertes einer Funktion Komplexe Typen wie Arrays und Objekte k nnen ber array_init bzw object_init zur ckgegeben werden oder auch ber die entsprechenden 425 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Hash Funktionen zu return_value Da diese Typen nicht von einfachen Infor mationen konstruiert werden k nnen gibt es f r sie keine vordefinierten Makros 9 18 Ausdrucken von Informationen H ufig ist es n tig Meldungen im Ausgabestrom Ihres Moduls auszugeben genau wie bei der Verwendung von print in einem Skript PHP bietet Funk tionen f r ganz allgemeine Aufgaben wie etwa das Ausdrucken von War nungen Erzeugen von Ausgaben f r phpinfo usw Die folgenden Abschnitte geben weitere Einzelheiten Beispiele dieser Funktionen finden Sie auf der CD ROM 9 18 1 zend_printf zend_printf funktioniert wie der Standard printf au er dass es in den Ausgabestrom von Zend schreibt 9 18 2 zend_error zend_error kann zur Generierung von Fehlermeldungen verwendet werden Diese Funktion hat zwei Argumente Das erste gibt den Fehlertyp an siehe zend_errors h Das zweite ist die eigentliche Fehlermeldung zend_error E_W
235. clear mouse bitmap for x 0 x lt MOUSE_X_SIZE x for y 0 y lt MOUSE_Y SIZE y mouse_bitmap x 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 Pearson A ADDISON WESLEY Education 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 f r die Darstellung statistischer Daten X 5 X 4 Y 3 4202 02 Element mit den Indizes 4 3 3 X 2 Y 5 2 Aare Br O Element mit den Indizes 2 5 Abbildung 2 12 Eine zweidimensionale Array Struktur 2 6 2 Variable Argumente Bei der Verwendung von Funktionen ist es h ufig notwendig mehr als einen Wert zur ckzugeben oder die geg
236. ct Document class instance doc new Document file xml Qutput the root element s name printf Root element s lt p gt doc gt documentElement gt tagName Get all elements below the root node 331 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie node_list doc gt getElementsbyTagName Traverse the returned node list for i 0 i lt node_list gt length i Create node node node_list gt item i Output node name and value printf Node name s lt br gt node gt nodeName printf Node value s lt br gt node gt nodeValue Element book Dokumententyp Element title Text Anwendungen der Spitzentechnologie Abbildung 7 5 DOM Struktur Element para Attribut Sprache Text Absatz beispiel 7 2 8 LibXML ein DOM basierter XML Parser Seit der Version 4 0 ist in PHP ein neuer XML Parser intergriert LibXML Die ser Parser wurde urspriinglich von Daniel Veillard fiir das Gnome Projekt entwickelt um einen DOM fahigen Parser fiir einen komplexeren Datenaus tausch zu erhalten Uwe Steinmann integrierte ihn schlie lich in PHP Auch wenn die interne Darstellung eines Dokuments in LibXML jener der DOM Schnittstelle hnelt w re es irref hrend LibXML als einen DOM Par ser zu bezeichnen Die Analyse und die Verwendung des DOMs geschehen zu zwei ganz verschiedenen Zeitpunkten Sie k nnte
237. ctured Information Standards offiziell die Pflege von DocBook Als XML zunehmend popul rer wurde schrieb Norman Walsh eine inoffizielle XML Version 3 1 Derzeit gibt es Bem hungen diese in eine offizielle Version umzuwandeln Wahrscheinlich kommt DocBook 5 sowohl als SGML als auch als XML Version heraus Als wir begannen dieses Buch zu schreiben stand f r uns fest dass wir ein offenes Format wie XML verwenden wollten Wir entschieden uns f r die DocBook DTD da sie alle Funktionen besitzt die wir jemals brauchen w r den Hier gibt es alle Elemente die typischerweise in technischen Dokumen tationen benutzt werden und selbst einige esoterische Elemente sind vorhan den oder haben Sie jemals in Ihrem Textverarbeitungsprogramm ein Element MouseButton gesehen aus der Kurzreferenz der konventionelle Name einer Maustaste XML und DocBook bieten einige klare Vorteile f r uns Wir k nnen CVS zur Versionskontrolle sowohl f r die PHP Beispiele als auch f r die Buchdateien verwenden Die Umwandlung nach HTML ist einfach Sie l sst sich mit PHP 306 Pearson A ADDISON WESLEY PHP und XML Education oder einem Stylesheet Prozessor wie XT von James Clark bewerkstelligen Xmetal von SoftQuad bietet komfortable Bearbeitungsm glichkeiten die intuitive visuelle Bearbeitungen ber Cascading Style Sheets CSS erm gli chen und sich zur Anzeige in Autorensystemen eignen siehe hierzu Abbildung 7 3 Eie Edt View Inset Tools
238. d Verschachtelung von Tags m gliche Elementattribute Entit ten kurz die gesamte Grammatik Komplexe DTDs zu schreiben ist keine einfache Auf gabe und dar ber wurden schon ganze B cher geschrieben Da Sie sich als XML Benutzer normalerweise nicht mit dieser Aufgabe befassen m ssen gehen wir auf dieses Thema nicht n her ein Statt dessen m chten wir uns ein weiteres XML Konzept ansehen das f r Ihre t gliche Arbeit wichtiger sein k nnte XML Namensraume Sie haben verschiedene XML Anwendungen Document Type Definitions gesehen und erfahren wozu sie verwendet werden Was passiert jedoch wenn Sie ein einzelnes XML Dokument erzeugen m chten das Elemente aus zwei verschiedenen DTDs enth lt Das Element lt part gt k nnte in einer DTD beispiels weise den Teil eines Buches bezeichnen w hrend es in einer anderen DTD den Herstellungsteil kennzeichnet Ohne eine M glichkeit diese beiden Namens r ume voneinander zu trennen w rden die beiden Elementnamen kollidieren 313 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Wie k nnen diese unterschiedlichen Elemente identifiziert werden Sie m ssen dem Element einen Bezeichner zuordnen z B lt part namespace book gt oder wenn Sie Attribute vermeiden wollen lt book part gt und lt manufacturing part gt Das W3C erfuhr fr h von diesen M ngeln in XML und f hrte eine neue Spezi fikation ein Namensr ume in XML die als Empfehlun
239. d das Attribut zwar f r die strukturelle Auszeichnung 309 Pearson vy ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie eingesetzt hat aber keine Auswirkung auf die Auszeichnung selbst oder die Zeichendaten Es bietet dem Autor die M glichkeit den Leerraum wenn gew nscht zu erhalten Mit der Einf hrung von xml space reagierte das XML Komitee auf die ver schiedenen Ansichten zum Thema Leerraum Das Attribut kann zwei Werte haben preserve oder default Bei jedem Element welches das Attribut xml space preserve enth lt wird Leerraum als signifikant betrachtet und an die verarbeitende Anwendung unver ndert bergeben Der Wert default teilt der Anwendung mit dass die Standardverarbeitung angewendet werden soll Beide Standardattribute werden auf die Unterelemente vererbt solange sie nicht explizit in einem Element zur ckgesetzt werden Hinweis Ein XML Prozessor ist ein Programm das zum Einlesen von XML Dokumenten verwendet wird Der XML Prozessor erm glicht einer Anwendung auf die Struktur und den Inhalt eines XML Dokuments zuzu greifen In diesem Buch verwenden wir die Begriffe XML Prozessor und XML Parser f r dieselbe Art von Software Verarbeitungsbefehle Ein weiterer Element Typ den Sie in XML Dokumenten finden ist der Ver arbeitungsbefehl Er wird verwendet um Teile in einem Dokument zu defi nieren die nicht vom regul ren Parserprogramm interpretiert werden sollen sondern von einer
240. d der bertragung auftre ten beeinflussen nicht die Entschl sselung von benachbarten Bl cken Durch ndern des verschl sselten Textes kann der Klartext genau wie beim ECB Modus leicht ver ndert werden In der Praxis findet CBC die gr te Verbreitung TripleDES mit CBC Modus bietet Ihnen soviel Sicherheit wie Sie jemals in Ihren Webanwendungen brau chen werden 4 2 3 Integrieren Sie Fachleute in Ihr Team Wenn Sicherheit in Ihrem Projekt zu einem wesentlichen Faktor wird ist es hilfreich qualifiziertes Personal f r die Qualit tssicherung und die Sicher heits berpr fung zu haben Selbst wenn Sie ein sehr erfahrener Programmie rer sind bleiben Sie doch menschlich und als solcher k nnen Sie irren Mit einem zweiten professionellen Blick ber Ihre Schulter bei wichtigen Teilen eines Programms erhalten Sie die n tige Doppelkontrolle Leider ist es sehr schwierig qualifiziertes und nicht zu teures Personal mit Kenntnissen in Programmsicherheit zu finden Dieses Thema wird zuneh mend an den Universit ten gelehrt aber die beste Ausbildung kann fehlende Praxiserfahrung nicht ersetzen Dies gilt f r alle Berufe im Bereich neue Medien aber ganz besonders f r den Bereich der Computer und Software sicherheit Diese Schwierigkeiten lassen sich berwinden indem Sie Ihre Soft 202 Pearson A ADDISON WESLEY Education Sicherheitsaspekte ware mit einer Open Source Lizenz freigeben M glicherweise werden dann die
241. d einf gen Diese Vorgehensweise gilt f r die Erzeugung aller Variablen zval new_ variable allocate and initialize new container MAKE_STD_ZVAL new _ variable 407 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern set type and variable contents here see the following sections introduce this variable by the name new variable name into the symbol table ZEND_SET_SYMBOL EG active_symbol_ table new_variable name new_ variable the variable is now accessible to the script by using new_variable name RI Das Makro MAKE_STD_ZVAL weist mithilfe von ALLOC_ZVAL einen neuen zval Con tainer zu und initialisiert ihn mit INIT_ZVAL Gem der Realisierung in Zend zum Zeitpunkt der Bucherstellung bedeutet initializing dass der Referenz z hler auf 1 gesetzt wird und der Flag is_ref gel scht wird Dieser Prozess wird jedoch sp ter erweitert werden Deshalb sollten Sie nicht nur ALLOC_ZVAL verwenden sondern auch MAKE_STD_ZVAL im Hinterkopf behalten Wenn Sie die Geschwindigkeit optimieren m chten m ssen Sie hier nicht unbedingt den zval Container initialisieren Sie k nnen ALLOC_ZVAL verwenden was wir jedoch nicht empfehlen da es keine Datenintegrit t gew hrleistet ZEND_SET_SYMBOL tr gt die neue Variable in die Zend Symboltabelle ein Dieses Makro berpr ft ob der Wert bereits in der Symboltabelle vorhanden ist und konvertiert das neue Symbol in eine
242. das Passwort setzte sich aus dem Benutzernamen und der Endung nsi zusammen doensi ber 24 Stunden konnten sich Benutzer im System anmelden indem sie die Passw rter anderer Kunden eingaben Sie konnten das Passwort ndern Mails lesen die zu diesem Account geschickt wurden und selbst Mails im Namen dieser Kunden verschicken Beide Sicherheitsprobleme entstanden nicht durch Fehler die durch die Unzul nglichkeit der Programmiersprache hervorgerufen wurden sondern durch eine schlechte Programmierung PHP ist an sich sehr sicher Wir haben niemals von L chern wie ASP s DATA Fehlern geh rt Bei diesem im Juni 1998 entdeckten Ph nomen konnte jeder Benutzer den Quellcode von ASP Skripten im Web ansehen indem er einfach die Zeichenkette DATA an die URL der Datei anh ngte z B www server com script asp DATA ein Alp traum f r jeden Softwareentwickler Ein fr heres nur Windows betreffendes Sicherheitsproblem entstand als Benutzer auf die Quelle zugreifen konnten indem Sie eine URL wie www server com script asp angaben beachten Sie den Punkt am Ende Nach Auftauchen des DATA Fehlers konnte man auf eini gen Versionen des Personal Webserver f r Windows die Form www server com tan usw benutzen um nicht nur auf den Dokumentenstammbaum des Webservers sondern auf die gesamte Festplatte zugreifen 185 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Bei Verwendung einer Skriptspr
243. dass eine einfache Komprimierung bereits durch 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 21 1 18 0 2 1 18 0 L 18 0 21 1 Das erste Element gibt stets den Z hler an w hrend das zweite Element das Datenelement darstellt Um dies wieder zu dekomprimieren miissen 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 Elementen in einer Zeile mehr Ausgabedaten erzeugt als urspr nglich Einga bedaten vorhanden waren Durch Speichern vieler Elemente die einen Daten z hler von Eins haben wird dieser Algorithmus damit schnell ineffektiv Di
244. de wird sich dies als u erst vor teilhaft erweisen Sie miissen lediglich eine Schleife durch das Array laufen lassen Im Beispiel verwenden wir dieses Verfahren um mit trim f hrende und angeh ngte Leerzeichen aus den Formulardaten zu entfernen Tipp Im Gegensatz zu PHP 3 0 unterst tzt PHP 4 0 mehrdimensionale Arrays in Formularen Damit k nnen Sie tats chlich alle Formularvariab len einschlie lich select multiple Felder in einem Array verwenden 5 1 1 Verwendung von HTML Schablonen M glicherweise haben Sie bemerkt dass das Formularbeispiel keinen HTML Code enth lt Genaugenommen haben wir HTML in eine separate Datei namens PHP_Normal_Form inc htm ausgelagert Hierbei handelt es sich um eine Vorlagendatei welche die gesamte HMTL Struktur und einige Schablonen Tags wie etwa HEADER enth lt Vielleicht kommt Ihnen dies bekannt vor weil Sie bereits mit der Klasse FastTemplate gearbeitet haben EasyTemplate l sst die fortgeschrittenen Funkti onen von FastTemplate weg es stellt lediglich eine schnelle Schnittstelle zur Verf gung um skalare Tags in Schablonen durch einen Zeichenkettenwert zu ersetzen Da es sich auf diese einfache Aufgabe beschr nkt bietet es eine Leis tungssteigerung von mehr als 120 im Vergleich zu FastTemplate f r die syn taktische Analyse unserer Formularschablone Die von uns entwickelte Schablonenklasse hat nur drei Funktionen assign easy_parse und easy_print die in der folgenden
245. de Funktionen umfassen Echtzeit Chat keine verz gerte Weiterleitung von Nachrichten und kein Auffrischen 129 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel Keine clientseitige Programmierung Der Browser sollte nur reines HTML und m glicherweise JavaScript als Eingabe erhalten Netzwerkf hig Es sollte m glich sein Chat Boxen zu verkn pfen Generisch Machen Sie so wenig Annahmen wie m glich ber die Zielsys teme und f hren Sie wenig Anforderungen wir m glich ein Kein Konzeptzwang Trennen Sie Programmcode und Seitenlayout Leicht zu verwenden und zu verwalten Unbegrenzte Anzahl von Clients und Chat R umen Wenn Sie soweit gekommen sind und wissen was Ihr Programm tun soll m ssen Sie das Konzept auswerten und einen detaillierten Plan ausarbeiten und festlegen wie das Programm strukturiert werden soll Nehmen Sie sich die Zeit alle Anforderungen niederzuschreiben Es ist sehr hilfreich und sp ter eine gute Ged chtnisst tze Wenn Sie das Programm zusammen mit einem Kunden entwerfen wird dieser Schritt als Erstellen einer Spezifikation bezeichnet An diesem Punkt kann der Kunde das Layout des Programms noch beeinflussen Dies ist sehr wichtig da das Programm den in diesem Schritt angegebenen Anforderungen entspre chen muss denn ansonsten wird es vom Kunden nicht abgenommen Der Kunde hat immer recht auch wenn er unrecht hat Kunden die eine Programmentwicklu
246. de WDDX Paket aus lt wddxPacket version 1 0 gt lt header gt lt comment gt This is a comment lt comment gt lt header gt lt data gt lt string gt This is a string lt string gt lt data gt lt wddxPacket gt Hinweis Zur besseren Lesbarkeit wurde dieses Paket manuell bearbeitet Das von PHP erzeugte Paket enth lt keine Leerr ume und Einz ge 345 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Die beiden anderen Methoden serialisieren mehrere PHP Variablen in ein WDDX Element des Typs struct hnlich jenem das in Listing 7 6 gezeigt wird Die Funktion wddx_serialize_vars besitzt eine beliebige Anzahl von String Argumenten welche die Namen der PHP Variablen enthalten Als Ausgabe gibt die Funktion die WDDX Pakete als Strings zur ck Der Vorteil dieser Vorgehensweise besteht darin dass Sie mehrere PHP Variablen in einem WDDX Paket serialisieren k nnen Beachten Sie jedoch dass bei der Deserialisierung ein assoziatives Array erzeugt wird Nat rlich wurde die urspr ngliche PHP Variable dazu vorher in einen WDDX Tag struct umge wandelt Im Programmcode k nnte ein einfaches Beispiel f r wddx_serialize_ vars folgenderma en aussehen string This is a string int 42 print wddx_serialize_vars string int Die drei Funktionen wddx_packet_start wddx_add_vars und wddx_packet_ end arbeiten grunds tzlich auf dieselbe Weise Auch hier werden mehrere PHP
247. den get_module wird von Zend aufgerufen wenn das Modul geladen wird Zur Verdeutlichung stellen Sie sich einfach vor die Funktion w rde durch den di Aufruf in Ihrem Skript gestartet Sie dient dazu den Modulinformations block wieder an Zend zu bergeben um die Engine ber den Modulinhalt zu informieren Wenn Sie die Funktion get_module nicht in Ihrem dynamisch ladbaren Modul einbinden gibt Zend eine Fehlermeldung aus sobald sie versuchen darauf zuzugreifen 392 Pearson A ADDISON WESLEY Education Annahme von Argumenten 9 10 7 Einbindung aller exportierten Funktionen Schlie lich werden alle exportierten Funktion implementiert F r unsere Bei spielfunktion aus first_module sieht das folgenderma en aus ZEND_FUNCTION firstmodule zval parameter if ZEND_NUM_ARGS SUCCESS 1 zend_get_parameters ex 1 amp parameter WRONG PARAM COUNT convert_to_long_ex parameter RETURN_LONG parameter gt value val Die Funktionsdeklaration geschieht tiber ZEND_FUNCTION welche in der Funk tionseintragstabelle auf die wir bereits eingegangen sind ZEND_FE entspricht Nach den Deklarationen folgt der Programmcode zur Uberpriifung und zum Auslesen der Funktionsargumente der Konvertierung von Argumenten und der Generierung von R ckgabewerten mehr dazu sp ter 9 10 8 Zusammenfassung Im Prinzip ist dies alles mehr gibt es zur Implementierung von PHP Modu len nicht
248. den 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 La zA Z 1 input_function Diese Zeile wandelt m x b in 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 PLOT 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 a zA Z 1 in_string 121 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax prepend header create equation and append footer out_string header return o0ut_string n footer return result return out_string function create_image export this variable global color_pl
249. den nur er lesen kann nicht mehr sein eigener Boss sein der ab und zu aus dem Untergrund auftaucht um sich eine Pizza abzuholen Nein so nicht Nun muss er sich Gedanken machen ber Standards Stil und Projektverwaltung Als Dankesch n kann er vielleicht zu den normalen Arbeitsstunden zur ckkehren und sich einige Zeit freischaufeln die er f r nicht arbeitsbezogene Dinge verwendet Wer wei vielleicht kann er sogar am sozialen Leben wieder teilnehmen 5 2 1 Zusammenarbeit im Team Mit dem Internet entstand die M glichkeit ber weite Entfernungen hinweg zu kommunizieren und zusammenzuarbeiten egal wo sich der geographi sche Standort der einzelnen Teammitglieder tats chlich befand Dies er ffnet verteilten Teams neue Chancen Gro e Firmen sind heutzutage nicht mehr durch geographische Grenzen eingeschr nkt Tats chlich entwickeln viele Unternehmen Softwareanwendungen indem sie Expertenwissen aus vielen verschiedenen geographischen Regionen miteinander kombinieren F r die effektive Verwaltung der verteilten Softwareentwicklung ist eine gute Projektleitung von immenser Bedeutung Wenn ein neues Projekt gestartet wird wissen die Leute zun chst einmal nichts Sie wissen nicht was zu tun ist 229 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien und wann es zu tun ist Sie brauchen jemanden der ihre Aktivit ten koordi niert Verantwortlichkeiten zuweist und den Fortschritt und die Ergeb
250. den durch die Variable return_value bergeben die an Ihre Funktionen als Argument bergeben wer den Das Argument von return_value besteht aus einem zval Container siehe dazu die fr here Er rterung der Aufrufschnittstelle den Sie frei ver ndern k nnen Der Container selbst ist bereits zugewiesen so dass Sie f r ihn MAKE_ STD_ZVAL nicht ausf hren m ssen Statt dessen k nnen Sie direkt auf seine Mit glieder zugreifen Um die R ckgabe von Werten aus Funktionen zu erleichtern und Probleme beim Zugriff auf interne Strukturen des zval Containers zu vermeiden stehen eine Reihe von vordefinierten Makros zur Verf gung wie gew hlich Diese Makros setzen automatisch den entsprechenden Typ und Wert wie die Tabellen 9 14 und 9 15 zeigen Hinweis Die Makros aus Tabelle 9 14 werden automatisch durch Ihre Funktion ausgegeben Makro Beschreibung RETURN RESOURCE Ressource Gibt eine Ressource zur ck RETURN BOOL boo 7 Gibt einen booleschen Wert zur ck RETURN NULL Gibt Nichts einen NULL Wert zur ck RETURN _LONG Long Gibt einen Long zur ck RETURN DOUBLE Double Gibt einen Double zur ck RETURN STRING String Gibt einen String aus Der Flag duplicate gibt duplicate an ob der String mit estrdup dupliziert wer den soll RETURN_STRINGL String L nge Gibt einen String der angegebenen Lange duplicate L nge aus ansonsten verh lt sich das Makro wie RETURN_STRING Es ist j
251. den k n nen Da der thread sichere Modus von Zend noch nicht fertiggestellt ist k n nen wir ihn in diesem Buch nicht behandeln 9 4 4 Verzeichnis und Dateifunktionen Die folgenden Verzeichnis und Dateifunktionen sollten in Zend Modulen verwendet werden sie verhalten sich genauso wie ihre C Gegenst cke Zend Funktion Regul re C Funktion V_GETCWD getcwd V_FOPEN fopen V_CHDIR chdir V_GETWD getwd V_CHDIR_FILE Hat als Argument einen Dateipfad und ndert das aktuelle Arbeitsverzeichnis auf das Verzeichnis der Datei V_STAT stat V_LSTAT Istat 374 Pearson vy ADDISON WESLEY Education PHPs automatisches Erstellungssystem 9 4 5 Handhabung von Strings Strings werden von der Zend Engine etwas anders gehandhabt als andere Werte wie etwa Integer boolesche Werte usw die zur Speicherung ihrer Werte keine zus tzlichen Speicherzuweisungen ben tigen Wenn Ihre Funk tion einen String zur ckgeben soll f hren Sie eine neue Stringvariable in der Symboltabelle ein oder um etwas hnliches zu tun stellen Sie sicher dass der Speicher den der String belegen wird zuvor mit den bereits genannten e Funktionen zugewiesen wurde Dies erscheint Ihnen m glicherweise noch nicht sehr sinnvoll behalten Sie es einfach im Hinterkopf wir kommen in K rze darauf zur ck 9 4 6 Komplexe Typen Komplexe Typen wie etwa Arrays oder Objekte erfordern eine andere Behandlung Zend
252. den und Fehler finden zu k nnen Nach der Extrahierung des PHP Archivs sehen Sie eine Verzeichnisstruktur die jener in Abbildung 9 2 hnelt B C php 4 UI libs C build Id I ext 7 libs C pear C regex H sapi 4 scripts H tests H TSRM HL win32 H Zend H E E Abbildung 9 2 Grundlegende Baumstruktur der PHP Quellen Hinweis Bevor Sie den Rest dieses Kapitels durcharbeiten sollten Sie sich eine saubere nicht ver nderte Baumstruktur der Quellen von Ihrem bevor zugten Webserver besorgen Wir arbeiten mit Apache erh ltlich unter http www apache org und nat rlich mit PHP erh ltlich unter http www php net muss dies noch erw hnt werden Alternativ k nnen Sie die bereitgestellten Quellarchive von der CD ROM ver wenden die mit diesem Buch mitgeliefert wird Alle Beispiele in diesem Buch arbeiten mit den Quellarchiven von der CD ROM Dies k nnen wir nicht f r alle Versionen garantieren die Sie vom Netz herunterladen Da sich Open Source Software extrem rasch ndert k nnen bereits nderungen in den Quelldateien vorgenommen worden sein so dass die Versionen auf der CD ROM m glicherweise veraltet sind und nicht alle Funktionen besitzen die Sie brauchen Wenn Sie die offiziellen Archive von den entsprechenden Websites 371 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern nicht zum Laufen bringen k nnen
253. 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 125 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax translate input function to PHP code parsed_function parse_function function_string y GIF image 200x300 pixels Netscape Ol x File Edit View Go Communicator Help EE 9 BP ca 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 ten zuordnet durch erneute Referenz auf die Benutzereingaben Anschlie end wird die mathematische Anweisung ausgef hrt und das Ergebnis an den Anrufer zur ckgesendet Die von parse_function generierte Funktion sieht f r unser Beispiel m x b x 3 folgenderma en aus funct
254. der Pro grammcode den Sie mit DB_Sq erstellen kompakter ist weil Sie sich nicht selbst um die Fehlerbehandlung k mmern m ssen In der Standardeinstellung wird das Skript bei jedem Fehler unterbrochen Dieses Verhalten k nnen Sie steuern indem Sie die Klassenvariable Halt_On_ Error ndern die standardm ig auf yes gesetzt ist Wenn Sie dies auf report setzen gibt die Bibliothek die Fehlermeldung aus ohne das Skript zu verlas sen Sobald die Variable auf no gesetzt ist ignoriert die Bibliothek alle Fehler Dies k nnte zu unerw nschten Nebeneffekten wie beispielsweise inkonsis tente Daten f hren wenn eine fehlende Datenbankabfrage ignoriert wird Seien Sie also vorsichtig mit dieser Option In Produktionsanwendungen soll ten Fehlermeldungen informativ sein und auf die bliche und website typi schen Weise dargestellt werden Sie k nnen Ihre Fehlermeldungen auch selbst formatieren indem Sie DB Sql erweitern indem Sie eine neue Klasse generieren um die Funktion haltmsg zu berschreiben Da diese Funktion die Ausgabe aller Fehlermeldungen festlegt k nnen Sie Meldungen leicht auf folgende Weise ver ndern class test_db extends DB Sql function haltmsg msg print Database Error msg lt br gt printf MySQL said s lt br gt this gt Error 262 Pearson A ADDISON WESLEY Education Datenbankabstrahierung Die Funktion haltmsg ist jedoch nur f r die Ausgabe der Fehlermeldung zust ndig
255. der Regel verwenden wir folgende Struktur home www phpwebdev com live cgi bin htdocs htpasswd include logs home www phpwebdev com staging cgi bin htdocs htpasswd include logs home www phpwebdev com dev cgi bin htdocs htpasswd include logs 230 Pearson vy ADDISON WESLEY Education Projektstruktur Wenn Sie auf die erste Verzeichniseinheit blicken stellen Sie fest dass es unterschiedliche Verzeichnisse f r eingeschlossene Dateien Bibliotheken Konfigurationsdateien Schablonen und Passwortdateien zu verwenden mit htaccess Dateien gibt Passwortdateien sollten niemals ber das Web zug nglich sein da die darin enthaltenen Passw rter nur mit schwachen Standardalgorithmen verschl sselt sind und daher leicht von entsprechenden Programmen entschl sselt werden k nnten Die enthaltenen Dateien m ssen nicht unbedingt vor dem Zugriff von au en gesch tzt werden es empfiehlt sich jedoch sie au erhalb des Dokumentenstamms zu speichern Selbst wenn der Webserver ein Dokument aufgrund einer falschen Konfiguration nicht analysieren kann gibt es m glicherweise einige Bibliotheken die wichtige Betriebsgeheimnisse Systeminformationen oder innovative Algorithmen ent halten und nicht f r alle Webbenutzer sichtbar sein sollen Tipp Wir verwenden in allen Projekten eine Datei namens configura tion inc php3 die Konfigurationsdaten f r den Umfang eines Projekts defi niert Sie beschreibt au erdem den Basispfad
256. der Tauglichkeit geben Sie ihm die M glichkeit zwischen den einzelnen Stufen hin und her zuschalten ohne dass die Daten verloren gehen Benutzer w hlen h ufig f lschlicherweise Funktionen und suchen dann einen Weg diesen uner w nschten Zustand zu verlassen Wenn das Programm vom Benutzer vor ber gehend verlassen wird erm glichen Sie ihm es sp ter wieder zu betreten Kontrollierbar bedeutet auch dass sich das Programm an die Bed rfnisse und Merkmale des Benutzers anpasst In einem Intranet k nnen Sie beispielsweise erfahrenere Benutzer erwarten da sie sich mit dem System bei der t glichen Arbeit vertraut machen Die Navigationsstruktur und das Programm sollten daher so gestaltet sein dass der Benutzer ber Tastaturk rzel oder andere Mittel wesentliche Punkte schneller erreicht z B ber Pulldown Men s die einen direkten Sprung auf eine bestimmte Seite erm glichen Au erdem brauchen die Benutzer fortgeschrittenere Hilfeseiten die das unterschiedliche Wissensniveau befriedigen Entspricht es der Benutzererwartung Einer der wichtigsten Aspekte f r die Tauglichkeit ist Konsistenz Jakob Niel sen der wohl bekannteste Tauglichkeitsexperte dr ckte es in seinem Gesetz zur Webbenutzererfahrung so aus Benutzer verbringen die meiste Zeit auf ande ren Websites Die Konventionen die sich auf den meisten anderen Websites etabliert haben sollten daher auch auf Ihrer Website eingehalten werden Dr Nielsen s 14t gi
257. dern m chten Sie m glicherweise von diesem Ansatz abweichen Ihre Serverhardware wird es Ihnen danken Der Kopf der Ausgabe sieht fol genderma en aus Expires Thu 19 Nov 1981 08 52 00 GMT Cache Control no cache Pragma no cache 183 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Wenn Sie cache_limiter auf private setzen k nnen die Seiten zwar von Brow sern aber nicht von Proxys oder anderen Gateway Programmen gecacht wer den Betrachten Sie den Unterschied zur Anweisung proxy revalidate In letz terem Fall merkt sich der Proxy den Inhalt der Seite und stellt diese wieder her anstatt sie vollst ndig neu aufzurufen Der generierte HTTP Kopf sieht etwas so aus Expires Thu 19 Nov 1981 08 52 00 GMT Cache Control private max age 10800 Last Modified Thu 03 Feb 2000 15 56 11 GMT Der letzte Wert public erm glicht sowohl dem Client als auch Proxys vollst n diges Caching Verwenden Sie die Cache Option public jedoch mit Vorsicht Seiten die mit dieser Einstellung generiert werden k nnten auch anderen Benutzern zug nglich sein die Zugriff auf Proxys haben Bei der ffentlichen Variante wird auch der PHP Konfigurationsbefehl cache _ expire betrachtet Dieser gibt an nach wie vielen Sekunden der Cache abl uft Die erzeugten K pfe sollten in etwa so aussehen Expires Thu 03 Feb 2000 18 56 11 GMT Cache Control public max age 10800 Last Modified Thu 03 Feb 2000 15 56 11 GMT PHP 3 0 Sitzun
258. des Projekts Dies verein facht sp ter zus tzliche Dateien im Skript einzuf gen die sich in Unterverzeichnissen befinden Es gibt drei verschiedene Verzeichnisgruppen live dev und staging Das Unterverzeichnis live enth lt die Produktionsumgebung die tats ch liche Website dev wird f r den Entwicklungsserver verwendet staging bildet den bergang von dev zu live und wird f r die Qualit ts sicherung und die Endabnahme vor der Freigabe verwendet Die Trennung von Entwicklungs und Anwendungsserver ist auf gr eren Websites unerl sslich Sie k nnen es sich einfach nicht leisten Webanwen dungen live zu bearbeiten Ein Skriptfehler w rde sich unmittelbar auf Hunderttausende von Benutzer auswirken Bedenken Sie was passieren k nnte wenn diese Skriptfehler zu Unvereinbarkeiten von Daten in einer Produktionsdatenbank f hren w rde Die L sung besteht demnach in der Unterscheidung zwischen einem Ent wicklungsserver und einem Produktionsserver In unserem Beispiel befinden sich beide auf derselben physikalischen Maschine F r den Entwicklungsser ver k nnten Sie einen Zugriff mit entsprechenden Zugriffsbeschr nkungen unter dev phpwebdev com erm glichen z B mit IP basierter Filterung Auf gr feren und kritischeren Systemen ist es in der Regel besser den Entwicklungs server auf einen zweiten identisch konfigurierten Server zu verlagern Damit k nnen Sie Softwareaktualisierungen Neukonfigurationen des Betri
259. 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 ist 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 Baum
260. do Rules CheckingOn NUM Abbildung 7 3 XMetal von SoftQuad ein XML Autorensystem mit welchem dieses Buch erstellt wurde 7 2 3 WML Wireless Markup Language Eine weitere Document Type Definition die schnell zum Industriestandard wurde ist WML Sie ist f r die Verwendung in spezifischen Inhalten und Benutzerschnittstellen f r drahtlose Ger te wie Mobiltelefone oder Personal Digital Assistants gedacht Aufgrund der Beschr nkungen die diese Ger te haben eignet sich HTML hier nicht so gut als Auszeichnungssprache Sie haben kleine und niedrig aufl sende grafische Anzeigen Sie erm glichen nur begrenzt Benutzerinteraktionen Sie erm glichen bisher nur einen Schmalbandzugang f r Netzwerke Sie haben nur eine begrenzte Rechnerkapazit t 307 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Diese Probleme spricht WML an Sie unterteilt den Inhalt in kleine Teile Karten und fasst sie in gr ere Informationseinheiten Decks zusam men Um permanenten Netzwerkzugriff zu vermeiden definiert WML in XML eine Reihe von Skriptprozeduren f r die Clientseite z B um Variablen auf dem Clientrechner zu setzen und auf diese zuzugreifen Aufgrund des begrenzten Platzes auf dem Bildschirm ist es recht schwierig sinnvolle Navi gationspfade auf portablen Ger ten zu generieren WML zwingt den Benut zeragenten den WAP Browser den Navigationsverlauf aufzuzeichn
261. dung 2 9 Array das eine Baumstruktur enth lt Die Bibliothek besteht aus den folgenden Funktionen Funktion Beschreibung array tree_create Erzeugt einen neuen Baum int tree_allocate_node Ordnet in der Baumstruktur einen array tree neuen Knoten zu int tree_free_node Gibt einen Knoten in der Baumstruktur array tree int handle frei int tree_link_left Verkn pft einen Knoten als linken Toch array tree int link to int child terknoten mit einem anderen Knoten int tree_link_right Verkn pft einen Knoten als rechten array tree int link_to int child Tochterknoten mit einem anderen Knoten int tree_get_parent Gibt den Elternknoten des angegebe array tree int handle nen Knoten zur ck int tree_get_left Gibt den linken Tochterknoten des an array tree int handle gegebenen Knotens zur ck int tree_get_right Gibt den rechten Tochterknoten des an array tree int handle gegebenen Knotens zur ck 90 Pearson vy ADDISON WESLEY Education 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
262. dungen was ihnen eine kleinen Vorteil verschafft Die Fehlersuche die wie jeder Programmierer wei einen Gro teil der Projektzeit in Anspruch nehmen und sich zu einem wahren Alptraum ausweiten kann wenn die Pr zision nicht hundertprozentig ist war bei ASP ebenfalls schwieriger PHP gibt pr zise Fehlermeldungen aus die eine effektive Hilfe f r die L sung des Problems darstellen 351 Pearson A ADDISON WESLEY Education 8 Fallstudien Weitere Vorteile von PHP sah man in seiner klaren C hnlichen Sprachsyn tax der Leichtigkeit mit der es reinem HTML hinzugef gt werden kann sei ner Erweiterbarkeit der Datenbankanbindung und dem Preis Ins Gewicht fiel auch die Unterst tzung welche die PHP Gemeinschaft bietet Diese besteht aus einer umfangreichen Mailingliste einem der besten Online Doku mentationszentren zahlreichen Online und Hardcopy Tutorials sowie einem regen Wissensaustausch zwischen Experten und Laien Ein weiterer Aspekt den viele Leute bei Open Source Produkten h ufig ber sehen ist dass die Entwicklung permanent vorangetrieben wird so dass in einigen F llen monatlich neue Versionen freigegeben werden Wenn Sie eine bestimmte Funktion brauchen k nnen Sie diese selbst hinzuf gen sofern Sie die Zeit und das notwendige Wissen besitzen Dies bedeutet dass Sie nicht mehr l nger auf die neueste Version warten m ssen um festzustellen ob diese Ihren Anforderungen gerecht wird Einige BizChek Programmi
263. e diese in aufeinanderfolgende Zeilen platzieren und f gen Sie zwischen allen anderen eine Leerzeile ein Trennen Sie zwei Bl cke durch eine Leerzeile Setzen Sie Funktions Header und Footer mittels einer Leerzeile vom bri gen Text ab der Import von globalen Variablen wird als Teil des Funk tions Header betrachtet 37 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte Integrieren Sie Blockkommentare in den Programmcode und verwenden Sie dabei denselben Einzug wie der Codeblock zu dem der Kommentar geh rt Setzen Sie alle Zeilenkommentare zu einem Block in dieselbe Spalte Als Beispiel zeigt Listing 1 2 den obigen Programmteil neu formatiert lt function myfunc myvar somevar myvar 2 return somevar 1 print myfunc 1 a gt Listing 1 2 Neu formatierter Programmteil Wie Sie feststellen werden k nnen Sie durch diesen Codeteil leichter navigieren Die Verwendung von Leerzeichen l sst sich noch weiter ausdehnen indem Klammern und Schl sselw rter ebenfalls durch Leerzeichen getrennt wer den lt function myfunc myvar somevar myvar 2 return somevar 1 print myfunc 1 gt Hier scheint es etwas bertrieben aber stellen Sie sich vor dieser Code sei in Tausend weitere Programmzeilen integriert Vielleicht ndern Sie dann Ihre Meinung Einige Leute meinen Leerzeichen zwischen Klammern seien eher 38 Pearson A AD
264. e Anfragen hinweg zu erhalten eine wichtige Facette einer Sitzungsbibliothek Sie k nnen sowohl serialize als auch deserialize benutzen Beachten Sie jedoch dass diese Funktionen in PHP 3 0 nicht richtig fiir Objekte Klassen funktionieren Klassenfunktionen werden verworfen 179 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Ausschluss von Argumenten Um ein Argument wegzulassen bergeben Sie eine leere Zeichenfolge an session_set_save_handler Die Funktionen sind wie folgt definiert bool open String save_path String sess_name Diese Funktion wird bei der Initialisierung einer Sitzung ausgef hrt Sie sollten sie verwenden um Ihre Funktionen vorzubereiten Variablen zu initialisieren o Die Funktion hat zwei Argumente in Form von Zeichen folgen Das erste gibt den Pfad an in dem Sitzungen gespeichert werden sollten Diese Variable kann in php ini oder durch die Funktion session_ save_path angegeben werden Sie k nnen diese Variable als Platzhalter verwenden und sie f r eine modulspezifische Konfiguration einsetzen Das zweite Argument gibt den Namen der Sitzung an der standardm ig PHPSESSID lautet Die Funktion open gibt bei erfolgreicher Initialisierung true zur ck bei nicht erfolgter Initialisierung false bool close Diese Funktion wird beim Beenden einer Sitzung ausgef hrt Verwenden Sie sie um Speicher freizugeben oder Ihre Variablen zu l schen Die Funk tion hat keine A
265. e Initialisierungen werden zur selben Zeit durchgef hrt Um dieses Feld als nicht benutzt zu markieren verwenden Sie NULL Zur Deklaration einer Funktion verwenden Sie das Makro ZEND RINIT In unserem Beispiel sieht der Modulblock folgenderma en aus zend_ module _entry firstmod_module entry First Module firstmod_functions NULL NULL NULL NULL NULL STANDARD_MODULE_PROPERTIES 390 Pearson A ADDISON WESLEY Education Einblick in die Quellen Dies ist im Prinzip die einfachste und minimalste Anzahl an Werten die Sie einsetzen k nnen Der Name des Moduls wird auf First Module gesetzt Anschlie end wird die Funktionsliste referenziert und danach alle Initialisie rungs und Deinitialisierungsfunktionen als nicht benutzt markiert Zu Referenzzwecken finden Sie in Tabelle 9 3 eine Liste der Makros die in den deklarierten Initialisierungs und Deinitialisierungsfunktionen vorkom men In unserem einfachen Beispiel wurden sie bisher noch nicht eingesetzt sie werden aber sp ter noch eine Rolle spielen Sie sollten diese Makros ver wenden um Ihre Initialisierungs und Deinitialisierungsfunktionen zu dekla rieren da hierf r spezielle Argumente bergeben werden m ssen INIT_FUNC_ ARGS una SHUTDOWN FUNC_ARGS die bei Verwendung der vordefinierten Makros automatisch in der Funktionsdeklaration enthalten sind Wenn Sie Ihre Funk tionen manuell deklarieren und der PHP Entwickler beschlie t dass eine nderung in de
266. e Programmcode zeigt ein einfaches Beispiel f r variable Variablennamen lt my_var hello my_var 1 gt 114 Pearson A ADDISON WESLEY Education Assoziative Arrays In der zweiten Zeile wird my_var das Pr fix vorangestellt Dies ist das Grundprinzip von variablen Variablennamen Nat rlich k nnten Sie variable Variablennamen verschachteln um variable variable Variablennamen zu erhal ten 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 pol
267. e Tabelle zeigt die zu verwendenden Funktionen Funktion Beschreibung emalloc Ersetzt mal loc efree Ersetzt free estrdup Ersetzt strdup 373 Pearson vy ADDISON WESLEY Education Ne Erweiterung von PHP 4 0 Knacken wir den PHP Kern Funktion Beschreibung estrndup Ersetzt strndup Schneller als estrdup und bin rsicher Die Verwendung dieser Funktion wird empfohlen wenn Sie die Lange des Strings kennen bevor Sie ihn duplizieren ecalloc Ersetzt cal loc erealloc Ersetzt realloc emalloc estrdup estrndup ecalloc und erealloc weisen internen Speicher zu efree setzt diese zuvor zugewiesenen Bl cke frei Der von den e Funktionen verwaltete Speicher wird vom aktuellen Prozess als lokal betrachtet und wird gel scht sobald das von diesem Prozess ausgef hrte Skript beendet wird Warnung Um residenten Speicher zuzuweisen der nach der Beendigung des aktuellen Skripts erhalten bleibt k nnen Sie malloc und free ver wenden Dies sollten Sie jedoch nur mit extremer Vorsicht tun und nur wenn die Zend API dies erfordert Ansonsten riskieren Sie Speicherl cher Zend bietet au erdem einen thread sicheren Ressourcemanager der eine bes sere und direkte Unterst tzung f r Webserver mit mehreren Teilprozessen bietet Daf r m ssen Sie allen Ihren globalen Variablen lokale Strukturen zuweisen damit gleichzeitig mehrere Teilprozesse ausgef hrt wer
268. e Verbindungen auf der PHP Ebene ausgewertet werden 3 6 3 Auf der Datenbankebene Auf der Datenbankebene sieht das vollkommen anders aus Clients k nnen sich anmelden und chatten aber ihre Nachrichten und Sitzungsdaten werden in der Datenbank gefiltert Entweder durch ein externes Werkzeug oder den Chatcode selbst wird berpr ft ob der Benutzer das Recht hat etwas zu sagen oder zu tun Basierend auf dieser Information wird seine Nachricht in der Datenbank eingef gt oder nicht Diese Strategie erfordert jedoch eine sehr enge Integration in den Hauptchat Code Au erdem ist sie nicht sehr flexibel und etwas umst ndlich und nicht sehr elegant zu implementieren 3 6 4 Auf der IRC Ebene IRC hat eigene Verwaltungsfunktionen die im Servercode und im Netzwerk protokoll integriert sind wir hoffen Sie lesen die RFC und sind mit diesen M glichkeiten vertraut Die Verwaltung kann sogar durch regul re Benutzer vorgenommen werden Es gibt drei Ebenen Kanaloperatoren Diese Operatoren haben administrative Kontrolle ber Kan le Sie k nnen Benutzer hinauskicken sie zum Schweigen bringen sie verbieten andere Benutzer zu Operatoren machen u diese Ebene ist f r alle Benutzer verf gbar IRC Operatoren Diese Operatoren haben administrative Kontrolle ber das Netzwerk aber nicht ber die Kan le Sie k nnen Benutzer aus dem Netz werfen sie verbieten Netzwerkverbindungen herstellen usw diese Ebene ist nur bestimmten Benutze
269. e Verwendung physikalischer Mittel die helfen den Satz so schnell wie m glich zu verstehen Die Trennung verhin dert hier eigentlich den nat rlichen Lesefluss da Sie es nicht gewohnt sind dass ein Satz in syntaktische Einheiten unterteilt wird Beim Quellcode ist dies jedoch von Vorteil da dieser h ufig komplizierte Konstrukte Formeln und hnliches enth lt Hier erh lt der Benutzer durch die klare physikalische Struktur des Quellcode eine wertvolle Unterst tzung Mittel zur Verdeutli chung k nnen Einzug und Verwendung von Schl sselbegriffen an exponier ten Stellen sein 36 Pearson A ADDISON WESLEY Education Kodierungskonventionen Betrachten wir ein kurzes PHP Programm lt function myfunc myvar somevar myvar 2 return somevar 1 print myfunc 1 gt Der eigentliche Programmcode ist wahrscheinlich kein Meisterwerk aber uns interessiert im Moment nur die Struktur Wenn Sie den vorherigen Abschnitt nicht gelesen h tten w ren Sie in der Lage sofort auf den Beginn der Haupt routine zu zeigen K nnten Sie die erste und letzte Anweisung der Funktion darin identifizieren Auch wenn Sie die gew nschten Stellen schnell finden beginnen Ihre Augen unvermeidbar am Anfang der Zeile und scannen den Programmcode von links nach rechts und stoppen wenn Sie glauben dass Sie das Ziel gefunden haben Unbewusst liest Ihr Gehirn die gesamte Zeile noch einmal weil ihm Informationen aus der physikalischen Analyse feh
270. e fortgeschritten ist 8 3 8 Codeverwaltung Die Entwickler die bei MarketPlayer fiir den Inhalt der Content Management Systeme zust ndig sind arbeiten derzeit unter Windows NT mit der Ver sionskontrolle Source Safe Mit der neuen Technologie wird der gesamte Code jedoch unter CVS gespeichert Sobald die Redaktionsabteilung die notwendi gen Tools hat um unter Linux arbeiten zu k nnen soll der Code wieder in CVS zurtickgespeichert werden Produktmanager stellen Entwicklungsteams zusammen legen das Design fest entwerfen die Codestruktur und tiberwachen die Implementierung durch die Teammitglieder Anschlie end wird eine Prototypversion entwi ckelt und als Alphaversion freigegeben und in das CVS eingepflegt Diese Komponenten werden anschlie end an die anderen Entwickler verteilt und durch die Produktmanager auf Sicherheit Effizienz und Design berpr ft Nachfolgende Versionen unterscheiden sich durch hinzugef gte Funktionen Fehlerbereinigungen und Verbesserung des Design Designteams sind spezia lisiert und auf bestimmte Aufgaben ausgerichtet Damit k nnen sie schnell auf die Bed rfnisse des Unternehmens reagieren W hrend der Entwicklung der Prototypversion k nnen die Schnittstellen der Elemente in PHP noch relativ vage sein da die Funktionalit t normalerweise direkt im Code enthalten ist Sobald die Module zusammengef gt werden kann die Parameterordnung und die Funktionsnomenklatur festgelegt wer den ohne dass der Cod
271. e grundlegenden berpr fungen k nnen mit Routinen der Biblio thek automatisiert werden die wir in Kapitel 5 Grundlegende Webanwen dungsstrategien vorstellen F r komplexere berpr fungen haben wir lei der noch keinen allgemeinen Ansatz gefunden Daher f hren wir sie manuell durch Die entsprechenden Skripte folgen der typischen Logik die wir in Kapitel 5 erl utern und die wir als PHP Standardformular bezeichnen Ausf hren von Systembefehlen Achten Sie besonders auf die Sicherheit wenn Sie mit Dateien arbeiten oder Systembefehle ausf hren Stellen Sie sich ein typisches Skript f r einen Quell code Viewer vor in dessen Argument der Dateiname angegeben wird und das die Datei farbig anzeigt show_source Datei Sie m chten dass das Skript mit script php3 file script php3 aufgerufen wird Aber was passiert wenn jemand es mit script php3 file etc passwd aufruft Richtig Sie haben ein Problem weil Sie darauf vertrauten dass sich die Variablen die vom Web kommen in einem bestimmten Bereich befinden z B dem aktuellen Verzeichnis Diese Annahmen m ssen Sie dem Server unbedingt mitteilen z B indem Sie folgenden Befehl verwenden show_source basename file Sehen wir uns ein anderes Beispiel an einen Verzeichnis Viewer den wir auf dem Web gefunden haben Listing 4 3 zeigt eine leicht ge nderte und gek rzte Version Der Autor Marcus Xenakis gab uns freundlicherweise die Genehmigung ihn hier abzudrucken
272. e massiv umgeschrieben werden muss Ausstehende Funktionen k nnen in PHP leicht simuliert oder in der Entwicklungsumge bung umgangen werden Firmenexterne Funktionen f gen sich nahtlos in PHP ein Dies begrenzt das Design auf den Zeitraum der Prototypentwicklung und verhindert dass sich Verz gerungen auf andere Entwickler auswirken 363 Pearson A ADDISON WESLEY Education 8 Fallstudien 8 3 9 Die Zukunft MarketPlayer com entwickelt sich derzeit in Richtung auf eine 100 ige Web site Mit ber acht Millionen Seitenansichten pro Monat auf allen seinen Web sites hat MarketPlayer com keine Probleme in der Handhabung des Datenver kehrs festgestellt und ist der berzeugung dass PHP jede Datenfrequenz bew ltigt 8 4 Zusammenfassung Wie Sie feststellen konnten unterscheidet sich das heutige PHP stark von sei nen Urspr ngen Obwohl es einen enormen Einfluss auf die Open Source Gemeinschaft hatte wurde PHP zu Beginn noch als Amateurl sung betrach tet und als nettes Spielzeug abgetan Nat rlich waren die Pretty Hip People wie sich die PHP Benutzer manchmal selbst bezeichnen von ihrem eigenen Tool vollkommen berzeugt mussten aber zugeben dass es sich manchmal im Wettbewerb nicht messen konnte Im Laufe der Entwicklung der Version 3 wagte PHP den Angriff auf alte Giganten wie ASP Cold Fusion u a und gewann den Kampf immer h ufiger In diesem Kapitel haben wir Ihnen drei Beispiele gezeigt in denen PHP seine Konkurren
273. e mit einer Anforderungs liste von Zend Technologies gestartet Es sollte ein Softwaresystem entwickelt werden das so aufgebaut ist dass die PHP Fakten Tipps und Hinweise leicht zu finden sind Die erste Seite der Anwendung soll die verf gbaren Kategorien unterhalb der Stammkategorie und eine Liste der in die Datenbank neu hinzugef gten Eintr ge zeigen Durch Klicken auf die Kategorien soll der Benutzer die Eintr ge zu dieser Kategorie durchbl ttern k nnen Durch Klicken auf einen Eintrag soll er zu der Seite gelangen die Einzelheiten zu diesem Eintrag enth lt die berschrift zu dem Eintrag den vollst ndigen Text Namen des Autors das Datum an dem der Eintrag hinzugefiigt wurde und die aktuelle Beurteilung Es sollte auch die M glichkeit geben auf dieser Seite Eintr ge mittels einer Klassifika tion von Eins bis F nf zu graduieren wobei Eins den h chsten Grad darstellt Das Programm soll eine Volltext Suchfunktion haben bei der als Standard verkn pfungsoperator UND verwendet wird Wenn der Benutzer imap con nect eingibt soll das System alle Eintr ge in der Datenbank zur ckgeben die im Titel oder Textk rper sowohl den Eintrage imap als auch den Eintrag connect enthalten Bei der Suche soll Gro und Kleinschreibung nicht unterschieden werden Es soll jedoch m glich sein alle Eintr ge anzuzeigen die von einem bestimmten Autor stammen Zus tzlich sollen drei Berichte verf gbar sein welche die Auto
274. e sie zun chst an eine Stelle kopieren an der PHP auf sie zugreifen kann Zu Testzwecken k nnen Sie die Datei in das Verzeichnis htdocs kopieren und sie mit der Quelle aus Listing 9 4 ausprobieren Wenn Sie die Datei in die PHP Bin rdatei kompiliert haben lassen Sie den d1 Aufruf weg denn die Funktionen des Moduls sind f r Ihre Skripte sofort verf gbar Warnung Zur Sicherheit sollten Sie Ihre dynamischen Module nicht in ffentlich zug nglichen Verzeichnisse speichern Dies ist zwar m glich und vereinfacht das Testen aber in Produktionsumgebungen sollten Sie diese in einem separaten Verzeichnis ablegen lt php d first_module so param 2 return first_module param print We sent param and got return gt Listing 9 4 Eine Testdatei f r first_module so Wenn Sie diese PHP Datei in Ihrem Webbrowser aufrufen erhalten Sie die in Abbildung 9 3 gezeigte Ausgabe XY Netscape olx File Edit View Go Communicator Help We sent 2 and got 2 jE Je ga 7 Abbildung 9 3 Ausgabe von first_module php 382 Pearson A ADDISON WESLEY Education Fehlersuche Sofern erforderlich wird das dynamisch ladbare Modul durch Aufruf der Funktion d1 geladen Diese Funktion sucht nach dem angegebenen Shared Object l dt es und stellt PHP seine Funktionen zur Verf gung Das Modul exportiert die Funktion first_module die einen einzigen Parameter besitzt konvertiert diesen in eine ganze Zah
275. e sind uns durch den gesamten Entwicklungsprozess gefolgt und wir haben aus unseren Beispielen Schlussfolgerungen gezogen die f r die meis ten Software Projekte zutreffen Mit diesem Hintergrundwissen sind Sie f r den n chsten Teil dieses Buches ger stet in dem wir Ihnen einige wichtige Konzepte f r Webanwendungen zeigen 162 Pearson A ADDISON WESLEY Education Teil 2 Webanwendungen Webanwendungskonzepte Grundlegende Webanwendungsstrategien Datenbankzugriff mit PHP Anwendungen der Spitzentechnologie X NO o e Fallstudien Pearson A ADDISON WESLEY Education Pearson vy ADDISON WESLEY Education Webanwendungs konzepte Wir bringen Speichen in einem Rad zusammen aber das innere Loch bringt den Wagen ins Rollen Wir formen Ton zu einem Topf aber erst die Leerheit in ihm h lt den gew nschten Inhalt Wir bearbeiten Holz f r ein Haus aber erst der Innenraum macht es bewohnbar Um die Bedeutung von Webanwendungskonzepten zu verstehen m ssen Sie zwischen Anwendungen und einzelnen Skripten unterscheiden Ein Skript ist ein Hilfsprogramm und hat als solches keinen Kontext Es kennt andere Skripte in Ihrem System nicht Eine Anwendung ist dagegen f r h here Auf gaben ausgelegt Es muss seinen Status berwachen und Transaktionen durchf hren weil es interaktiv ist Da es in der Regel sehr viel mehr Benutzer interaktionen verzeichnet als ein einzelnes Skript m ssen Sie sich auch ber die Sicher
276. e von Ausf hrungsinformationen 9 19 Initialisierungs und Deinitialisierungsfunktionen Initialisierungs und Deinitialisierungsfunktionen k nnen f r einmalige Ini tialisierungen und Deinitialisierungen Ihre Module verwendet werden Wie bereits in diesem Kapitel erw hnt siehe die Beschreibung vom Deskriptor block des Zendmoduls gibt es globale Modul sowie Anfrageinitialisie rungs und Deinitialisierungsereignisse 429 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Die globale Initialisierungsfunktionen werden beim Hochfahren von PHP aufgerufen Auf hnliche Weise werden die globalen Deinitialisierungsfunk tionen aufgerufen sobald PHP beendet wird Beachten Sie dass sie tats ch lich nur einmal aufgerufen werden und nicht wenn ein neuer Apache Pro zess generiert wird Die Initialisierungs und Deinitialisierungsfunktionen des Moduls werden aufgerufen wenn ein Modul geladen wird und initialisiert werden muss Anfrageinitialisierungs und Deinitialisierungsfunktionen werden aufgeru fen wenn eine Anfrage verarbeitet wird also eine Datei ausgef hrt wird Bei dynamischen Erweiterungen werden Module und Abfragen gleichzeitig initialisiert und deinitialisiert Die Deklaration und Einbindung dieser Funktionen geschieht ber Makros Einzelheiten hier ber finden Sie im Abschnitt Deklarationen des Zend Modulblocks 9 20 Aufruf von Benutzerfunktionen Sie k nnen Benu
277. e wir bereits erw hnt haben k nnen Sie dadurch jede Version einer Datei wieder herstel 237 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien len Mithilfe des Befehls cvs diff kann ein Entwickler sogar Unterschiede zwi schen beliebigen Versionen ansehen ohne die Datei auszulesen Standardm fig wird der Befehl cvs diff eingesetzt um die lokal ge nderte Version mit der Version im zentralen Archiv zu vergleichen jane dev home jane f api gt cvs diff f api_write php3 Durch Verwendung der Option r die in den meisten CVS Befehlen zur Versi onsangabe eingesetzt werden kann ist Jane jetzt in der Lage die lokale Kopie mit der zentralen Version 1 1 der urspr nglichen Version zu vergleichen jane dev home jane f api gt cvs diff r 1 1 f api_write php3 Index config inc php3 RCS file usr local cvsroot config inc php3 config inc php3 v retrieving revision 1 1 retrieving revision 1 3 diff r1 1 r1 5 3c3 lt define FT_ZIP_ARCHIVE ZIP_ARC GZip Archive gt define FT_ZIP ZIP_ARC GZip Archive not PkZip compatible Auch wenn sich CVS f r den Abgleich verschiedener Versionen einer Datei meistens gut eignet sollten Sie dies unter bestimmten Umst nden besser ver meiden Wenn der Befehl cvs diff beispielsweise umfangreiche nderungen auf dem entfernten Server anzeigt w hrend auf dem lokalen System nur wenige nderungen vorgenommen wurden empfiehlt es sich m
278. e zu erzeu gen kamen sie f r die BizChek Entwickler in die engere Wahl Cold Fusion w re vielleicht eine akzeptable Wahl gewesen aber es war zu jener Zeit noch ein sehr neues Produkt Man wusste zuwenig dar ber und deshalb lie en es die Entwickler wieder fallen BizChek sch tzte dass bei der Wahl von Apache als Webserver Mod_Perl das den Perl Interpreter direkt in den Webserver integriert Ergebnisse erzielen w rde die jenen von PHP und ASP nahe k men Auch wenn Mod_Perl vielleicht eine gro artige Alternative gewesen w re hatten die BizChek Entwickler die Bef rchtung dass es gro en Weban wendungen nicht gewachsen w re F r sie war es eine zu allgemein einsetz bare Sprache w hrend sie PHP f r eine sehr einfache und trotzdem leistungs f hige Variante hielten die speziell f r das Web entwickelt wurde Man musste nicht durch irgendwelche Reifen springen um PHP dazu zu bringen mit dem Web zusammenzuarbeiten ASP bot eine Vielzahl von Komponenten anderer Hersteller aber die Kosten f r die Einf hrung und die Wartung waren besorgniserregend Die Tatsache dass ASP au erdem nur auf den Internet Information Server und Microsoft Windows Plattformen beschr nkt war degradierten es in den Augen von Biz Chek noch weiter W hrend sich ASP f r die Datenverbindung haupts chlich auf ODBC st tzt was sich als sehr sinnvoll erweisen kann wenn Sie Ihre Datenbank jeden Monat wechseln haben PHP und Perl eigene Datenbank verbin
279. earson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel Clients verwalten muss steigt die Belastung der Datenbank die mehr und mehr Ressourcen belegt Bei ungef hr 40 bis 50 Anfragen pro Sekunde brauchte unser Testserver etwa ein Drittel seiner Verarbeitungszeit nur f r die Ausf hrung der Datenbankanfragen Auch wenn dies ein Ausschlusskrite rium fiir das Datenbanksystem darstellt dieses sollte in der Lage sein weit aus mehr Anfragen zu verarbeiten gibt es hier offensichtlich einen Optimie rungsbedarf und dies ist nicht die ideale Einstellung Erstellen von Sperrdateien Unser zweiter Gedanke war dass ein Dateisystem effizienten sein k nnte wenn die Datenbank f r die prozess bergreifende Kommunikation zu viele Ressourcen belegt Das Dateisystem hat jedoch das Rennen klar verloren Auch hier war die schreibende Anwendung nicht das Problem Die Sperrdateien liefen sich pro blemlos erzeugen Um zu ermitteln ob eine Sperre gesetzt war musste jedoch clearstatcache sehr h ufig aufgerufen werden um zuverl ssig herauszufinden ob eine Sperrdatei inzwischen gel scht wurde oder noch vorhanden war clearstatcache hat die Systemleistung sehr stark beein tr chtigt so dass wir diese Option nicht n her in Betracht zogen Der Chat funktioniert nur mit einem Viertel der Leistung die er mit dem datenbankge st tzten Ansatz erbrachte Schaffen Sie sich eigene Bezugspunkte Schreiben Sie einige Testskri
280. earson vy ADDISON WESLEY Education 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 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 erstell
281. ebenen 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 Vari ablen wurden urspr nglich als Parameter an fsockopen bergeben Da diese Parameter in der fsockopen Deklaration jedoch als durch Referenz weiter gegeben deklariert sind kann fsockopen sie modifizieren und die Anderun gen anschlie end global zur Verf gung stellen 103 Pearson A ADDISON WESLEY Education 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 Beide Druckanweisungen geben denselben Inhalt aus W hrend calculate bei der Programm
282. ebs systems Hardware nderungen usw leichter testen 231 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien Doch wozu dient der Dritte im Bunde der bergangserver Ist das nicht etwas bertrieben Nicht wenn Ihr Team gro genug ist um gezielt Personal f r die Qualit tssicherung QA oder die Sicherheits berpr fung abzustellen Bei einer komplexen Website brauchen Sie h ufig viel Zeit um eine ge nderte Version zu testen bevor Sie diese freigeben Sie k nnen die Entwickler nicht dazu verdonnern tatenlos herumzusitzen w hrend das Qualit tssicherungs personal den Entwicklungsserver unter die Lupe nimmt Ein weiterer Grund warum Sie einen bergangsserver in Ihre Konstellation integrieren sollten ist dass Entwickler sich sicherer f hlen und unbefangener nderungen am Entwicklungsserver vornehmen Sie brauchen sich nicht mehr gro e Sorgen zu machen dass sie den Code eines anderen Entwicklers versehentlich zerst ren Wenn ein Problem auftritt k nnen Sie dieses l sen bevor der Projektlei ter die Entwicklungsversion an den bergangserver weiterleitet Wenn jemand den bergangsserver zum Absturz bringt muss er nat rlich trotz dem die traditionellen drei ig Liegest tzen machen Wie sieht nun ein typischer Entwicklungslebenszyklus in dieser Konstellation aus 1 Das neue Projekt wird gestartet indem eine Verzeichnisstruktur erstellt und ein System zur Versionsverwaltung errichtet
283. ebserver und vor allem seiner hnlichkeit zur Programmiersprache C Die zweite Wahl w re m glicherweise Perl gewesen aber mit dieser waren die Market Player com Programmierern nicht vertraut und Erweiterungen f r Daten banken und propriet re Algorithmen w ren sehr kostspielig gewesen Cold Fusion wurde nicht ber cksichtigt und durch die enge Verkn pfung zu Win dows Plattformen wurde ASP von vornherein ausgeschlossen Bis vor kur zem st tzte sich MarketPlayer com auf serverseitiges Java f r spezifischen 360 Pearson A ADDISON WESLEY Education MarketPlayer com vom Benutzer zu konfigurierende Anfragen Mit der Zeit wurde der Code zu umfangreich um ihn zu pflegen und wurde durch eine L sung ersetzt die komplett in PHP und C geschrieben ist Die derzeit laufende Beta Version ist f nfmal schneller als das Java Produktionssystem und hat noch viel Raum f r Optimierungen Im System wurden keine fundamentalen M ngel gefunden doch die relati ven Pfade in der include Anweisung f hrten zu einiger Frustration insbe sondere bei verschachtelten includes Die C Quell und Headerdateien ver wenden als Basis f r die relativen Pfade ihr eigenes Verzeichnis w hrend die include Anweisung von PHP das Verzeichnis der urspr nglich aufgerufenen Datei verwendet Ein eigenes Verzeichnis f r includes zu pflegen und diese Dateien aus einer hierarchischen Verzeichnisstruktur heraus zu referenzieren kann kompliziert werden Deshal
284. econds Listing 1 13 Korrigierte API Wie Sie sehen kann es sehr wichtig sein Formate und Methoden zu berpr fen die zur Bearbeitung spezieller Daten zur Verf gung stehen Das aktuelle Format k rzt die Argumentliste nicht nur auf 1 7 sondern ist zuf lliger weise auch das maschinenspezifische Format der zugrundeliegenden Architektur f r die Bearbeitung des Datums und der Zeit Die berpr fung maschinenspezifischer Formate und bestehender Standards ist ein Schritt den Sie in Ihrer Vorbereitungszeit nie untersch tzen sollten In der Entwick lungsphase sollte Ihnen Nichts einfach zuf llig passieren Kenntnis der Materie ist Pflicht Behalten Sie dies im Hinterkopf wenn Sie sich jetzt die dritte laut Liste ben tigte Funktion ansehen Sie dient dazu eine Liste der neuen Ereignisse abzu fragen Hier bekommen wir Probleme weil die Ausgabe kein einzelner Wert sondern eine variable Liste von zugeordneten Werten ist 58 Pearson A ADDISON WESLEY Education Entwicklung einer Anwendungsprogrammschnittstelle Timestamp 1 gt Beschreibung 1 Timestamp 2 gt Beschreibung 2 Timestamp 3 gt Beschreibung 3 Die R ckgabe der Daten k nnte durch Referenz auf die Parameter erfolgen N heres zu diesem Thema erfahren Sie im Kapitel 2 Erweiterte Syntax List function in pseudocode function calendar_get_event_list range amp timestamp amp description while current_timestamp lt r
285. ed Memory XML Zib Short conditional statements Miscellaneous Tobias O views avg rating XOR with PHP3 PHP Core Language gt Mathematical Operations Tobias Ratschiller O views avg rating String Handling PHP Core Language gt Strings Tobias Ratschiller G2 O views avg rating C constants Miscellaneous Tobias R O views avg rating Return multiple variables Miscellaneous Boaz Yahav Gl O views avg rating Ey Abbildung 7 1 Der Startbildschirm der Wissensdatenbank Document Done 288 Pearson A ADDISON WESLEY Education Wissensrepr sentation Das System wurde mit PHPLib zur Datenbankabstrahierung und HTML Schablonen realisiert Mit den folgenden Er rterungen erhalten Sie einen umfassenden berblick ber die Anwendungsentwicklung mit PHPLib Abbildung 7 1 zeigt den Startbildschirm der Anwendung 7 1 1 Anforderungskatalog Wie in Kapitel3 Anwendungsdesign ein Praxisbeispiel besprochen beginnt ein Projekt mit dem Aufstellen eines Anforderungskatalogs In der Regel ist dies ein iterativer Prozess der in enger Zusammenarbeit mit dem Kunden durchgef hrt wird und von einem Systemanalytiker Projektleiter Berater h ufig auch Programmierern geleitet wird Die Analyse des Pro blemfeldes und das Erstellen eines Anforderungskatalogs geh rt zu den wichtigsten Phasen der Softwareentwicklung die einen gro en Einfluss auf den Erfolg des Projekts haben Dieses Projekt wurd
286. edoch schneller und bin rsicher Tab 9 14 Vordefinierte Makros zur Ausgabe von Werten aus einer Funktion 424 Pearson vy ADDISON WESLEY Education R ckgabe von Werten Makro Beschreibung RETURN_EMPTY_STRING Gibt einen leeren String aus RETURN_FALSE Gibt den booleschen Wert false aus RETURN_ TRUE Gibt den booleschen Wert true aus Tab 9 14 Vordefinierte Makros zur Ausgabe von Werten aus einer Funktion Hinweis Die Makros in Tabelle 9 15 setzen nur den Ausgabewert sie geben sie nicht aus Ihrer Funktion aus Makro Beschreibung RETVAL_RESOURCE Ressource Setzt den R ckgabewert auf die angegebene Ressource RETVAL_BOOL 5007 Setzt den R ckgabewert auf den angegebenen booleschen Wert RETVAL_NULL Setzt den R ckgabewert auf NULL RETVAL_LONG Long Setzt den R ckgabewert auf den angegebenen Long RETVAL_DOUBLE Double Setzt den R ckgabewert auf den angegebenen Double RETVAL_STRING String Setzt den R ckgabewert auf den angegebenen duplicate Sting und dupliziert ihn wenn gew nscht in den internen Zend Speicher siehe auch RETURN_STRING RETVAL_STRINGL String Setzt den R ckgabewert auf den angegebe Lange duplicate nen String und erzwingt dessen Lange entspre chend der Angabe in L nge siehe auch RETVAL_ STRING Diese Makro ist schneller und bin rsi cher Es sollte verwendet werden wenn die Stringl nge bekannt ist RETVAL_EMPTY_STRING Setzt den Ru
287. eferenz 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 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 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax Warnung PHP 3 0 verf gt ber keinen vern nftigen Mechanismus zur Speicherbereinigung Sobald Sie einen Wert in eine Var
288. eft 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 s sen Es ist inzwischen in C allgemein blich Instanzen mithilfe von Klas senvorlagen 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 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 Bi
289. ehe 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 quantity this gt item_listL item quantity function drop item quantity if this gt item_list item gt quantity this gt item_list item quantity else this gt item_list item 0 86 Pearson A ADDISON WESLEY Education PHP und objektorientierte Programmierung class extended_cart extends shopping_cart function query item return this gt item_list 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 A 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 P
290. ehen da die Nachteile davon klar auf der Hand liegen sollten Setzen eines Flags in einer Datenbank Das Setzen eines Flags in einer Datenbank ist wahrscheinlich die de facto Standardmethode in PHP Verbindungen mit einer Datenbank herstellen einige Daten darin hinterlassen und sie von anderen Prozessen weiterverar beiten lassen Diese Methode ist sehr einfach zu installieren und auf allen Sys temen verf gbar hat jedoch einen Nachteil Wissen Sie von welchem Nachteil wir sprechen Der Nachteil entsteht nicht durch die schreibende Anwendung der Daten bank dem Prozess der Benutzern Nachrichten einf gt sondern kommt von dem lesenden Teil der Datenbank dem Hauptprozess der alle Benutzernach richten von der Datenbank einliest Um ein gutes Chat Gef hl zu erhalten brauchen wir so geringe Latenzzeiten wie m glich und damit sehr gute Ant wortzeiten Die Antwortzeit ist bei web basierten Chats von gro er Bedeu tung denn sie vermittelt dem Benutzer das Gef hl mitten drin zu sein Wenn die Nachrichten bertragung langsamer und langsamer wird sind Benutzer schnell frustriert und geben auf Unser Test ergab dass eine Latenzzeit von mehr als einer Sekunde zu lang ist Um unter diesem Wert zu bleiben sollte die Abruffrequenz mit welcher der Hauptprozess Nachrichten von der Datenbank einliest sehr hoch sein Bei phpChat liegt der Standardwert bei 0 5 Sekunden zwei berpr fungen pro Sekunde Sobald ein Chatsystem viele 147 P
291. eile absi chern sie mit separaten Fehlersuchroutinen ausstatten u v m Wenn Sie dies alles direkt in das Programm einbetteten w rde dies schnell zu einer unhandlichen Gr e aufgeblasen Wenn Sie dieselben Codebl cke in anderen Funktionen verwendeten m ssten Sie diese gegebenenfalls auch in allen anderen Funktionen manuell korrigieren die diese Bl cke verwenden ganz zu schweigen von Fehlern und nderungen Durch das Heraustrennen fassen Sie die kritischen Stellen zusammen durch die Korrektur einer einzelnen Zeile k nnen Sie das Verhalten aller verwandten Funktionen ndern 52 Pearson A ADDISON WESLEY Education Verwenden von Dateien zur Gruppierung von Funktionen 1 4 Verwenden von Dateien zur Gruppierung von Funktionen Wir haben gezeigt dass es sich auszahlt mehrere Dateien f r den Quellcode zu verwenden Wir empfehlen Ihnen auch f r die meisten anderen Ressour cen Dateien zu verwenden wie Konfigurationsangaben benutzerspezifische Header Footer oder andere Vorlagen Das Gleiche gilt f r alles Andere das Sie als separate Einheit von Ihrem Projekt abtrennen k nnen F r ein und dasselbe Projekt mehrere Dateien zu verwenden bietet einige Vorteile Sie erhalten kleinere Quellcode Dateien die leichter zu pflegen sind Sie k nnen mehrere Versionen f r jede Datei erzeugen anstatt f r jede kleine Anderung das gesamte Projekt durchsuchen zu m ssen Sie k nnen Ressourcen vom Projekt abtrennen und sie in
292. eilen in einer Tabelle nicht nacheinander ausgeben da der Browser alle Zeilen und Spalten einer Tabelle kennen muss um die endg ltige Gr e der Tabelle zu bestimmen Solange Sie sich darauf beschr nken Textzeilen nacheinander auszugeben und Tabel len nur verwenden wenn Sie diese als Ganzes darstellen k nnen funktioniert alles recht gut Kleine Umwege wie Streaming HTML sind bliche Tricks die Sie kennen sollten Halten Sie sich ber solche Sachen stets auf dem Laufenden Streaming HTML hat eine weitere Konsequenz die einige als Nachteil andere als Vorteil betrachten Da die Client Verbindung offen bleibt muss es immer einen Serverprozess geben der diese Verbindung verwaltet Dies bedeutet dass f r jeden Client mindestens ein Webserver Prozess vorhanden sein muss der nur f r diesen Client ausgef hrt wird Der Vorteil dieses Ver fahrens besteht darin dass es keine Mehrbelastung pro Treffer gibt Wenn der Client ein Dokument anfordert muss f r gew hnlich ein neuer Prozess erzeugt werden Das Skript das dieses Dokument generiert muss geladen analysiert und ausgef hrt werden Abschlie end werden die Daten gesendet Da der Serverprozess nun im Speicher bleibt muss das ffnen eines neuen Prozesses und Laden eines Skriptes sowie seine Interpretation f r jeden Client nur einmal durchgef hrt werden Auf Websites die ansonsten Hun derte von Treffern pro Sekunde h tten ist dies ein klarer Vorteil Jeder Prozess blei
293. einander trennen 5 4 2 PHP und mehrstufige Anwendungen Das Konzept der mehrstufigen Systeme errang in der fr hen 90er Jahren Beliebtheit und etabliert sich inzwischen zunehmend als Firmenprogramm architektur des ausgehenden 20sten und beginnenden 21sten Jahrhunderts Eine mehrstufige h ufig auch als dreistufig bezeichnete Architektur bietet eine gr ere Skalierbarkeit f r Anwendungen eine geringere Datenpflege und bessere Wiederverwendbarkeit von Modulen Eine dreistufige Architek tur bietet die M glichkeit einer technologieunabh ngigen Methode zur Ein richtung von Client Server Anwendungen f r Hersteller die Standard schnittstellen einbeziehen und f r jede logische Schicht Dienste bereitstellen Betrachten Sie das dreistufige Modell in Abbildung 5 5 kommt es Ihnen als Webanwendungsentwickler nicht bekannt vor In der ersten Stufe ist ein d n ner Client bertragen auf die Welt der Webanwendungen w re dies der Browser Die mittlere Stufe Anwendungsserver entspricht offensichtlich PHP und dem Webserver als Hostrechner w hrend die dritte Stufe aus einem RDBMS besteht Wenn Sie PHP verwenden arbeiten Sie mit einem einfachen dreistufigen Modell und zwar auf so koh rente Weise dass Sie es kaum bemerken wer den Etwas Besonderes war und ist die Verwendung von PHP als Anwen dungsserver Bis zur Version 4 0 war PHP nicht darauf ausgerichtet auf Soft wareobjekte Dritter zuzugreifen und daher nicht das beste Werkzeug f
294. 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 Abbildung 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 BEE ee 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 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax Kopie Sobald Sie den Baum wieder abarbeiten werden Sie jedoch etwas Merkwiirdiges 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 t
295. eine weitere freie Schleife in phpIRC eintre ten die auf ein weiteres Ereignis wartet oder sie k nnen die API von phpIRC nutzen um bestimmte Aktionen im Netz durchzuf hren private Nachrich ten senden Kan le verbinden verlassen usw Dieses grundlegende Basislayout erm glicht bereits eine Downstream Kom munikation so dass phpIRC in der Lage ist Nachrichten von anderen Benut zern zu empfangen Es k nnen tats chlich andere Personen mit Ihrem Skript reden Hinweis Downstream bedeutet vom Netzwerk zum Benutzer Upstream ist das Gegenteil d h vom Benutzer zum Netzwerk bung Strukturieren Sie eine Downstream Schnittstelle die phpIRC Funktionen verwendet Realisieren Sie diese auf dem Papier und machen Sie sich mit der API von phpIRC vertraut Generieren Sie dann eine einfa che Downstream Schnittstelle die ber IRC Protokoll f hrt und alle Nach richten von einem angegebenen Kanal anzeigt 3 5 2 Downstream Kommunikation Da Chatten eine Echtzeit Angelegenheit ist was bedeutet dass die Prozesse ablaufen w hrend Sie Gespr che f hren und Antworten sofort bereitstellt m chten wir die Schnittstelle nicht mit einer Latenzzeit versehen Latenzzeit beschreibt die Reaktionszeit der Schnittstelle z B die Zeit zwischen dem Moment da der Benutzer die Enter Taste dr ckt um eine Nachricht abzuschi cken bis zu dem Augenblick an dem diese im Chat Fenster erscheint Eine Latenzzeit von weniger als einer Sekunde mag zwar
296. einem Benutzernamen Password anmelden Danach kann er die Website wie jeder andere Besucher benutzen Zusammengefasst sollte die richtige Sitzungsverwaltung folgende Dinge tun Sitzungsdaten auf dem Server speichern Eine willk rliche Sitzungskennnummer zur Identifizierung eines Benut zers verwenden Die Sitzungskennnummer und nur die Sitzungskennnummer mit Cookies GET POST dem Skriptpfad oder DNS Tricks auf der Clientseite speichern Im Idealfall automatisch andere Verfahren zur Verbreitung der Sitzungs kennnummer anwenden wenn der Benutzer seine Cookies deaktiviert hat 4 1 7 PHPs eigene Sitzungsbibliothek Gl cklicherweise besitzt PHP 4 0 eine integrierte Basis Sitzungsverwaltung wie Listing 4 1 zeigt Diese ist recht einfach und direkt zu verwenden und reicht vielleicht f r Ihre Bed rfnisse Ihr fehlen aber die erweiterten Funktio nen die PHPLib bietet Da PHPLib au erdem Module f r die Verwaltung der Benutzerrechte und eine Datenbank Abstraktionsebene hat ist es immer noch eine sehr wichtige Bibliothek die wir in Kapitel 6 Datenbankzugriffe in PHP behandeln Start the session session_start Init the counter if isset counter counter 0 Output session ID and counter printf Our session ID is s lt br gt session_id print The counter value is counter Increment the counter counter Register our session variable session_register counter Listing 4
297. eitert werden kann Dies erfordert eine sorg f ltige Planung und gut durchdachte Definitionen worauf wir in diesem Kapitel immer wieder hingewiesen haben F r den Benutzer muss die API als einziger Weg erscheinen die Funktionali t t des Moduls zu erreichen die sie repr sentiert Keine Funktion fehlt und es gibt keine unn tige oder nicht direkt zum Modul geh rende Funktion Folgende Anforderungen k nnen an einen einfachen Terminkalender gestellt sein Ein Ereignis soll hinzugef gt werden Ein Ereignis soll gel scht werden Eine Liste neuer Ereignisse soll abgefragt werden Zun chst wollen wir Prototypen entwickeln Funktionen hinzuf gen oder entfernen Betrachten Sie dazu Listing 1 10 Welche Informationen ben tigen diese Funktionen m glicherweise und welche Werte geben Sie wohl zur ck void add_an_event int day int month int year int hour int minutes int seconds string description void delete_an_event int day int month int year int hour int minutes int seconds Listing 1 10 Prototypen fiir die ersten beiden Funktionen Wahrscheinlich kommt Ihnen spontan Folgendes in den Sinn Dies ist eine Schnittstelle die eine gew hnliche Liste von Parametern akzeptiert n m lich das Datum als Tag Monat Jahr Variablen und die Zeit in Form von Stun 56 Pearson A ADDISON WESLEY Education Entwicklung einer Anwendungsprogrammschnittstelle den Minuten Sekunden sowie eine Zeichenkette f r die Beschrei
298. ek Network rangiert Chek com unter den ersten zwanzig der 100 Besten des Internets www 100hot com 349 Pearson vy ADDISON WESLEY Education 8 Fallstudien BizChek belegt eine einzigartige Position im Bereich der Email Gesch ftsl sungen Obwohl die Hauptanwendung ein selbst ndiges webbasiertes Emailprogramm ist bietet BizChek auch eine Reihe von Produktivit tswerk zeugen welche das einzelne Gesch ft koh renter machen und gleichzeitig die Effizienz und Produktivit t des gesamten Unternehmens erh hen BizChek ist mehr als nur ein Email Produkt Es kann einer Firma helfen eine elektroni sche Identit t aufzubauen Die Firma kann sich und ihren Angestellten repr sentieren indem sie in ihrer Email Adresse anstelle einer generischen Adresse AOL HotMail usw ihren Firmennamen verwendet Sobald eine Firma die materiellen und immateriellen Vorteile versteht die sich aus einer webbasierten E Commerce L sung ergeben ist die Umwandlung oder Initi ierung eines Dienstes einfach Firmenbesitzer und Gesch ftsf hrer werden sich zunehmend der Vorteile bewusst die ein ausgelagertes webbasiertes Werkzeug zur elektronisfchen Kommunikation bringen kann BizChek bietet eine Reihe von Funktionen einschlie lich Email Dokumen ten Datei Sharing und Revision Taskmanager Kalenderdienste ein Schwar zes Brett der Firma u v m Nach einem finanziellen Vergleich wird sich herausstellen dass das Outsourcing die Kosten der Firma in fast a
299. ekt erstellt indem eine Instanz der berladenen Java Klasse erstellt wird Das Argument des Konstruktors gibt die zu verwendende Java Klasse an system new Java java lang System Im zur ckgegebenen Objekt k nnen Funktionen genauso eingesetzt werden wie COM Objekte Um Parameter zu lesen und zu schreiben m ssen Sie die Hilfsfunktionen getProperty und setProperty verwenden im Gegensatz zum COM Modul bei welchem direkt auf Parameter zugegriffen werden kann system new Java java lang System printf Java version s n system gt getProperty java version 5 5 Zusammenfassung In diesem Kapitel haben Sie die grundlegenden Strategien kennen gelernt die in allen Webanwendungen blich sind Sie wissen wie Sie mit Benutzereinga ben richtig umgehen wie Sie Formulare auswerten und ihren Inhalt berpr fen k nnen Sie k nnen Schablonen verwenden um Programmcode und Lay out zu trennen Dar ber hinaus wissen Sie wie Sie die Bem hungen Ihres Teams koordinieren und was Sie tun m ssen wenn mehr als eine Person an einer Datei arbeitet Wir haben die Vorteile von Versionskontrollsystemen er rtert und Sie k nnen Ihre Projekte auf der Festplatte klar strukturieren Sie k nnen das flexible CVS System intensiv nutzen Zum Schluss sind wir auf mehrstufige Anwendungen eingegangen die auch eine Implementierung von Schnittstellen f r Fremdsprachen erm glichen Ausgestattet mit diesem Wissen sind Sie nun in d
300. elcher 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 nnen Ein m gliches Beispiel ist die automati
301. ellen Ein gutes Komponentenmodell versucht diese Probleme zu l sen COM bietet die M glichkeit Komponenten ber eine globale eindeutige ID GUID zu kennzeichnen so dass Sie viele Dienste gleichzeitig verwenden k nnen Das Betriebssystem kennt alle installierten Komponenten und Ihr Programm k nnte es in der Kategorie Serverspion berwachungsdienste abfragen Au erdem verf gt COM ber eine Versionskontrolle so dass Sie verschie dene Versionen einer Komponente auf dem System einsetzen k nnen ohne dass sich diese gegenseitig behindern Schlie lich verf gt es ber eine Komponenten Introspektion mit der Sie die Methoden und Eigenschaften einer Komponente einsehen k nnen M glicherweise haben Sie schon einmal von ActiveX Steuerelementen geh rt ActiveX Elemente die auch als OLE Elemente oder dank Microsofts kreativer Marketingabteilung als OCX verbreitet wurden sind nichts ande res als eine Anwendung der COM Komponenten Sie haben einen reduzier ten Satz an COM Schnittstellen so dass sie kleiner und besser f r Netzwerke mit hoher Latenzzeit geeignet sind Sie k nnen die ActiveX Elemente nahezu genauso verwenden wie die von ausgestatteten COM Elementen 252 Pearson A ADDISON WESLEY Education Dreistufige Anwendungen Des weiteren gibt es noch DCOM das Distributed Component Object Model Protokoll das COM Komponenten f r die Welt der verteilten Netz werkanwendungen bereitstellt Im Prinzip handel
302. ellige Summe kosteten Wie w rde Ihnen ein voll ausgestattetes Inhaltsverwaltungssystem CMS gefallen das in PHP geschrieben ist Six Offene Systeme GmbH www six de besitzt eines 8 2 1 Firmenhintergrund Das vor acht Jahren gegr ndete Unternehmen Six Offene Systeme GmbH im Folgenden kurz als Six bezeichnet entwickelte und vertrieb f r verschie dene Industriezweige anspruchsvolle Datenbankanwendungen die Open Source basierte Internet und Intranet Iechnologien verwendeten Six hat sich auf die Entwicklung von individuellen L sungen spezialisiert die auf das Unternehmensziel zugeschnitten sind wobei das Hauptargument auf dem Zielmarkt der Produktpalette und den technischen Anforderungen des Kunden liegt Die Bandbreite der Beratungsdienste und kundenspezifischen L sungen von Six umfasst die Entwicklung von effektiven Gesch ftsmodel len f r die Online Pr senz die Definition von Meilensteinen mit einer diffe renzierten Strategie zur Implementierung die Unterst tzung f r die Erarbei tung von mittel und langfristigen Wirtschaftlichkeitspl nen den Einsatz von Gesch ftsprozessmodellierungen f r die optimale Ressourcennutzung die Formulierung von technischen Anforderungen sowie die Entwicklung von detaillierten Anforderungskatalogen Das gesamte Wissen aus mehr als vier Jahren Programmiererfahrung hat sich nun in zwei standardisierten kommer 353 Pearson A ADDISON WESLEY Education 8 Fallstudien ziellen L sung
303. ellt Bit Position 76543210 Bit Wert 00101010 Das Bit ganz rechts aufsen Bit 0 wird als niedrigstwertiges Bit bezeichnet Entsprechend ist Bit 7 das h chstwertige Bit Um Daten vom bin ren System in das dezimale System umzuwandeln und umgekehrt k nnen Sie in PHP BinDec bzw DecBin verwenden Die Bits in diesen Oktetts werden von bin ren Operatoren aktiviert bzw deaktiviert Setzen eines Bit Zum Setzen eines Bits in einem Wert verwenden Sie das Inklusiv ODER value value Wenn der aktuelle Wert des Flags drei ist also das erste und zweite Bit gesetzt sind und Sie das dritte Bit setzen m chten bedenken Sie die Bitz hlung beginnt bei Null wenden Sie ODER auf die aktuellen Werte 3 und 4 zwei hoch zwei an value 3 value 4 Der Wert ist jetzt sieben Im Bin rsystem sieht die Operation folgenderma en aus 0000011 0000100 0000111 Umschalten eines Bit Das Umschalten eines Bit d h das Setzen auf Eins wenn es auf Null ist und umgekehrt geschieht ber den Exklusiv ODER Operator XOR value value Wenn unser Wert 3 ist und wir das erste Bit umschalten wol len das derzeit Eins ist 0000011 m ssten wir folgende Zeile verwenden value 3 value 2 Das Ergebnis w re Eins In Bin rschreibweise sieht dies folgenderma en aus gt ma oS 0 0 0 Ss ooo ooo Orr Mor 281 Pearson A ADDISON WESLEY Education 6 Datenbankzugriff mit PHP L schen eines Bi
304. em beispielsweise dem Benutzer helfen den Bestellvorgang so m helos wie m glich abzuwickeln Amazon com hat hierf r einen Standard entwickelt Sobald sich ein Benutzer im System angemeldet hat braucht er nur noch einen einzigen Klick um ein Produkt zu bestellen Eignung f r eine bestimmte Aufgabe kann aber bereits bei einzelnen Dialogen beginnen 209 A ADDISON WESLEY Pearson Education 4 Webanwendungskonzepte Zeigen Sie nur die Informationen die der Benutzer zum Erreichen seines Ziels tats chlich braucht Stellen Sie Standardwerte zur Verf gung Tragen Sie beispielsweise in einem Datumsfeld eines Formular bereits das aktuelle Datum ein Zwingen Sie den Benutzer nicht unn tige Schritte durchzuf hren Zeigen Sie beispielsweise Fehlermeldungen nicht auf einer neuen Seite an so dass sich der Benutzer merken muss welche Felder falsch ausgef llte wurden und zur vorherigen Seite zur ckkehren muss sondern blenden Sie die Fehlermeldung direkt im Formular ein ber das PHP Standardformular Abbildung 4 2 stellt beide Ans tze gegen ber Diese Webseite zwingt Sie wieder von vorn zu Diese Webseite erm glicht Ihnen Fehler und beginnen und sich zu merken was falsch war Auslassungen direkt im Fehlerformular zu berichtigen Z ton Donate Men U mm EE ie p fe IM yon De Domenas ie T b totats D Luam oe S Ay R govine cem amp En ee Order Detail goVino com leave return and fill
305. en 293 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Die PHPLib Klasse Template erm glicht eine Trennung von Programmcode und Layout hnlich wie die Klasse EasyTemplate die wir in Kapitel 5 Grund legende Webanwendungsstrategien entwickelt haben Diese Klasse hat eine gr ere Vielfalt an Funktionen als die von uns entwickelte Klasse Sie kann beispielsweise Bl cke enthalten die Abschnitte markieren die mehr als ein mal ersetzt werden sollen was z B in Tabellenzeilen n tzlich ist Au erdem kann sie in einer Instanz mehrere Dateien ffnen und diese sehr einfach kom binieren Der Nachteil ist dass sie sich nicht so intuitiv verwenden l sst wie EasyTemplate Die Klasse Template ist vollst ndig unabh ngig von dem Rest von PHPLib so dass Sie diese auch ohne andere PHPLib Funktionen einsetzen k nnen Wenn Sie sich den Quellcode f r diese Klasse ansehen m chten finden Sie ihn in der Datei template inc der PHPLib Distribution hnlich wie EasyTemplate speichert PHPLibs Schablonenklasse HTML in separate Dateien und verwendet Platzhalter f r Daten die dynamisch von PHP ersetzt werden sollen Die skalaren Platzhalter die durch einfache Zei chenketten ersetzt werden haben dasselbe Format wie jene in EasyTemplate Listing 7 1 zeigt den Programmcode der diese einfache Schablone verarbei tet Create a template instance tpl new Template Load file assign an identifi
306. en page_open array sess gt Example Session auth gt Example_Auth printf Your session id s lt p gt n sess gt id printf Your user ID s lt br gt n auth gt auth uid printf Your user name s lt br gt n auth gt auth l uname printf You permissions s lt br gt n auth gt auth perm page_close Listing 6 4 Ein einfaches Beispiel fiir die Verwendung von Auth 274 Pearson A ADDISON WESLEY Education Authentisierung Alle Seiten welche die PHPLib Authentisierung verwenden haben diese all gemeine Struktur Zun chst wird page_open aufgerufen Der Rest des Skripts wird erst ausgefiihrt wenn der Benutzer angemeldet und authentisiert ist Sie k nnen sicher davon ausgehen dass kein Benutzer irgendwelche Informatio nen unterhalb von page_open sieht ohne dass er angemeldet ist Bei einem einzeiligen Aufruf von page_open haben Sie die vollst ndige Benutzer authentisierung in Ihrem Skript hinzugef gt Nachdem Sie die Klassen defi niert haben die Sie in der Anwendung benutzen m chten ist PHP tats chlich so leicht zu verwenden Unsere Beispiele haben bisher die Beispielklassen verwendet welche die PHPLib Distribution bereitstellt In Ihrer Arbeit m ch ten Sie m glicherweise Ihre eigenen Klassen erzeugen die von den Basisklas sen abgeleitet wurden um sie st rker an Ihre eigenen Bed rfnisse anzupas sen Daf r ist es notwendig dass Sie die interne Funktionswe
307. en WML Dokumente k nnen diesen benutzen welches den Autor entlastet indem er einige Verantwortung auf den Benutzeragenten bertr gt 7 2 4 RDF Resource Description Framework Die RDF Spezifikation definiert eine Sprache um Metadaten ber die Webressource im XML Format zu speichern Das Web mit seinen Millionen HTML Seiten ist f r automatische Maschinen wie Spiders oder Roboter sehr schwierig zu verarbeiten Suchmaschinen kommen jeden Tag an ihre Gren zen und selbst die besten Algorithmen k nnen keine sinnvollen Suchergeb nisse garantieren wie jeder wei der das Web f r die professionelle For schung verwendet Auf Webseiten kann nur eine Volltextsuche durchgef hrt werden was eine sehr begrenzte Suchmethode ist Die aktuellen HTML Versionen erm glichen eine einfache Speicherung von Metadaten zu einem Dokument Wie Sie vielleicht wissen k nnen Sie Meta tags verwenden um Schl sselw rter f r ein Dokument eine kurze Zusam menfassung oder Informationen ber den Autor zu definieren Aber was ist wenn Sie die Erstellungsdaten des Dokuments speichern wollen Oder Infor mationen ber die Editoren Kein Bibliograph wird die Metatags von HTML ernst nehmen 1998 bildete das W3C ein Komitee um ein Format zur Definition von Metada ten zu entwickeln und verabschiedete am 22 Februar 1999 das Resource Description Framework RDF RDF ist eine Erweiterung des Formats das urspr nglich f r PICS verwendet wurde einem Inhal
308. en 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 nach 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 Verknupfte 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 Pearson A ADDISON WESLEY Education Verkn pfte Listen m chten wir ein Beispiel aus der Praxis vorstellen eine Bibliothek die wir zur Verwaltung von Baumstrukturen entwickelt haben und
309. en Durch Verwendung von getenv oder nde 192 Pearson A ADDISON WESLEY Education Sicherheitsaspekte rung des Befehls variables_order k nnen Sie sicherstellen dass Sie tats chlich auf Umgebungsvariablen und nicht etwa auf vom Benutzer gelieferte Variab len zugreifen Sitzungsvariablen berschreiben stets Variablen die von anderen Bereichen kommen Da sie aus einer bereits gesicherten Vertrauenszone stammen ent fallen damit viele Sicherheitsprobleme 4 2 2 Erfinden Sie die Kryptografie nicht neu Kryptografie ist die Wissenschaft f r die Verwendung von Formeln zur Ver schl sselung bzw Entschl sselung von Daten Sie erm glicht Ihnen sensible Daten zu speichern oder ber unsichere Kommunikationskan le zu bertragen und zwar so dass sie von keinem anderem als dem beabsichtigten Empf nger gelesen werden k nnen Datenverschl sselung ist eine Wissenschaft f r sich Versuchen Sie erst gar nicht einen eigenen Verschl sselungsalgorithmus zu erfinden Verwenden Sie bew hrte Algorithmen wie etwa RC5 oder Blowfish Verschl sselung mit Mcrypt Funktionen Wenn Sie PHP mit dem Modul mcrypt kompiliert haben stehen Ihnen eine Viel zahl von m chtigen Verschl sselungs und Entschl sselungsalgorithmen zur Verf gung Der Abschnitt Die Mcrypt Funktionen zeigt Ihnen wie Sie dieses Modul verwenden und wie Sie herausfinden welche Algorithmen auf Ihrem System unterst tzt werden Es gibt zwei Arten von Verschl s
310. en 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 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 inneren Schleifen von Spielen beispielsweise den Prozeduren die zum Kopieren des Pufferinhalts in den Bildschirmspeicher dienten war und ist Zeit der kritische Faktor Da die Verarbeitungszeit jedoch keine unersch pfli che 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 118 Pearson A ADDISON WESLEY Education Polymorphisierung und selbstmodifizierender Code
311. en entweder gar nicht zu realisie ren oder ein Alptraum f r den Programmierer Obwohl Sicherheit durch Ver schleierung niemals ein gutes Prinzip ist m chten Sie manchmal vielleicht nicht dass der Benutzer mithilfe der View Source Funktion Ihre berpr fungsregeln in seinem Browser sehen kann Wenn es sehr zuverl ssig zu verwenden w re w re JavaScript oder allge mein eine berpr fung auf der Clientseite nat rlich unsere erste Wahl Der Hauptvorteil der berpr fung auf der Clientseite besteht in der Geschwin digkeit Die syntaktische berpr fung k nnte sofort erfolgen so dass die For mulardaten nicht mehr an den Webserver geschickt dort analysiert und anschlie end als komplette Seite wieder an den Browser zur ck geschickt werden m ssten alles eine sehr erm dende und langsame Prozedur Bisher kann JavaScript jedoch nur als zus tzliche Methode f r die berpr fung auf der Serverseite eingesetzt werden Damit kommt PHP ins Spiel Selbst mit PHP gibt es viele M glichkeiten der Formular berpr fung Die meisten neuen Benutzer werden sich f r die direkte Methode mit zwei separaten Dateien entscheiden eine mit dem HTML Code des Formulars und eine mit dem PHP Aktionsverarbeitungs skript Dieses Verfahren ist traditionell f r die Skripterstellung mit Perl CGI vorgesehen In den meisten F llen lehnen wir dieses Szenario ab weil es meh rere Nachteile hat Sie brauchen zwei separate Dateien So nichtig dies auch kl
312. en genau so durchsuchen k nnen wie assoziative Arrays Sie gibt alle Klassenvariablen und die Namen von Methoden als Zeichenketten aus Jedes Mal wenn ein Element gefunden wurde wird das Element count in dem entsprechenden elements im Array Eintrag hochgesetzt Im Eintrag des Elternelements Eltern bezieht sich auf das zuletzt ge ffnete Elementtag wird der Name des aktuellen Elements dem Array childs angeh ngt Das Eltern element wird mit dem Schl ssel parents zum Array Eintrag hinzugef gt Der brige Programmcode durchl uft das Array elements und seine Unterarrays mehrfach um statistische Werte anzuzeigen Dies ergibt zwar eine sch ne Ausgabe aber der Code an sich ist weder besonders elegant noch verf gt er ber clevere Tricks Es ist eine einfache Schleife die Sie m glicherweise jeden Tag verwenden nur um die Aufgabe zu erledigen 7 2 7 DOM das Dokumentenobjektmodell Die andere Hauptfamilie der XML Parser sind jene die einen Zugriff auf eine Document Object Model DOM Struktur erm glichen Wie Sie gesehen haben m ssen Sie bei ereignisbasierten Parsern h ufig Ihren eigenen Daten strukturen errichten Der DOM Ansatz vermeidet dies indem er im Haupt 327 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie speicher eine eigene Struktur generiert Anstatt auf bestimmte Ereignisse zu reagieren arbeiten Sie mit dieser Struktur um das Dokument zu verarbeiten W hrend ereignisbasierte Pa
313. en sie ausgef hrt werden und welche Einstellungen m glicherweise notwendig sind Selbst wenn Sie ber kein Hintergrundwissen verf gen und auf einen anspruchsvollen und komplizierten Algorithmus sto en k nnen Sie zumin dest schnell feststellen welche Aufgabe er hat und wann er ausgef hrt wird Es w re einfach Beispiele aufzuf hren und zu sagen Machen Sie es so aber wir m chten dass Ihnen dieses Kapitel eine solide Grundlage f r die Erstel lung professionellen Programmcodes gibt Es soll den Unterschied zwischen gr ndlich durchdachtem Programmcode und gew hnlicher Hackerei zeigen Es w rde den Rahmen sprengen alle Aspekte guten Programmierens so intensiv zu er rtern wie wir es gerne w rden aber dieses Kapitel vermittelt Ihnen einen guten Start Wir empfehlen Ihnen dringend sich speziellere Lite ratur zu besorgen um sich mit den Einzelheiten des Software Designs und der Entwicklung vertraut zu machen Dieses breite Feld ist fast eine Wissen schaft f r sich ber das es eine Menge Abhandlungen gibt die meisten sind sehr trocken und theoretisch und in der Praxis nicht zu gebrauchen Die wich tigsten Themen haben wir in den folgenden Abschnitten zusammengefasst in denen wir die grundlegenden Fragen kl ren 1 3 1 Ausw hlen von Namen Variablennamen auszuw hlen ist die Aufgabe die Programmierer am h ufigs ten tun aber am wenigsten reflektieren Mit der Anzahl an verschiedenen Vari ablennamen die in gr eren
314. en Sie beachten sollten inwiefern Tauglichkeit von Bedeutung ist und wie Sie PHPLib f r die Sitzungsverwaltung und den Datenbankzugriff nutzen k nnen Hier finden Sie auch drei Fallstudien von aufeinanderfolgen den PHP Projekten mit denen Sie Ihren IT Manager berzeugen k nnen Teil III des Buches Uber PHP hinaus ist f r jene Leser die mehr wissen wollten als was derzeit mit PHP m glich ist Er zeigt wie PHP mit C erwei tert werden kann Dies ist die offizielle Dokumentation ber die Erweiterung von PHP die durch Zend Technologies anerkannt wurde Im Detail werden folgende Themen behandelt Kapitel 1 Entwicklungskonzepte Wenn Sie anspruchsvolle Projekte abwickeln m ssen ist die Verwendung von Kodierungskonventionen richtige Planung und eine erweiterte Syntax ein absolutes Muss Dieses Kapitel behandelt die allgemeinen Kodierungskon ventionen die fiir alle industriellen Projekte unerlasslich sind Namens und Kommentarkonventionen und erl utert wie der Quellcode in logische Module unterteilt werden kann Kapitel 2 Erweiterte Syntax Dieses Kapitel befasst sich mit der erweiterten PHP Syntax z B mehrdimen sionale Arrays Klassen variable Variablen selbstmodifizierender Pro grammcode und hnliches Kapitel 3 Programmdesign Ein Praxisbeispiel In diesem Kapitel gehen wir den gesamten Prozess zur Planung einer kom pletten Webanwendung durch mit phpChat einer Web basierten Chat Client Schnittstel
315. en drei M glichkeiten f r den Laufzeit Datenaustausch auf Der Downstream Prozess muss permanent laufen und darf nicht beendet werden Wir k nnen ihn nicht einfach ber ein POST oder ein GET f r die Datenweitergabe neu aufrufen denn dies w rde bedeuten einen weiteren Prozess zu starten der wiederum neu angemeldet neu eingerichtet usw wer den m sste Ein solcher Ansatz w rde zu st ndigen Anmelde und Abmelde 145 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel vorg ngen f hren die in einem Chat extrem st rend w ren Au erdem w rde es zu Datenverlusten f hren da in der Zeit zwischen einem Logout und einem Login viele Nachrichten bertragen werden k nnten die f r einen neu angemeldeten Client nicht sichtbar w ren Der Chat k nnte auf einen einzelnen Bot basieren der die ganze Zeit online bleibt und alle Nachrichten f r alle Benutzer in einer Datenbank speichert Die Benutzerschnittstelle m sste dann nur alle relevanten Daten aus der Datenbank auslesen Zwei Probleme sprechen jedoch gegen diese M glich keit a Der Chat w re in erster Linie datenbankgest tzt was wir vermeiden wollten und b die Clients w ren f r die anderen IRC Clients sichtbar da der Bot der einzige echte Client im Netz w re Damit w re die Benutzung eines IRC Netzwerks jedoch berfl ssig Wir brauchen also mindestens zwei unabh ngige Prozesse einen der die IRC Kommunikation bernimmt u
316. en jeweils den Wert false zur ck wenn sie auf ein leeres oder nicht zugeordnetes Element treffen oder 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 Pearson vy ADDISON WESLEY Education 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 betr
317. en niedergeschlagen die PHP einsetzen SixCMS ein Content Management System und SixAIM ein System zur Kundenbetreuung und Fakturierung die Six jetzt herausgebracht hat Derzeit sind 27 Mitarbeiter bei Six besch ftigt au erdem bietet die Firma eine hervorragende Umgebung und M glichkeiten f r Studenten aus verschiedenen Gebieten der Informa tionstechnologie und der neuen Medien die ihr Praxissemester absolvieren wollen oder ihre Diplomarbeit schreiben Von den 27 Six Mitarbeitern sind 20 direkt an der Entwicklung und Program mierung von Anwendungen beteiligt Eine der Vorteile von Six besteht darin dass ihre Entwickler ganz unterschiedliche Ausbildungs und Erfahrungsni veaus mitbringen und aus diversen Gebieten wie Informatik Physik Medien Kartographie Agrikultur Philosophie und Systemverwaltung kommen 8 2 2 _ _Open Source Gesch ft Six sieht beim Vergleich zu vielen der mehr propriet ren Technologien immer noch einen klaren Vorteil in der Nutzung der Open Source Systeme Als Marktf hrer und Anbieter von Weltklassel sungen in Deutschland und West europa hat Six im Januar 2000 eine Filiale in New York City er ffnet Von vielen Leuten wird die SixCMS Anwendung als die Nummer Eins der Content Management Systeme in Europa betrachtet Ihre Unterst tzung von mehreren Programmiersprachen f r die Schnittstelle und umfassende Funk tionalit t macht die Anwendung zu einer optimalen L sung f r die Verwal tung von dynamischen
318. en wir spater Wenn der Benutzer Cookies deaktiviert hat kann das Programm andere Mittel fiir die Verbreitung der Sitzungskennnummer einsetzen Ablauf einer Sitzung In PHP 4 0 beginnt eine Sitzung mit dem Aufruf von session_start oder indem Sie eine Sitzungsvariable mit session_register registrieren Beim Laden der Bibliothek pr ft PHP ob eine g ltige Sitzungskennnummer vor handen ist Dazu f hrt es folgende Aktionen durch 1 Wenn track_vars auf false gesetzt ist berpr ft die Bibliothek den globa len Namensraum auf eine Sitzungskennnummer Wird eine gefunden schickt die Bibliothek keinen Cookie mit der Sitzungskennnummer mehr sondern definiert die Konstante SID 2 Wenn track_vars aktiviert ist aber keine Sitzungskennnummer im globa len Namensraum gefunden wurde wird das Array HTTP_COOKIE_VARS auf eine Sitzungskennnummer hin berpr ft Wird eine gefunden dann wird weder ein Cookie gesendet noch die Konstante SID definiert 3 Wenn immer noch keine Sitzungskennnummer gefunden wurde werden die Arrays HTTP_GET_VARS und HTTP_POST_VARS auf eine Sitzungskennnum mer hin berpr ft Wird eine gefunden wird die Konstante SID definiert 176 Pearson A ADDISON WESLEY Education HTTP und Sitzungen 4 Wenn immer noch keine Sitzungskennnummer gefunden wurde wird der Pfad REQUEST_URI in Hinblick auf eine Zeichenfolge der Form lt session name gt lt session id gt analysiert Wird eine solche gefunden dann
319. en zu Ihrem Programm bertragen werden PHP bietet eine Methode um auf Variablen eines bestimmten Namensraums zuzugreifen Wenn track_vars in der HPP Konfiguration aktiviert wurde k nnen Sie f r jeden Namensraum auf ein assoziatives Array zugreifen Die folgende Tabelle zeigt die verf gbaren Arrays Array Name Inhalt HTTP_GET_VARS Variablen aus einer GET Anfrage HTTP_POST_VARS Variablen aus einer POST Anfrage HTTP_COOKIE_VARS Variablen aus Cookies HTTP_ENV_VARS Umgebungsvariablen z B SHELL HTTP_SESSION_VARS Sitzungsvariablen HTTP_SERVER_VARS Servervariablen in unserer Box argc und argv Beachten Sie dass PHP 3 0 nur die ersten drei Arrays kennt Von einigen cleveren Projektmanagern weif man dass sie den PHP Konfigu rationsbefehl register_globals nur in PHP 4 0 verf gbar auf false setzen um ihre Programmierer zu zwingen die HTTP_ _VARS Arrays zu verwenden Sie k nnen auch die Reihenfolge beeinflussen in welcher Variablen im globa len Namensraum hinzugef gt werden Standardm ig wird der Konfigura tionsbefehl variables_order auf EGPCB gesetzt Dies weist PHP an die Vari ablen in folgender Reihenfolge zu integrieren 1 Umgebungsvariablen 2 GET 3 POST 4 Cookies 5 Interne Variablen Servervariablen Hierbei berschreiben neuere Werte die lteren Bei der bergabe einer PATH Variablen in der GET Anfrage eines Benutzers w rde demnach die Umge bungsvariable berschreib
320. ende Sicherheit und lange Hacker N chte sind in dieser Phase typisch M glicher weise kennt der Programmierer alle Tricks und versteckten Funktionen einer Programmiersprache aber er hat Probleme bei der Entwicklung und Daten 21 Pearson A ADDISON WESLEY Education Einf hrung pflege im Team und mit gr eren Projekten An diesem Punkt k nnen Sie leicht erkennen wer wirklich das Zeug zu einem guten Programmierer hat Dieser stellt sich folgende Fragen Wie kann ich es umgehen dieselben Funktionen immer von neuem einge ben zu m ssen Welche Vorkehrungen muss ich treffen um meine Anwendung sicher und stabil zu machen Was muss ich tun damit meine Anwendung leichter zu pflegen ist Wie k nnen mehrere Leute effizient in einem Team zusammenarbeiten An dieser Stelle kommt unser Buch ins Spiel Wir hoffen Software Entwick lern Richtlinien f r eine bessere Entwicklung von PHP und Webanwendun gen geben zu k nnen Heute sind viele Technologien verf gbar Diese k nnen Sie nur vollst ndig nutzen wenn Sie die grundlegenden Prinzipien verste hen die hinter dem Entwicklungsprozess stehen und wenn Sie Probleml sungsstrategien entwickeln Typische Referenzhandb cher helfen bei diesen Fragen nicht weiter Zielgruppe Wenn Sie Programmier Laie sind ist dieses Buch nicht f r Sie geeignet Nut zen werden Sie wahrscheinlich in einem der folgenden F lle aus diesem Buch ziehen k nnen Sie haben bereits Anwendungen
321. endete Six eine 357 Pearson A ADDISON WESLEY Education 8 Fallstudien Reverse Proxy Technik so dass PHP f hige Server nicht auf die Bereitstel lung von Grafiken und statischen Seiten beschr nkt sind Six verwendet zur Sitzungsverwaltung eigene selbstentwickelte Mechanismen und setzt h ufig Cookies f r sitzungsabh ngige Parameter ein Das Unternehmen hat bisher keinen gro en Gebrauch von PHPLib gemacht aber hat sich von einigen exzellenten Funktionen und Ideen daraus inspirieren lassen Bei Bedarf wurde XML in eine Reihe von kundenspezifischen Anwendungen integriert In verschiedenen Projekten wurden zus tzliche offene Standards wie etwa LDAP SMTP und X509 eingesetzt In einigen seiner Entwicklungsprojekte hat Six k rzlich mit CVS eine Versionskontrolle eingef hrt Dies soll in Zukunft auf alle Entwicklungsprojekte erweitert werden Der Anstieg der Program mierer und die Er ffnung einer Filiale in Berlin erforderten ein Umdenken in Bezug auf die Organisation von verteilten Entwicklungsteams und Projekten Hierf r hat Six auch eine Reihe von eigenen Werkzeugen mit PHP entwi ckelt um die Verwaltung der Projekt und Entwicklungsressourcen zu erleichtern Einige L sungen hat Six mit unterschiedlichen Datenbanken rea lisiert einschlie lich Oracle MySQL PostgresSQL Microsoft SQL Server und Sybase Aufgrund seiner Open Source Philosophie und Kosten berlegungen bevorzugt Six f r die meisten nicht transaktionsbasierten Anw
322. endungen die Verwendung von MySQL und f r transaktionsbasierte Anwendungen wie SixAIM Oracle Sowohl f r Six als auch f r seine Kunden hat PHP stets eine gro e Rolle gespielt und spielt sie noch Die Wahl und der Einsatz von PHP wurde im Dezember 1996 mit der PHP Version 2 0 beta getroffen die heute noch eine zentrale Komponente in SixCMS ist Die Verwendung von PHP hat nicht nur die Open Source Philiosphie der Firma vorangetrieben sondern auch eine komfortable und angemessene Umgebung f r die Entwicklung von Highend Anwendungen bereitgestellt 8 2 6 PHP Ein Gesch ftsvorteil Viele der funktionellen Verbesserungen und Leistungsvorteile der Six Anwendungen lassen sich direkt in PHP realisieren genauso wie die Vorteile der raschen Entwicklung und die M glichkeit nderungen z gig und ohne erneutes Kompilieren vorzunehmen Weitere Vorteile sind das einfache Ver st ndnis und die effektive Nutzung von PHP ohne vorherige Kenntnisse oder Erfahrungen Diese Vorteile erh hen die Leistung und reduzieren gleichzeitig die zus tzlichen Entwicklungskosten Diese Branche diktiert sehr kurze Ent wicklungs und Implementierungszeiten und PHP bietet eine zuverl ssige Middleware oder Anwendungsserverkomponente die diese Laufzeitanfor derungen erf llen 358 Pearson vy ADDISON WESLEY Education MarketPlayer com 8 3 MarketPlayer com Diese ausf hrliche Fallstudie ber eine Firma die PHP in der Praxis in einer Serverfarm mit
323. ene f r den Server Diese Vorgehensweise hat den zus tzlichen Vorteil dass dieses Chatserver Programm auch als sicherer Gateway f r das IRC Netzwerk verwendet wer den kann siehe auch Abbildung 3 5 Viele private und Firmennetzwerke sind hinter Firewalls geschaltet welche die IRC Ports filtern Da dieser Chat nur per HTTP mit den Clients die nicht gefiltert werden kommuniziert ben tigt nur der Chatserver eine offene Verbindung zum IRC Server Daher beschr nken wir uns an dieser Stelle auf die Installation der Clientsoft ware die ansonsten auf der Benutzerseite unseres Webservers erforderlich w re IRC kennt alle Befehle die zum Einrichten eines leistungsf higen Chats notwendig sind und alles was das Netzwerk betrifft kann ber ein g ngiges Standardserver Programm gel st werden Wenn unsere Schnittstelle alle IRC Funktionen auf komfortable Weise unterst tzt haben wir unsere Arbeit erledigt HTTP HTTP IRC Port 80 Port 80 Port 6667 Client 1 lt F z gt i Client 2 lt i b gt C lt gt Network Link Client 3 lt _J p gt e S S e K e lt Network Link v v Clientne 3 gt Abbildung 3 5 phpChat als sicherer IRC Gateway 138 Pearson vy ADDISON WESLEY Education Schnittstelle zum Netzwerk 3 5 Schnittstelle zum Netzwerk Wie wir bereits erw hnt haben bedeutet der Einsatz vom IRC einen Mehrauf wand f r die Verarbeit
324. ennnummer sehr schwierig ganz zu schweigen bei Dutzenden von Variablen Daher sollten Sie die Daten auf dem Server speichern Wo Sie diese genau ablegen ist nicht wichtig es kann in einem relationalen Datenbank Verwal tungssystem RDBMS einer reinen Textdatei einer dBASE Datei usw sein Vorzugsweise sollten Sie eine relationale Datenbank als Speichermedium w hlen da Webanwendungen in der Regel bereits solche Datenbanken wie etwa MySQL verwenden Um die Daten einem Benutzer zuzuordnen brauchen Sie eine Sitzungskenn nummer einen Schl ssel der einen Benutzer an seine Daten bindet Wie jedoch zuvor erw hnt hat HTTP jedoch keinen Mechanismus um Benutzer zu kennzeichnen Wie sollten Sie den Benutzer dann kennzeichnen Eine Idee die einem sofort in den Sinn kommt ist die Verwendung der Benut zer IP Adresse Dieser Ansatz mag zwar auf den ersten Blick logisch erschei nen er scheitert jedoch an den mit ihm verbundenen Problemen Viele Service Provider zwingen Benutzer einer W hlleitung Proxyserver zu verwenden REMOTE_ADDR zeigt hier die IP des Proxy Wenn zwei AOL Benutzer versuchten die Webanwendung zur gleichen Zeit zu verwen den g be es ein Durcheinander Einige Service Provider z B Provider f r den Kabelzugriff ndern die IP Adressen ihrer Benutzer von Zeit zu Zeit um zu verhindern dass sie von Webservern ausgef hrt werden Schlie lich k nnte es passieren dass ein Benutzer seine Internetverbin dung sch
325. ennnummer zu einem sp teren Zeitpunkt ffnet nimmt er die vorherige Sitzung einfach wieder auf anstatt eine neue Sitzung zu starten Dies ist m glicherweise nicht in Ihrem Interesse Setzen Sie gc_probability jedoch auch nicht auf einen zu hohen Wert insbesondere wenn Sie Sitzungen in Dateien speichern In diesem Falle werden bei der Durchf hrung der Speicherbereinigung mit stat alle Sit zungsdateien genannt und die letzte Anderungszeit dieser Sitzungen ber pr ft Dies ist eine sehr teure Operation die nicht allzu h ufig gestartet wer den sollte In der Regel ist ein Wert zwischen 5 und 10 f r gc_probability angemessen insbesondere dann wenn Sie Sitzungen l schen sobald Sie eine Transaktion beendet haben z B wenn sich ein Benutzer in Ihrem Shop abmeldet 178 Pearson A ADDISON WESLEY Education HTTP und Sitzungen Speichermodule Zum Lesen und Speichern von Sitzungsdaten verwendet PHP Speichermo dule Damit wird der Backend der Bibliothek abstrahiert Derzeit gibt es drei Speichermodule files mm und user Standardm ig verwendet PHP das Modul files um Sitzungsdaten auf der Festplatte zu speichern Es erstellt eine Textdatei die nach der Sitzungskennnummer benannt wird und legt sie in tmp ab F r das vorhergehende Beispiel s he der Inhalt der Datei folgender ma en aus hierbei handelt es sich um eine serielle Darstellung der Vari ablen counter i 4 Wahrscheinlich m ssen Sie auf diese Datei nie direk
326. ent zu durchsuchen w rden Sie das Attri but chi ldNodes verwenden das alle Tochterknoten enth lt sowie das Attribut nextSibling das den n chsten Knoten auf der gleichen Ebene enth lt Um die Verzeichnisstruktur zu ndern k nnen Sie Methoden wie appendChild und removeChi 1d verwenden Die einzigen Objekte die nicht direkt von der Schnittstelle Node abgeleitet wurden sind CDATASection Text und Comment Text und Comment werden von der Schnittstelle CharacterData abgeleitet und CDATASection erbt Text Die Schnitt stelle CharacterData erweitert Node um eine Reihe von Attributen und Metho den f r den Zugriff auf Zeichendaten Mit substringData k nnen Sie bei spielsweise einen Teil der Zeichendaten extrahieren Beispiel Analyse eines kurzen Dokuments mit dem DOM Den besten Eindruck ber die konkrete Funktionsweise des DOMs erhalten Sie indem wir uns ansehen wie ein einfaches XML Dokument von einem DOM kompatiblen Prozessor verarbeitet wird Dazu erstellen wir ein kurzes Buchdokument lt xml version 1 0 gt lt DOCTYPE book SYSTEM docbookx dtd gt lt book gt lt title gt Cutting Edge Applications lt title gt lt para language en gt Sample paragraph lt para gt lt book gt Eine DOM Repr sentation dieses Dokument wird in einer hierarchischen Struktur wie jener in Abbildung 7 5 organisiert In einer DOM kompatiblen API sollte der Code so hnlich aussehen wir der folgende Pseudocode Constru
327. entweder eine Meldung ausgegeben die besagt dass keine Eintr ge gefunden wurde oder die Liste der gefundenen Eintr ge Im Listing passt der Code auch die Meldung an je nach dem ob ein Eintrag oder mehrere Eintr ge gefunden wurden 1 entry found bzw x entries found Dies ist ganz klar ein Lay out Problem denn die Anzahl der gefundenen Eintr ge beeinflusst in keiner Weise die Programmlogik In einer idealen Umgebung w re der Entwickler selbst in der Lage diese Meldungen bereitzustellen Vielleicht m chte der Entwickler die Meldung No entries found rot und fett gedruckt und die Anzahl der gefundenen Eintr ge gro und fett gedruckt ausgeben In unse rem Fall m sste der Entwickler den Programmierer bitten den Code entspre chend zu ndern Sp testens nach der dritten nderung wird dies sowohl f r den Entwickler als auch f r den Programmierer sehr nervenaufreibend Ein Ansatz f r die L sung dieses Problems besteht darin der Schablone einen Teil der Kontrolle zur ckzugeben und den Entwickler ber die Schablonen logik entscheiden zu lassen Die Schablonen enthielten dann eine einfache Metaskriptsprache die folgenderma en aussieht TRIES_FOUND gt 1 ENTRIES FOUND entries found h D de D h CO oo pm e aD MeO es TRIES FOUND 1 entry found e TRIES FOUND 0 entries found for your search ty ae wi Nat rlich existiert ein flie end
328. er peter xml com Peter Wiggin image channel gt new_child image image gt new_child title XML News and Features from XML com image gt new_child url http xml com universal images xml_tiny gif image gt new_child link http xml com pub image gt new_child width 88 image gt new_child height 31 print htmlspecialchars doc gt dumpmem Listing 7 5 Verwendung von LibXML Routinen zum Erstellen von XML Dokumenten XML B ume Mit den oben vorgestellten Methoden werden separate Objekte f r das Doku ment und die einzelnen Knoten erstellt Dies eignet sich sehr gut f r das Durchschleifen durch das Dokument wie das Beispiel mit dem XML Pretty Printer zeigt Aber der Zugriff auf einzelne Elemente wird dadurch leicht erschwert Erinnern Sie sich noch an unser Beispieldokument Hello World lt xml version 1 0 gt lt greeting gt Hello World lt greeting gt 338 Pearson A ADDISON WESLEY PHP und XML Education Um auf den Inhalt des Stammelements zuzugreifen m ssen Sie folgenden Code verwenden Create xmldoc object from file doc xmldocfile test xml or die XML error while parsing file file wi Access root node root doc gt root Access root s children children root gt children Print first child s content print children 0 gt content Dieses Beispiel hat nur eine Tiefe Stellen Sie sich vor w
329. er bergang zwischen Trennung von Code und Layout und Vermischung dieser beiden M chten Sie Layout im Programm code oder Programmcode im Layout haben Dies ist die klassische Frage vom Ei und der Henne Zum Zeitpunkt als dieses Buch erstellt wurde gab es erste Bem hungen eine Schablonen API f r die PHP Standarddistribution zu er stellen Das obige Metaskriptbeispiel stammt aus dem Entwurf von Andrei Zmievski f r eine Schablonensprache Andrei der ein Bef rworter der Schab lonen API und Entwickler des PHP Kerns ist plant eine Reihe von weiteren Funktionen zu implementieren z B die vordefinierten Standardvariablen 0DD und EVEN in dynamischen Bl cken Damit lie en sich die beliebten Farb 299 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie nderungen in wiederholten Tabellenzeilen realisieren die ansonsten vom Programmierer eingef gt werden m ssten Dar ber hinaus m chte Andrei die Schablonen API direkt in PHP integrieren was einige Vorteile gegen ber heutigen Schablonenl sungen wie jenen von PHPLib bringen w rde Zu n chst einmal w re es Standard und Softwareentwickler k nnten sich darauf verlassen Da es direkt im PHP Kernprogramm integriert w rde k nnte dies auch zu einer erheblichen Leistungssteigerung f hren Die analysierte Scha blonen k nnten beispielsweise im Speicher gecacht werden 7 1 4 Rekursion mit SQL Unsere Anwendung erm glicht eine unbegrenzte Verschachte
330. er Lage Anwendungen der Spitzentechnologie zu konzipieren und zu implementieren auf die wir im weiteren Verlauf eingehen werden 256 Pearson vy ADDISON WESLEY Education Datenbankzugriff mit PHP Wenn Sie mit den Werkzeugen des Zimmermanns spielen besteht die M glichkeit dass Sie sich in die Hand schneiden Datenbanken geh ren zum t glichen Handwerkszeug eines Webentwicklers Dieser sollte SQL zumindest genauso gut kennen wie PHP Bei den meisten Datenmodellen von Webanwendungen ist eine relationale Datenbank im Spiel W hrend unerfahrene Benutzer m glicherweise versuchen den Over head den SOL und ein relationales Datenbankverwaltungssystem RDBMS mit sich bringen zu umgehen werden erfahrene Entwickler seine Funktionen sch tzen Alles was etwas anspruchvoller ist z B gleichzeitige Zugriffe Such und Sortierfunktionen oder Beziehungen zwischen verschiedenen Datens tzen kann schnell zum Alptraum werden wenn Sie herk mmliche Speichermethoden wie zweidimensionale Dateien oder Arrays verwenden Datenbanken sind auf die effiziente Organisation und Abfrage von Daten spezialisiert und in den meisten F llen gibt es keine Notwendigkeit diese Funktionen in Pseudo Datenbanksystemen zu imitieren Dieses Kapitel zeigt Ihnen wie Sie mit PHPLib auf Datenbanken zugreifen und beschreibt zwei der zahlreichen Funktionen dieser Bibliothek Authenti sierung von Benutzern und Verwaltung von Zugriffsrechten 6 1 PHPLib Die PH
331. er normalen Daten bankverwendung ausmachen abstrahiert um diese Abfragen datenbank unabh ngig zu gestalten Bisher funktioniert diese Klasse nur f r MySQL und Oracle 7 und h her Die Datenbank Abstrahierungsschicht von PHPLib hat noch zwei weitere Funktionen die mindestens genauso wichtig sind wie Portierbarkeit und sich in ihren t glichen Anwendungen wirklich zeitsparend auswirken Diese Funktionen werden wir in den folgenden Abschnitten beschreiben 261 Pearson A ADDISON WESLEY Education 6 Datenbankzugriff mit PHP 6 2 2 Fehlersuchmodus Die Klasse DB_Sql hat einen Fehlersuchmodus in welchem Sie sehen k nnen welche Abfragen an die Datenbank geschickt wurden Um die Fehlersuche einzuschalten m ssen Sie lediglich eine Instanz der Klasse erzeugen und in Ihrem Programm db gt Debug true einf gen In unserem Programm verwen den wir in der Regel ein Konstante DEBUG die wir der Klasse DB_Sq auf etwa diese Weise zuordnen define DEBUG true db gt Debug DEBUG Sobald die Fehlersuche eingeschaltet ist gibt die Klasse DB_Sq einige Werte aus den Funktionsaufrufen sowie zus tzliche Informationen aus Dies kann sehr hilfreich sein wenn wir einen Fehler suchen oder berpr fen m chten ob die SQL Abfragen korrekt sind die Ihr Skript generiert 6 2 3 Fehlerbehandlung PHPLib k mmert sich um alle Fehler die im Zusammenhang mit datenbank bezogenen Funktionen auftreten Ein positiver Nebeneffekt ist dass
332. er schlecht wenn Sie herausfinden dass IRC die Struktur komplizierter macht nachdem Sie sich daf r entschieden haben Bisher sind wir jedoch von einem allgemeinen Verst ndnis ber IRC Netzwerke ausge gangen und haben die Programmplanung in den Vordergrund gestellt Nach 134 Pearson A ADDISON WESLEY Education Grundlagen des IRC Netzwerks dem wir Ihnen die richtige Methode zur Verwendung des Programms IRC gezeigt haben gehen wir jetzt auf die Einzelheiten ein die Sie zur Aus f hrung des Plans ben tigen IRC Netzwerke unterscheiden zwischen Clients und Servern Benutzer k n nen am Netzwerk nur ber eine spezielle Client Software teilnehmen die eine Verbindung vom Client zum Server herstellt Alle Server sind im Netz ber spezielle Serververbindungen miteinander verbunden Die heutigen IRC Server unterst tzen nur hierarchische Strukturen Dies bedeutet dass es keine redundanten Verbindungen zu einem Server geben darf Dadurch erh lt das Netz eine baum hnliche Struktur die einer Aufsplittung des Netz werks gleichkommt aber auch das Routing vereinfacht Alle Server m ssen lediglich alle ankommenden Daten an alle anderen Verbindungen schicken ohne zu bef rchten dass sie einem Server redundante Informationen senden Jeder Server kann eine Reihe von Clients haben Die maximale Anzahl h ngt von der Anzahl der Verbindungen ab die ein Server akzeptiert nat rlich wird sie auch durch die Netzwerkkapazit t u
333. er to it tpl gt set_file page gt basic_template inc html Assign contents to the placeholders tpl gt set_var array TITLE gt This is a Template test CONTENTS gt Hello World 3 Parse into a temporary variable identifier tpl gt parse out page Output the parsed template tpl gt p out lt html gt lt title gt TITLE lt title gt lt body gt CONTENTS lt body gt lt html gt Listing 7 1 Einfaches Beispiel der Klasse Template 294 Pearson A ADDISON WESLEY Education Wissensrepr sentation Die erste Zeile erzeugt eine Instanz der Klasse Template Der Konstruktor der Klasse hat zwei optionale Argumente Das erste optionale Argument gibt ein Basisverzeichnis an in dem sich Ihre Schablonendateien befinden Standard m ig ist dies das aktuelle Verzeichnis Das zweite Argument definiert wie Platzhalter behandelt werden die nicht in Ihrem Skript verwendet werden Die m glichen Werte sind keep comment oder remove wobei der Standardwert remove ist Bei keep bleiben Platzhalter erhalten Wenn in unserem Beispiel dem Platzhalter TITLE kein Wert zugewiesen w re w rde der Platzhalter sp ter in der analysierten Schablone unver ndert erscheinen Wenn die Variable auf coment gesetzt w re s he die Ausgabe unseres Beispiels folgenderma en aus falls dem Platzhalter TITLE kein Wert zugewiesen ist lt html gt lt title gt lt Temp
334. er verteilten Datenverarbei tung Stellen Sie sich z B vor dass Sie auf einer E Commerce Website arbei ten W re es nicht gro artig wenn Sie Kunden w hrend des Versands eine Paketprotokollfunktion zur Verf gung stellen k nnten Dies lie e sich ein fach realisieren wenn UPS oder FedEx eine M glichkeit b ten eine Abfrage nach einem versandten Artikel zu starten Durch Einf hrung von formularge st tzten und kundenorientierten Diensten die meisten Kuriere erm glichen ihren Benutzern den Weg von Paketen zu verfolgen f r die verteilte Daten verarbeitung Paketprotokollierung als programmierbare API wurde eine neue Form der Anwendungsinteraktion erm glicht In einem anderen Szenario k nnte WDDX f r die Interaktion von Server zu Server eingesetzt werden Einige Dienste arbeiten m glicherweise am besten auf einer Windows NT Plattform z B die Abfrage eines SAP Backend ber einen COM Anschluss Sie k nnten ASP f r diese Aufgabe verwenden und die Abfrageresultate als WDDX Pakete an Ihre PHP Anwendung auf dem UNIX Webserver bergeben Dort w rden die Pakete transparent in PHP Datenstrukturen wie etwas Arrays umgewandelt ohne dass eine weitere Bearbeitung n tig ist 7 3 4 Abstrahierung von Daten mit WDDX Das Wichtigste zuerst WDDX ist XML Die m glichen WDDX Strukturen werden in einer XML DTD definiert so dass g ltige WDDX Pakete stets wohlgeformte und m glicherweise g ltige XML Dokumente sind Laut Spe zifikation
335. erden 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 here return socket 112 Pearson A ADDISON WESLEY Education 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
336. erden was in vielen Situationen unerw nscht w re Um dieses Problem zu umgehen br uchten wir eine array_compact Version die es zum Zeitpunkt der Bucherstellung in PHP nicht gab Daraus k nnen wir nur folgenden Schluss ziehen Verwenden Sie PHP 4 0 In der PHP Version 3 0 unseres Beispiels siehe CD ROM muss ten wir die Variable depth verwenden um die Elementverschachtelung 326 Pearson vy ADDISON WESLEY Education PHP und XML manuell zu berwachen Dies machte eine weiter globale Variable erforder lich und ist nicht so elegant wie as array_pop und array_push aber es funk tioniert Um Informationen ber die einzelnen Elemente zu erfassen m ssen sich die Skripte alle Stellen merken an denen die Elemente auftauchen Wir verwen den die globale Array Variable elements um die verschiedenen Elemente des Dokuments zu erfassen Die Arrayeintr ge sind Instanzen der Klasse element die vier Eigenschaften hat Klassenvariablen Eigenschaft Beschreibung count H ufigkeit mit welcher das Element im Dokument gefunden wurde chars Anzahl der Bytes in Form von Zeichendaten in diesem Element parents Elternelemente childs Tochterelemente Wie Sie sehen ist es kein Problem Klasseninstanzen in einem Array zu spei chern Tipp Eine spezifische Sprachfunktion von PHP ist dass Sie Klassenstruk turen mit der Schleife while list each die wir in Kapitel 1 Ent wicklungskonzepte vorgestellt hab
337. ereich einf hrte Von Anfang an hatte er ein unglaubliches Ver trauen in mich und bewies bei der Zusammenarbeit mit mir unendliche Geduld Er war ein f nf Sterne Co Autor und ich bin froh dass ich die M g lichkeit hatte dieses Buch mit ihm zusammen zu schreiben Selbst wenn ich manchmal mit meinem Material unzufrieden war wartete er immer mit guten Vorschl gen auf Wie er bereits sagte verbrachten wir endlose Stunden im IRC mit der gegenseitigen Textkontrolle und Fehlerkorrektur des Pro grammcodes ganz zu schweigen von den unz hligen Emails Es hat defini tiv viel Spa gemacht Zus tzlich zu den oben erw hnten Danksagungen m chte ich mich bei mei nen Freunden bedanken bei denen die mich in meiner Arbeit unterst tzten und bei denen die das nicht taten Ich habe es zwar immer gehasst wenn andere Autoren bemerkten es seien zu viele um sie alle namentlich zu erw hnen aber ich muss zugegeben dass es mir genauso geht und ich mehr Schaden anrichten w rde wenn ich jemanden auslie e Ihr wisst wer gemeint ist Zu guter Letzt m chte ich meiner Familie f r Ihre Aufmunterungen und tat kr ftige Unterst tzung bei meiner Arbeit danken Sie gaben mir stets ein Zuhause wenn ich einen Platz zum Ausruhen brauchte 16 Pearson A ADDISON WESLEY Education Sagen Sie uns was Sie denken Sagen Sie uns was Sie denken Als Leser dieses Buches sind Sie unser wichtigster Kritiker und Kommentator Wir sch tzen Ihre Mei
338. erer geh ren zum PHP Entwicklungsteam und haben Programmcodes entwi ckelt die aus ihren eigenen Bed rfnissen heraus entstanden Die meisten Arbeiten zu PHP Projekten werden zwar au erhalb des Betriebs durchge f hrt gelegentlich geschieht es aber auch w hrend der Arbeitszeit BizChek unterst tzt diese Aktivit t da der entwickelte Programmcode direkt in ihr System zur ckgef hrt wird Die BizChek Entwickler haben zur Entwicklung von zahlreichen PHP Modulen beigetragen einschlie lich MCAL IMAP FTP und Aspell Urspr nglich wurden diese Module f r die Unterst tzung von BizChek entwickelt da aber auch andere Programmierer von diesen Modulen profitieren konnten und die Entwickler das Bed rfnis hatte der Gemeinschaft etwas zur ckzugeben wurden die Erweiterungen zum Kerncode von PHP hinzugef gt Einige BizChek Angestellte tragen auch zu kleineren Entwick lungen f r Apache und Linux bei 8 1 3 Begierig auf Updates BizChek wurde bereits von der PHP Version 2 0 auf die Version 3 0 umge stellt und kann auf PHP 4 0 umgestellt werden sobald die Betatestphase abgeschlossen ist Die Migration von 2 0 auf 3 0 sowie von 3 0 auf die 4 0 Beta version ging ohne Komplikationen vonstatten und erforderte nur einige klei nere nderungen Das gesamte System besteht aus ungef hr 200 Dateien und 25 bis 30 Tausend Programmzeilen und w chst t glich Da f r jedes Update nur etwa 20 Pro grammzeilen ge ndert werden m ssen sind die BizChe
339. erforderliche Ebene editor 2 aktuelle Ebene supervisor 7 logisches UND von 7 und 2 7 amp 2 ist 2 welches der erforderlichen Ebene entspricht Nun bleibt nur noch die Administratorebene brig Diese soll wiederum alle Rechte der Ebenen unter ihr erben 7 8 8 wird zum Setzen des 4 Bits ver wendet Das Ergebnis ist 15 Machen wir die Gegenprobe erforderliche Ebene supervisor 7 aktuelle Ebene admin 15 logisches UND von 15 und 7 15 amp 7 ist 7 welches der erforderlichen Ebene entspricht 285 Pearson A ADDISON WESLEY 6 Datenbankzugriff mit PHP Education Damit sind unsere Berechtigungen wie folgt definiert define PHPLIB_PERM AUTHOR define PHPLIB_ PERM EDITOR define PHPLIB_ PERM SUPERVISOR define PHPLIB_ PERM ADMIN var permissions array author gt PHPLIB_PERM AUTHOR editor gt PHPLIB PERM EDITOR supervisor gt PHPLIB PERM SUPERVISOR admin gt PHPLIB PERM ADMIN JE 6 4 Zusammenfassung In diesem Kapitel haben Sie die Basisklassen und die grundlegende Verwen dung von PHPLib kennengelernt Sie haben gesehen dass es ein sehr leis tungsf higes Werkzeug ist das Ihnen bei vielen Problemen helfen kann auf die Sie bei der Erstellung von Webanwendungen unweigerlich treffen Trotz dem ist es einfach zu verwenden nachdem Sie den notwendigen Rahmen ein gerichtet haben Au erdem bietet es eine vollst ndige Infrastruktur f r die Session Verwaltung und Authent
340. ern sollten Sie diesen Stil schnell bernehmen 9 4 1 Erweiterungskonventionen Zend wird mithilfe einiger Konventionen erstellt um seine Standards nicht zu verletzen sollten Sie seine Regeln befolgen die in den folgenden Abschnit ten beschrieben werden 9 4 2 Makros F r fast jede wichtige Aufgabe liefert Zend vordefinierte Makros die extrem praktisch sind Die Tabellen und Abbildungen in den folgenden Abschnitten beschreiben die meisten der grundlegenden Funktionen Strukturen und Makros Die Makrodefinitionen sind haupts chlich in zend h und zend_API h abgelegt Wir schlagen vor dass Sie sich mit diesen Dateien n her befassen nach dem Sie dieses Kapitel gelesen haben Diese k nnen Sie nat rlich auch sofort lesen aber es wird wahrscheinlich noch nicht alles f r Sie sinnvoll erscheinen 9 4 3 Speicherverwaltung Ressourcenverwaltung ist ein wesentlicher Faktor insbesondere bei Server software Eine der wertvollsten Ressourcen ist der Speicher und die Speicher verwaltung sollte mit besonderer Sorgfalt betrieben werden Die Speicher verwaltung wurde teilweise in Zend eingebettet und diese eingebetteten Funktionen sollten Sie konsequent nutzen aus offensichtlichen Gr nden Sie erm glichen Zend die vollst ndige Kontrolle ber alle Speicherzuweisungen Zend kann feststellen ob ein Block in Gebrauch ist unbenutzte Bl cke und Bl cke mit aufgehobenen Referenzen freigeben und damit Speicherl cher vermeiden Die folgend
341. ernen 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 my_array array Element 1 Element 2 Element 3 Hierdurch wird ein Array mit dem folgenden Inhalt erzeugt Element 1 Element 2 Element 3 Um das Prinzip von each besser zu verstehen ist es sinnvoll eine detaillierte Auflistung dieses Arrays zu erstelle
342. erpr fen an denen diese Ebene aufgerufen wird und nat rlich den zuvor geschaffenen Umweg entfernen Dies sind Arbeitsstunden oder tage die Sie von Anfang an h tten vermeiden k nnen Probleme die h ufig zwischen Erfolg und Misserfolg entscheiden da Zeit die wertvollste Ressource ist von der Sie niemals genug haben Die folgenden Abschnitte leiten Sie durch die meisten grundlegenden und trotzdem sehr wichtigen praktischen Aspekte der Entwicklung Verbesserung der Programmcode Qualit t sowie fundamentale Entwurfs und Dokumenta tionsaspekte Anschlie end erstellen wir eine Anwendungsprogramm schnittstelle API wobei wir einen direkten praktischen Ansatz verfolgen um Sie mit den neuen Konzepten vertraut zu machen bevor wir eine weitere API von Grund auf neu entwickeln d h sie zun chst theoretisch auf dem Papier entwerfen und dann ein paar praktische Prinzipien ausarbeiten die Ihnen bei der Implementierung Ihrer n chsten API helfen Stilaspekte unbe dingt zu beachtende und zu vermeidende Punkte sowie ein paar Tricks 32 Pearson vy ADDISON WESLEY Education Kodierungskonventionen 1 3 _Kodierungskonventionen Was ist der Unterschied zwischen gutem und schlechtem Programmcode Eigentlich sehr einfach Guter Programmcode wirklich guter Code l sst sich fast wie ein Buch lesen Sie k nnen an einer beliebigen Stelle anfangen und wissen sofort wozu die Zeilen dienen die Sie lesen unter welchen Umst nd
343. erpr fung von Typen vor Des weiteren sind in PHP Klassen aber keine strukturierten Typen bekannt Es gibt eine Vielzahl weiterer Beispiele wie dieses aber das Wesentliche haben Sie wahrscheinlich erfasst PHP vereint verschiedene konzeptuelle Ans tze in einem einzigartigen neuen Ansatz Um Web Anwendungen erfolgreich mit PHP zu erstellen sollten Sie zun chst die folgende Frage beantworten Ist PHP die ideale Sprache f r mein Projekt Gute Frage Wir w ren dumm wenn wir nein sagten Wer schreibt schon ein Buch ber etwas das er f r schlecht h lt Lassen Sie uns die Frage neu formulieren Gibt es eine bessere Sprache als PHP f r mein Projekt Diese Frage k nnen Sie sicher beantworten Wenn Sie Web Anwendungen entwi ckeln ist PHP die geeignete Sprache f r Sie 1 2 Die Bedeutung der Planung Warum Sie diesen Abschnitt lesen sollten Selbst wenn Sie bereits ein professioneller Programmierer sind der mit PHP vertraut ist empfehlen wir Ihnen die folgenden Abschnitte zu lesen das sie die Grundlagen f r eine erfolgreiche Entwicklung enthalten Auch wenn Sie sich bereits mit den angesprochenen Themen auskennen sollten Sie sich die Zeit nehmen den Text durchzubl ttern Sie k nnten neue Informationen ent decken andere Ansichten andere Ans tze andere L sungen Je mehr Sie ber die Herangehensweise an die verschiedenen Aspekte Ihrer k nftigen Projekte wissen um so besser sind Sie in der Lage die kritischen Teile exakt z
344. erum ihre Kollegen ber den Zusammen schluss informieren Wie wir bereits erw hnt haben kann CVS eine effektive Kommunikation im Team nicht ersetzen Es kann sie aber unterst tzen Der CVS Server kann so eingerichtet werden dass er bei jeder bertragung zum Zentralarchiv eine bestimmte Aktion durchf hrt Das Verschicken einer Email an einen Anschriftenlistenserver k nnte eine solche Aktion sein Indem Sie eine Anschriftenliste oder Aliasgruppe f r jedes Projekt einrichten k n nen Sie Meldungen ber Weiterleitungen einschlie lich Protokolleintr ge leicht an alle Mitglieder verbreiten Zu diesem Zweck muss eine der CVS Verwaltungsdateien n mlich die Datei loginfo bearbeitet werden Diese Datei legt fest wie Informationen ber das Zur ckschicken der Daten gehandhabt werden Sie k nnen diese per Mail verschicken in eine Datei protokollieren sie in einer Datenbank speichern oder hnliches Sie k nnen die administrativen Dateien direkt im Verzeichnis CVSROOT des Sys tems ndern Wir empfehlen trotzdem sie per CVS zu ndern Auf diese Weise stehen Ihnen alle regul ren Funktionen und das Sicherheitsnetz von CVS zur Verf gung Um eine Sitzung zu starten lesen Sie das Verzeichnis CVSROOT aus jane dev home jane gt cvs checkout CVSROOT Anschlie end bearbeiten Sie die Datei loginfo Der erste Teil der Zeile besteht aus einem regul ren Ausdruck der mit dem bertragenen Verzeichnis der Datei verglichen wird Wenn e
345. esamtanzahl der Reihen im Ergebnis feld erscheinen Zuletzt eingef hrte pri mysql _insert_id Kein quivalent in m re Schl sselkennnum PHP Funktionen mer Tab 6 1 APIs f r den Zugriff auf MySQL und Oracle F r gew hnlich werden Sie Ihre Datenbank nicht w chentlich ndern so dass dies m glicherweise f r Sie nicht von so gro er Bedeutung ist Selbst mit PHPLib ist Portierbarkeit zwischen Datenbanken nur ein Gedankenspiel solange Sie sie nicht von Beginn der Projektplanung an einbeziehen In der Praxis zeigt es sich dass das Problem nicht die Portierung der API ist son dern die datenbankspezifischen Funktionen Einen wirklich portierbaren Datenbankcode k nnen Sie nur erzeugen wenn Sie akzeptieren dass Sie keine spezifischen Funktionen eines RDBMS verwenden Dies f hrt jedoch dazu dass Sie die Funktion in Ihrem Programmcode neu erzeugen m ssen was die Anwendungen m glicherweise schwerer zu pflegen und langsamer macht Wenn Ihr Ziel ist portierbaren Code zu programmieren m ssen Sie die spezi ellen Eigenschaften der zugrunde liegenden Datenbank umgehen PHPLib kann diese Aufgabe etwas vereinfachen Es hat beispielsweise eine integrierte Sequenzverarbeitung und einfache Tabellensperrmechanismen die daten bankunabh ngig arbeiten Vor kurzem haben PHPLib Entwickler die Klasse Query entwickelt welche einfache Abfragen Einf gungen Aktualisierungen where Anweisungen sowie einige andere die etwa 80 d
346. eschriebe nes Handbuch f r Ihr Mobiltelefon einen neuen Monitor oder andere techni sche Ger te erwarten selbst wenn Sie diese in dem kleinsten Gesch ft gekauft haben erwarten Ihre Kunden eine gute Dokumentation von Ihnen nicht zu vergessen dass Sie m glicherweise eine Menge Geld daf r bezahlt haben Wie bei Kommentaren werden ausf hrliche Dokumentationen blicherweise mithilfe von RAD Programmen erstellt Leider gibt es bisher noch keine Werkzeuge die speziell auf PHP zugeschnitten sind Die Handbuch Erstel lung bleibt daher eine nicht unterst tzte und undankbare Aufgabe Trotzdem ist sie notwendig Sie sollte jedoch nicht Ihre Produktivit t behindern Ein vollst ndiges Handbuch sollte wie ein kleines Buch aufgebaut sein und fol gende Punkte enthalten 54 Pearson vy ADDISON WESLEY Education Entwicklung einer Anwendungsprogrammschnittstelle Einf hrung Inhaltsverzeichnis Benutzer Leitfaden Technische Dokumentation Entwickler Leitfaden Vollst ndige Referenz aller Funktionen Der Benutzer Leitfaden sollte ausf hrlich alle Funktionen Ihrer Anwendungs programmschnittstelle sofern vorhanden f r den Durchschnittsbenutzer beschreiben Gehen Sie nicht zu sehr ins technische Detail es sollte nur eine Wie Sie tun Beschreibung sein Behandeln Sie aber jeden Aspekt Die tech nische Dokumentation sollte f r technisch interessierte Benutzer und Admi nistratoren geschrieben werden und Auskunft ber die tec
347. ese Schw che l sst sich mit einem kleinen 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 Pearson A ADDISON WESLEY Education Assoziative Arrays sor spuckt alle Eingabedatenelemente gr er als 31 einfach aus ohne ihnen einen Z hler voranzustellen Damit erreichen wir f r alle Eingabewerte gr fer als 31 einen 100 optimalen Algorithmus 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 whi le status check if the current byte matches the last one if old_byte current_byte there s a match increase counter current_count does
348. ess_mysqiL password or die mysql_ error return true function sess_mysql_read sess_id global sess_ mysql Select the data belonging to session sess id from MySQL session 181 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte table result mysql_db query sess_mysqI db SELECT data FROM gt sess mysqi table WHERE id sess_id or die mysql_ error Return an empty string if no data was found for this session if mysql_num_rows result 0 return Session data was found so fetch and return it row mysql_fetch_array result mysql_free_result result return row data J function sess_mysql_write sess_id val global sess_mysq Write the serialized session data val to the MySQL session table result mysql_db_query sess_mysql db REPLACE INTO sess mysqi table VALUES sess_id val null wor die mysql_error return true function sess _mysql_destroy sess_id global sess_mysq Delete from the MySQL table all data for the session sess_id result mysql_db_query sess mysql db DELETE FROM sess mysqi table WHERE id sess_id or die mysql_ merror return true function sess_mysql_gc max_lifetime global sess_ mysql 182 Pearson A ADDISON WESLEY Education HTTP und Sitzungen Old values are values with a Unix less than now max_ lifetime
349. et 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 einfach 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
350. facher indem sie festlegt dass beim Einf gen von DocumentFragment in einen Knoten nicht DocumentFragment selbst sondern nur die Tochterknoten von DocumentFragment in den Knoten eingef gt werden DocumentType Der Knoten DocumentType enth lt sofern vorhanden die Dokumententyp deklaration eines Dokuments Diese Schnittstelle hat Nur Lese Status und kann bisher nicht vom DOM ge ndert werden Element Jedes Element in einem Dokument wird durch einen Element Knoten repr sentiert Den Namen eines Elements k nnen Sie mit dem Parameter tagName ermitteln Au erdem definiert diese Schnittstelle eine Reihe von Funktionen um Elementattribute zu setzen und zu erfassen und um auf Unterelemente zuzugreifen 329 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Attr Der Knoten Attr repr sentiert ein Elementattribut in einem Element Objekt Den Namen und den Wert des Attributs ermitteln Sie mit den Variablen name und value dieser Schnittstelle Die Variable specified gibt an ob der Wert die ses Attributs vom Benutzer angegeben wurde oder ein Standardwert ist der in der DTD angegeben ist EntityReference Dieser Knoten repr sentiert einen Entit tenverweis der im XML Dokument gefunden wurde Bedenken Sie dass Zeichenverweise z B amp 1t vom XML Parser expandiert werden und daher nicht als Enti tyReference Knoten darge stellt werden Entity Dieser Knoten repr sentiert eine analysierte
351. frage von Netcraft wurde PHP bei ber elf Millionen insgesamt analysierten Servern im Februar 2000 auf ber 1 4 Millionen Dom nen verwendet Die BizChek Entwickler sind der Mei 350 Pearson A ADDISON WESLEY Education BizChek com nung dass sich angesichts dieser Ergebnisse PHP und andere Open Source Produkte an die Spitze der entsprechenden Bereiche setzen und sich selbst gegen kommerzielle Mitbewerber aus etablieren Firmen behaupten werden Bei ihrer Suche nach einer Skriptsprache testeten die BizChek Entwickler viele brauchbare Alternativen die m glicherweise ihren Anforderungen gen gten Die ersten zwei Kandidaten waren Perl und verschiedene CGI Skriptsprachen Danach wurde Microsofts treibende Kraft ASP unter die Lupe genommen Schlie lich waren zwei Geheimtipps dran Cold Fusion und PHP Da eine ihrer Hauptanforderungen die serverseitige Programmierung und die Anbindung an eine Datenbank war schlossen die BizChek Entwick ler von vornherein alle clientseitigen Skriptsprachen aus Sie mochten Perl zwar wegen seiner vielseitigen Einsetzbarkeit aber sie hatten den Eindruck dass diese Sprache niemals f r den Einsatz im Web optimiert wurde und bei der Verwaltung von starken Datenverkehr ber mehrere Websites versagen w rde CGI und Perl Skripte k nnen schnell den gesamten Speicher und die CPU belegen was zu Leistungseinbu en f hrt Da ASP Cold Fusion und PHP mit dem Webserver zusammenarbeiten ohne zus tzliche Prozess
352. function get_online_status user_name function check_online_status user_name function user_status user_name 48 Pearson A ADDISON WESLEY Education Kodierungskonventionen function user_online user_name function is_user_online user_name Je nach R ckgabetyp ist nur der erste oder letzte Name dieser Liste passend Angenommen diese Funktion gabe einen booleschen Wert zuriick dann w rde sie in der Regel in Zusammenhang mit einer if Klausel benutzt Dies s he in etwa so aus Alternative 1 if user_status user_name Alternative 2 do something if is_user_online user_name do something Im ersten Fall sieht der Funktionsname etwas deplaziert aus Wenn der Benutzerstatus von John dann tue etwas Vergleichen Sie dies mit der zwei ten Alternative Wenn Benutzer John online ist dann tue etwas Die zweite Variante unterbricht nicht den Lesefluss und erscheint auf den ersten Blick sinnvoller Die erste Variante l sst Fragen offen Auf welchen Status wird Bezug genommen und wie wird der Status ausgegeben Der zweite Funk tionsname sagt klar dass diese Funktion den Online Status von jemanden berpr ft und das Ergebnis als boolescher Wert zur ckgibt Was w re wenn das Ergebnis in einem variablen Parameter dieser Funktion zur ckgegeben w rde Alternative 1 function user _status user_name amp status retrieve status and return in status s
353. g am 14 Januar 1999 verabschiedet wurde XML Namensr ume bieten die M glichkeit in einem XML Dokument meh rere Namensr ume zu verwenden die jeweils ber einen URI Uniform Resource Identifier Bezeichner gekennzeichnet werden Dieses Verfahren wird in der RDF Resource Description Framework DTD verwendet Betrach ten Sie folgendes Beispiel aus der RDF Spezifikation lt xml version 1 0 gt lt rdf RDF xmins rdf http www w3 org 1999 02 22 rdf syntax ns xmlns s http description org schema gt lt rdf Description about http www w3 org Home Lassila gt lt s Creator gt Ora Lassila lt s Creator gt lt rdf Description gt lt rdf RDF gt Hier werden zwei Namensr ume definiert einer mit dem Namen rdf und der andere mit dem Namen s Nach der Definition wird auf einen Namensraum verwiesen indem er als Pr fix durch Doppelpunkt getrennt einem Element namen vorangestellt wird Damit wird effektiv die Kollision verschiedener logischer Bedeutungen und syntaktischer Definitionen vermieden Hinweis Die URI in einem Namensraum Bezeichner ist keine DTD Es w re nat rlich sch n ber XML Namensr ume auf verschiedene DTDs zeigen zu k nnen aber es gibt derzeit noch viele technische Probleme bei diesem Ansatz Hiermit besch ftigt sich gerade das W3C in Form der XML Schemadefinition die sich zum Zeitpunkt der Bucherstellung noch in der Entwickelung befand EBNF oder Was ist dies nun schon wieder Als Webentw
354. g eines Projekts entscheidet Die ses Kapitel zeigt Ihnen wie Sie eine h here Zufriedenheit beim Benutzer erreichen Kapitel 5 Grundlegende Webanwendungsstrategien Dieses Kapitel er rtert weitere Grundlagen f r Webanwendungen Alle Web anwendungen verarbeiten beispielsweise Formulareingaben oder trennen zwischen Layout und Programmcode Weiterhin f hrt Sie dieses Kapitel in die effektive Teamarbeit ein indem es einen berblick ber Versionskontrolle mit CVS gibt Schlie lich werden mehrstufige Anwendungen COM und Java aus PHP Sicht besprochen Kapitel 6 Datenbankzugriff mit PHP Ohne Datenbanken gibt es keine Webanwendungen Kapitel 6 stellt PHPLib als Werkzeug f r einen herstellerunabh ngigen Datenbankzugriff vor und gibt einen berblick ber seine anderen Funktionen wie Sitzungsverwal tung Benutzerberechtigung und Genehmigungsverwaltung Kapitel 7 Anwendungen der Spitzentechnologie Durch Entwicklung eines vollst ndigen Wissensbestands mit PHPLib macht Sie dieses Kapitel mit PHPLib s Schablonenklasse Selbstbez ge in SQL und anderen anspruchsvollen Themen vertraut Anschlie end gibt dieses Kapitel einen berblick ber XML und zeigt wie Anwendungen von dieser aufre genden Technologie profitieren k nnen Au erdem beschreibt dieses Kapitel die Schnittstelle von PHP f r die XML Syntaxanalyse und seine WDDX Funktionen 24 Pearson A ADDISON WESLEY Education In diesem Buch verwendete Konventionen
355. ge Spalten mit Warnmeldungen geben so viel seiner Erfahrung und seines Wissens wieder dass sie ein Muss f r jeden sind der im Bereich Pro duktentwicklung und Informationstechnologie arbeitet In seiner Warnbox vom 22 August 1999 stellt Dr Nielsen ein gutes Beispiel daf r vor was passiert wenn ein Programm den Erwartungen eines Benutzers nicht entspricht l Eric Davis ein Informatiker bei Resource Marketing berichtete k rzlich ber einen Tauglichkeitstest f r die Einkaufswagenterminologie Das Konzept design unterst tzt den Begriff Einkaufsschlitten da sich die Website die sich auf den Verkauf von Wintersportprodukten bezog von anderen abheben und die Standardterminologie vermeiden wollte Ergebnis 50 der Benutzer ver standen das Schlittenkonzept nicht Die anderen 50 sagten dass sie herausge funden haben was es bedeutete weil es sich an demselben Standort befand an dem auch ein Einkaufswagen sein w rde Sie wussten dass sie irgendetwas hinzuf gen mussten und das Einzige was Sinn ergab war der Schlitten Lek tion Versuchen Sie nicht clever zu sein und verwenden Sie keine neuen Begriffe wenn es schon gute Begriffe gibt die der Benutzer bereits kennt Konsistenz bedeutet auch dass das Verhalten von Dialogfenstern und die Datenanzeige darin einheitlich sein sollten Zeigen Sie Systemmeldungen Statusangabe Meldungen ber fehlge schlagene oder erfolgreiche Aktionen stets an derselben Stelle auf der Seite und
356. gegeben Der Bot fragt in regelm igen Abst nden eine Tabelle in der Datenbank ab wel che die Eingabebefehle f r ihn enth lt Die Befehle werden von der Web Schnittstelle in die Datenbank eingef gt Sie bestehen aus einem Funktions namen einer Sitzungskennnummer ID und einem Parameterfeld Sobald der Bot einen neuen Befehl in der Datenbank findet f hrt er diesen aus und schreibt die Ergebnisse des Befehls zusammen mit der Sitzungskennnummer in eine Ausgabetabelle Die Web Schnittstelle muss daher nur einen Befehl mit einer selbstgenerierten Sitzungskennnummer schreiben und warten bis ein Datensatz mit derselben Sitzungskennnummer in der Ausgabetabelle auf taucht siehe Abbildung 3 11 Benutzereingabe gem den von der Datenbank F hrt Aktionen im Netz durch erhaltenen Anweisungen sendet Befehl ber Datenbank _ Webschnittstelle g antwortet Uber Datenbank Abbildung 3 11 Datenbankbasierte RPC Kontrolle ber den Verwaltungs Bot Diese Methode erm glicht eine flexible Fernkontrolle ber den Bot 3 8 Zusammenfassung In diesem Kapitel haben Sie anhand eines Praxisbeispiels gelernt wie Sie ein Entwicklungsprojekt planen Wir sind auf die typischen Entwicklungsstadien eingegangen 161 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel Analyse der Anforderungen Wahl einer passenden Technologie Definition von Schnittstellen und APIs Implementierung Si
357. geht es weiter Makro Beschreibung _BOOL Name Gibt den aktuellen Wert des Eintrags name als booleschen Wert zur ck definiert als zend_bool das derzeit Zeichen ohne Vorzeichen bedeutet _ORIG_INT Name Gibt den urspr nglichen Wert des Eintrags name als Inte ger Long zur ck _ORIG_FLT Name Gibt den urspr nglichen Wert des Eintrags name als Flie kommazahl Double zur ck _ORIG_STR Name Gibt den urspr nglichen Wert des Eintrags name als String zur ck Hinweis Dieser String wird nicht dupli ziert sondern zeigt statt dessen auf interne Daten Bei weiteren Zugriffen ist eine Duplizierung in den lokalen Speicher erforderlich INI_ORIG_BOOL Name Gibt den urspr nglichen Wert des Eintrags name als boo leschen Wert zur ck definiert als zend_boo das derzeit Zeichen ohne Vorzeichen bedeutet Tab 9 17 Makros f r den Zugriff auf Initialisierungseintr ge in PHP Schlie lich m ssen Sie Ihre Initialisierungseintr ge in PHP einbinden Dies kann in den Initialisierungs und Deinitialisierungsfunktionen des Moduls geschehen in denen Sie die REGISTER_INI_ENTRIES und UNREGISTER_INI_ ENTRIES verwenden ZEND_MINIT_FUNCTION mymodule REGISTER_INI_ENTRIES ZEND_MSHUTDOWN_ FUNCTION mymodule UNREGISTER_INI_ENTRIESC 9 21 Wie geht es weiter Sie haben viel ber PHP gelernt Sie wissen nun wie Sie dynamisch ladbare Module und statisch verkn pfte Erweiterunge
358. geleitet Die Identifizierungsda ten sind sehr anf llig f r einen Eingriff eines Eindringlings der zwischen dem Benutzer und dem Authentisierungssystem sitzt Mann in der Mitte Atta cke Folglich m ssen Sie sich gegen die Lauschangriffe sch tzen Ein zuver l ssiger Pfad ein sicherer bertragungsweg ist notwendig um das Pass wort zu bertragen Bedenken Sie dass eine Authentisierungskette nur so sicher ist wie ihr schw chstes Glied Selbst ein 128 Bit langes Kennwort hilft Ihnen nicht wenn sie es ber eine normale HTTP Verbindung an das Authen tisierungsystem schicken Der Datenverkehr sollte sicher sein Selbst wenn Sie die Identifizierungsdaten ber einen sicheren bertragungska nal wie SSL weiterleiten bleibt noch sehr viel Raum f r Mann in der Mitte Attacken wenn der Datenverkehr nach der Authentisierung nicht verschl sselt wird Ein Angreifer erf hrt m glicherweise die Sitzungskennnummer durch Lauschen und kann so effektiv die Sitzung des Benutzers kapern und die Identi t t des Benutzers bernehmen z B Artikel in einem Online Shop bestellen 205 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Um dies zu vermeiden m sste der gesamte Datenverkehr ber einen sicheren Kanal abgewickelt werden Das Authentisierungselement wird mit einer Authentisierungsdatenbank abgeglichen Das System das die Datenbank enth lt und die Art in der die Authentisierungselemente gespeichert werden m
359. gen Da sich die Anwenderprogrammierschnittstelle f r die PHP 4 0 Sitzungen so einfach und intuitiv verwenden l sst wollten wir dies auch f r PHP 3 0 reali sieren Eine konsistente Sitzungsschnittstelle f r beide Versionen w re grof artig dachten wir F r einige kleinere Projekte m chten man einfach nicht PHPLib verwenden Deshalb sahen wir uns sessions c n her an und portier ten es nach PHP 3 0 Einige Interna wie etwa der Algorithmus f r die Gene rierung der Sitzungskennnummer behielten wir nicht bei aber wir versuch ten die API zu 100 kompatibel zu PHP 4 0 zu machen Es gibt jedoch einige offensichtliche Beschr nkungen So ist eine automatische nderung der URL nicht m glich Wenn Sie die dokumentierten Unterschiede im Hinterkopf behalten sollten Sie eigentlich mit der Bibliothek als ad hoc Ersatz der PHP 4 0 Sitzungsfunktionen zurechtkommen Den vollst ndigen Quellcode finden Sie auf der CD ROM Unser Experiment hilft Ihnen eventuell auch die Funktionsweise der interne Sitzungsbibliothek von PHP besser zu verstehen Die Funktion session_start spiegelt beispielsweise die urspr ngliche C Funktion sehr genau wieder 184 Pearson vy ADDISON WESLEY Education Sicherheitsaspekte 4 2 Sicherheitsaspekte Beispiel 1 Anfang 1999 f hrten wir einen Website Audit f r eine f hrende Online Jobdatenbank durch W hrend der Analyse entdeckten wir einen Sicherheitsaspekt der uns sprachlos machte Die Website war mi
360. gen Namen und ein Passwort authentisiert ist wird eine neue Sitzungskennnummer generiert und zusam men mit der IP Adresse der Zeit und dem Benutzernamen in der Benutzerta belle gespeichert Der Benutzer braucht nur eine giiltige Sitzungskennnummer und eine Verbindung ber die urspr nglich authentisierte IP Adresse um eine Verbindung herzustellen Vom Standpunkt der Sicherheit kann eine Sitzungs kennnummer f r ung ltig erkl rt werden oder ablaufen indem sie aus der Datenbank entfernt wird Die Verwendung der Sitzungskennnummer von einer anderen IP Adresse aus wird stillschweigend ignoriert Benutzerdaten werden nur einmal gesendet In Hinsicht auf die Leistung muss ein Daten bankaufruf nur einmal get tigt werden und alle Benutzerinformationen k n nen ber die Sitzungskennnummer durch Verkn pfen von Tabellen gesammelt werden Die Sitzungskennnummer wird dem Benutzer auf zwei Arten zur Verf gung gestellt Im ersten Fall wird sie in alle URLs auf der Seite eingef gt so dass die Information in allen Links auf Seiten derselben Website enthalten ist URLs werden mithilfe einer Funktion generiert die berpr ft ob der Benutzer authentisiert ist oder nicht und das richtige HTML ausgibt Au erdem wird sie als Cookie an den Benutzer geschickt Dies verhindert dass falsch defi nierte Links dazu f hren dass der Client die Kennnummer vergisst Viel wichtiger ist dass Browser die Cookies nicht unterst tzen oder gar verwer fen sich t
361. grammierung Ganz allgemein sollten Sie bei der Namensgebung zun chst ber cksichtigen ob es sich um eine lokale oder globale Variable handelt Wenn die Variable nur im lokalen Umfeld einer Funktion auftaucht w hlen Sie einen kurzen pr zisen Namen der den Inhalt oder die Bedeutung dieser Variablen wiedergibt Der Variablenname sollte aus maximal zwei W rtern bestehen die durch einen Unterstrich oder Gro buchstaben voneinander getrennt sind Betrachten Sie hierzu Listing 1 8 counter next_index nrOptions cookieName Listing 1 8 Beispiele f r Namen lokaler Variablen Achten Sie darauf Namensschemata nicht zu vermischen Verwenden Sie entweder nur Kleinbuchstaben und trennen Sie die W rter durch einen Unterstrich oder benutzen Sie Gro buchstaben zur Trennung Nat rlich k n nen Sie auch Gro buchstaben und Unterstrich verwenden aber verwenden Sie nicht Gro buchstaben f r eine Variable und Unterstrich f r eine andere Dies f hrt zu Fehlern und zeugt von schlechtem Stil Sobald Sie Ihren eigenen Stil gefunden haben behalten Sie ihn f r das gesamte Projekt konsequent bei Alle globalen Variablen sollten ein Pr fix haben welches das Modul kenn zeichnet zu dem es geh rt Dieses Vorgehen erleichtert die Zuordnung der globalen Variablen zu ihren Modulen und hilft Konflikte zu vermeiden wenn zwei Variablen mit demselben Namen aus verschiedenen Modulen im gleichen globalen Umfeld vorkommen Das Pr fix sollte durch Unterstr
362. gro artiger Co Autor war Wir haben zusammen Tausende von Stunden oder so hnlich mit Internet Relay Chat IRC zugebracht in denen wir Kapitel berarbeiteten Programmcode schrieben oder korrigierten und viel Spa hatten Es war richtig harte Arbeit aber auch eine wunderbare Zeit Danke an alle Benutzer des Efnet s php sie sind eine gro artige Gemeinde und es macht Spa sich unter ihnen zu tummeln Wenn Ihr Zeit habt kommt vorbei und sagt Hallo zu tigloo Till und Yapa das bin ich Jeder im IRC war sehr hilfsbereit und insbesondere Zeev zeigte sehr viel Geduld bei der Beantwortung unserer Fragen Ein Dankesch n auch an Robert Finazzer der uns in den letzten Jahren wert voller Wirtschaftsberater war und stets Verst ndnis hatte wenn ich Artikel oder B cher schrieb anstatt mit ihm an millionenschweren Unternehmungen zu arbeiten Gr e an das brige Team des Profi Online Service und nat rlich an Joachim Marangoni Danksagungen von Till Ich habe schon nicht mehr daran geglaubt dass ich jemals bis zu diesem Kapi tel vordringen w rde aber nun ist es soweit Damit beende ich ein Projekt f r das ich im letzten Jahr viel Zeit und Energie aufgebracht habe Ich muss zuge ben dass ich manchmal dachte das schaffen wir nicht aber jetzt bin ich stolz es im Regal stehen zu sehen Pearson A ADDISON WESLEY Education Deswegen muss ich mich als Erstes bei Tobias Ratschiller bedanken der mich in den PHP B
363. h ber PHP geben w rde ein wenig weit hergeholt R ckblickend ist das was PHP zu einem der am weitesten verbreiteten Skriptsprachen f r die Web Ent wicklung machte nur erstaunlich Meine Mitwirkung am PHP Projekt begann wie viele Dinge zuf llig Ich stolperte als Endbenutzer ber einen Fehler in PHP FI 2 0 etwas das seltsam genug war damit mein Kollege Andi Gutmans und ich uns die Sache n her betrachteten Als wir uns in den Programmcode vertieften der PHP FI 2 0 zum Laufen brachte waren wir nicht sehr begeistert Auf der anderen Seite gefiel uns die Vorstellung einer in HTML eingebetteten servergest tzten Skriptsprache f r die Serverseite Als gute zuk nftige Software Entwickler beschlossen wir den Code noch einmal von Grund auf neu zu erschaffen aber diesmal richtig Durch das Umschreiben der Programmiersprache und die Unmenge an Zuarbeiten die in Form von zahlreichen Funktionsmodulen und Beispiel code geleistet wurden erhielt PHP einen Auftrieb der unsere wildesten Tr ume und Erwartungen sprengte Heute wird PHP in mehr als einer Mil lion Dom nen im Internet benutzt und ist das Werkzeug der Wahl f r die Skripterstellung in UNIX Umgebungen auf der Server Seite PHP 4 0 stellt die logische Fortsetzung dar die sicherstellt dass PHP auf Jahre hinaus die f h rende Technologie im Bereich der Web Skripte bleibt Der Zend Prozessor www zend com revolutioniert die Leistungsf higkeit und Skalierbarkeit von PHP basier
364. h Vorkehrungen fiir Ebenen getroffen welche die Berechtigungen aus niedrige ren Ebenen erben Eine admin Ebene hat automatisch auch die user Privile gien wenn Sie die Bitmuster entsprechend konzipieren Bei der Standardeinstellungen werden diese Vorkehrungen jedoch nicht getroffen Die admin Ebene unterscheidet sich von der user Ebene so dass ein Benutzer der zur admin Gruppe geh rt nicht auf Funktionen zugreifen kann die mit auth gt have_perm user gesichert wurden Um Ihnen ein besseres Verst ndnis f r die Funktionsweise von PHPLib zu geben zeigen wir Ihnen wie es Bitmuster berechnet Der Zugriff auf die Funktionen erfolgt nur ber die user Ebenen Diese Ebene hat das Bitmuster 1 Der Benutzer befindet sich auf der admin Ebene welche das Bitmuster 16 hat Diese beiden werden mit einem logischen UND verkn pft was Null ergibt berpr fen Sie es selbst print 16 amp 1 Das Ergebnis 0 ist nicht identisch mit der angeforderten Ebene 1 deshalb wird der Zugriff ver weigert Die Berechnung ist eigentlich nichts anderes als dass PHPLib berpr ft ob im Bitmuster das als Argument von perm gt have_perms angegeben wurde das Berechtigungsbit des Benutzers gesetzt wurde Diese Vorgehensweise erm glicht komplexe Kombinationen Betrachten wir ein weiteres Beispiel Angenommen Sie haben vier Berechti gungsebenen admin supervisor editor und author Sie m chten dass die Edi toren Inhalte nicht weiterleiten d
365. h heren wie beim Import von Benutzervariablen ist gr ere Sorgfalt erforderlich Sie k nnen nicht davon ausgehen dass die gelieferten Daten irgendwelchen Anforderungen entsprechen nicht einmal wenn Sie die Daten zum Client zuerst liefern Sie k nnten beispielsweise auf der Client Seite Daten in einem HTML Formular mit JavaScript berpr fen Aber Sie k nnen nicht davon ausgehen dass die Daten auf dem Server das erwartete Format haben da der Benutzer JavaScript ausgeschaltet haben k nnte oder das Formular ber Telnet abgeschickt hat Ein anderer weitverbreiteter Fehler besteht darin dass viele Daten zum Benutzer schicken und sicher davon aus gehen dass sie nicht ge ndert werden Zum Beispiel k nnte eine Seite Konto daten f r einen Benutzer anzeigen die mit einer Abfragezeichenfolge wie script php3 user_id 1 aufgerufen werden nachdem sich der Benutzer ange meldet hat Was h lt den Benutzer davon ab die Variable user_id in etwas anderes als 1 umzuwandeln und die Daten eines anderen zu bearbeiten 189 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Viele Webanwendungen berpr fen bereits den Inhalt der von einem Benut zer f r einen anderen Benutzer zur Verf gung gestellt wird Sie werden kaum ein Nachrichtenbrett finden in dem Sie lt script gt Tags oder hnlichen HTML Code eingeben k nnen Entwickler machen h ufig den Fehler nur diese Art von Daten zu berpr fen und vernachl ssigen dabei
366. heit und die Tauglichkeit Gedanken machen Der Lohn f r diese ganze M he ist dass Sie den n chsten Yahoo selbst generieren k nnen Durch Anwendungen wird das Web erst interessant 4 1 HTTP und Sitzungen Denken Sie an ein KDE Programm z B Kedit KDE ist ein Fensterverwal tungssystem f r Linux und kompatible X Systeme Ein typischer Vorgang k nnte sein eine Datei zu ffnen den Inhalt zu ndern und die Datei unter einem anderen Namen wieder abzuspeichern Kedit wei zu jedem Zeitpunkt des Prozesses was Sie tun Es wei dass Sie die Datei bearbeiten wo sich der Cursor befindet wohin Sie die Maus bewegen usw Selbst wenn Sie eine zweite Instanz von Kedit ffnen wird ihn dies nicht irritieren Wenn Sie in Instanz 1 Save w hlen wird nicht die Datei aus Instanz 2 gespeichert Dies ist m glich weil Kedit oder das Betriebssystem um genau zu sein Ihre Aktionen einer bestimmten Instanz des Programms zuordnen kann und zwar dadurch dass es ein Ereignis erh lt wie In der Instanz mit der PID 4711 eine PID ist ein eindeutiger Prozessbezeichner in UNIX Systemen wurde die Maus zu den Koordinaten 10 4 bewegt 4 1 1 Statuskontrolle Als Tim Berners Lee 1991 das Hypertext Transfer Protocol entwarf beschloss er HTTP so schnell wie m glich zu machen und daher alle Statusinforma tionen wegzulassen H 165 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte HTTP besitzt keinen Mechanismus um den Stat
367. hlauft Zend alle geladenen Module und ruft diese Funktion auf Jedes Modul hat dann die Gelegenheit seinen eigenen Fingerabdruck auf der Ausgabeseite zu hinterlassen Im Allgemeinen wird diese Funktion verwendet um Umgebungs und statistische Daten zu hinterlassen Um dieses Feld als nicht benutzt zu markieren verwenden Sie NULL Zur Deklaration einer Funktion verwenden Sie das Makro ZEND_MINFO global _startup_func Die globale Initialisierungsfunktionen werden nur sel ten verwendet In der Regel sollten Sie die restliche Struktur mit dem Makro STANDARD_MODULE _PROPER TIES durchsuchen Um dieses Feld als nicht benutzt zu markieren verwenden Sie NULL Zur Deklaration ei ner Funktion verwenden Sie das Makro ZEND_GINIT global_shutdown_func Um dieses Feld als nicht benutzt zu markieren ver wenden Sie NULL Zur Deklaration einer Funktion ver wenden Sie das Makro ZEND_GSHUTDOWN Sonstige Strukturele Diese werden intern verwendet und k nnen Uber das mente Makro STANDARD MODULE_PROPERTIES EX im voraus ausgef hrt werden Sie sollten ihnen keine Werte zu weisen Verwenden Sie STANDARD_MODULE_PROPERTIES _ EX nur wenn Sie globale Initialisierungs und Deinitia lisierungsfunktionen verwenden Ansonsten verwen den Sie direkt STANDARD_MODULE PROPERTIES Hinweis Da dynamisch ladbare Module nur bei Seitenanfragen geladen werden wird die Anfrageinitialisierungsfunktion direkt nach der Modul startfunktion aufgerufen beid
368. hlen oder sich zuweisen lassen Dieses m s sen sie sich merken und geheim halten Die Vergabe der Authentisierung erfolgt durch berpr fung ob die Identit t des Benutzers durch das Pass wort best tigt wird Varianten sind die Personal Identification Numbers PINs die bergabe von Phrasen oder die Anfrage nach Daten ber den Benutzer die nur der Benutzer wissen kann Die Hauptschw che dieser Art von Authentisierung besteht darin dass es h ufig recht einfach ist zu erfah ren was jemand anderer wei M glicherweise k nnen Sie sogar das magi sche etwas das sie wissen erraten ohne Zugriff darauf zu haben Denken Sie an die Brechstangenattacken bei Shell Logins Im Falle von Webanwen dungen berwiegen die Vorteile der Authentisierung durch Wissen normaler weise diese Sicherheitsm ngel Der Benutzer kann das Passwort berall able gen und st ndig auf dieses zugreifen Ein weiterer Vorteil ist dass diese Methode sehr einfach ist und sich leicht installieren l sst 204 Pearson A ADDISON WESLEY Education Sicherheitsaspekte Beispiele f r die Authentisierung durch Eigentum etwas das sie haben sind Schl ssel Magnetstreifenkarten Kennmarken u Im Gegensatz zur ersten Methode ist die Authentisierung durch Eigentum schwieriger zu duplizieren da die Authentisierungselemente physikalische Objekte sind F r das Web hat sich diese Art der Berechtigung noch nicht als g ltige Technik etabliert Es gibt jedoch bere
369. hnischen Spezifika tionen Ihres Programms gebr uchliche und neue Standards sowie ber interne Datenverarbeitung geben sofern dies f r den Leser interessant ist und soweit es Ihre Lizenz zul sst Wenn Ihre Kunden den Quellcode ansehen und oder ndern k nnen f gen Sie auch einen Entwickler Leitfaden hinzu in dem Sie die Projektstruktur den Datenfluss und die internen Beziehungen auf f hren Au erdem sollten Sie der vollst ndigen Beschreibung eine Referenz aller Funktionen einschlie lich interner Funktionen beif gen Wenn Sie in einem Team arbeiten kann ein professioneller Technischer Redakteur eine echte Hilfe sein Er hat Erfahrung darin wie umfassende tech nische Dokumentationen erstellt werden und auch die Zeit dies zu tun Wenn Sie diese Aufgabe einem Entwickler auftragen der nebenbei noch pro grammieren soll f hrt dies zu jeder Menge zus tzlichen Stress Entwickler haben in der Regel genug damit zu tun ihre Endtermine einzuhalten 1 6 Entwicklung einer Anwendungs programmschnittstelle Neben der ganzen Theorie wollen wir eine Anwendungsprogrammschnitt stelle API von Grund auf entwickeln um Sie mit den Konventionen und Konzepten vertraut zu machen die wir zuvor besprochen haben Dabei verfol gen wir keinen theoretischen sondern einen praktischen Ansatz Diese Vorge hensweise haben wir gew hlt damit Sie sich die einzelnen Schritte merken k nnen In zuk nftigen Projekten m ssen Sie APIs auf einer theo
370. hren und eine neue Struktur f r Listen anzu legen Auslesen der zehn zuletzt hinzugef gten Eintr ge Auslesen der Eintr ge mit der h chsten Bewertung Auslesen der Eintr ge auf die am meisten zugegriffen wird Auslesen alle Eintr ge von einem bestimmten Autor Diese Liste l sst sich f r alle genannten Aktionen und Bereiche fortsetzen Am Schluss erhalten wir eine umfassende Liste aller erforderlichen Strukturen und Aktionen die das gesamte Projekt dokumentiert Um es zusammenzufassen Wir haben einen Anforderungskatalog erstellt indem wir das Problemfeld umrissen und die Funktionen beschrieben haben welche die Anwendung haben sollte Indem wir den Anforderungskatalog in konkretere Begriffe gefasst haben haben wir eine Spezifikation erstellt Die Spezifikation beschreibt die Datenstrukturen und das Verhalten der Anwen dung Nun sollten wir uns im Einzelnen damit befassen wie die Anwendung reali siert werden kann Wir picken uns hier zwei interessante Aspekte heraus n mlich die Verwendung von Schablonen und den Einsatz von verschachtel ten Kategorien in SQL 7 1 3 Die Klasse Template Wie wir in Kapitel 6 Datenbankzugriff mit PHP beschrieben haben bietet PHPLib eine L sung f r viele Probleme die bei Webanwendungen auftreten In unserem Fall benutzen Zend Entwickler PHPLib bereits f r Teile ihrer Website so dass wir es als Standard f r die Session Verwaltung Daten bankabstrahierung und HTML Schablonen verwendet hab
371. hrung hat uns einfach gezeigt dass die Verwendung von Klassen zu einem saubereren Programmcode f hrt da Sie mehrere verschiedene Instan zen verwenden k nnen Sie k nnen diese Datenstrukturen als unterschiedliche Bereiche der Software ansehen Sie bilden logische Einheiten die aber miteinander interagieren Ziel der Spezifikation ist alle Bereiche in einer Anwendung abzudecken Wie die Bereiche im Programmcode dargestellt werden ist an dieser Stelle nicht von Bedeutung und dient nur zur Verdeutlichung der Strukturen Die bertragung dieser Datenstrukturen in ein relationales Datenbankmodell ist recht einfach Die Anwendung verwendet Datenbanktabellen um Ein tr ge in der Wissensdatenbank zu speichern verf gbare Kategorien Ein tragsbewertungen und Zugriffsprotokolle Die beiden Haupttabellen sind entries und categories die Links zu den Untertabellen ratings und logs haben Da MySQL keine fremden Schliissel kennt miissen diese Verkntipfun gen von der Anwendung selbst verarbeitet werden Wenn der Administrator beispielsweise einen Eintrag l schen m chte muss er auch die entsprechen den Eintr ge referenziert mit derselben entry_id in den Tabellen ratings und logs l schen Abbildung 7 2 zeigt ein Diagramm das die Beziehung der Ein heiten in der Tabellenstruktur zeigt Beurteilungen entry_id Eintr ge rating entry_id votes cat_id t_stamp Protokollierung enty_id views Kategorien eat_id name parent_id Abbildu
372. ht h ngt davon ab welche Klassen Sie zuvor ge ffnet haben Es ist wichtig in welcher Reihenfolge die Cleanup Routinen der Klassen aufgeru fen werden PHPLib hilft Ihnen hier mit den Funktionen page_open und page_close In der Dokumentation werden sie als Seitenverwaltungsfunktionen bezeichnet Tats chlich k nnen sie den gesamten Verbindungsauf und abbau von PHPLib bewerkstelligen Mithilfe dieser beiden Funktionen k nnen wir unser Beispiel betr chtlich verk rzen page_open array sess gt Session Example auth gt Auth Example perm gt Perm_Example ee page_close Die Funktion page_open in unserem Beispiel erzeugt Instanzen von Session_ Example Auth Example und Perm Example mit Namen sess auth bzw perm Diese Instanzen k nnen Sie anschlie end direkt benutzen z B mit sess gt register Hinweis Die Funktion page_open muss vor der Ausgabe aufgerufen sein da sie einen Cookie und weitere HTTP Header setzt 6 2 11 Abk rzungen Il purl url und pself Wenn Ihre Anwendung als Prim rmodus f r die Verteilung der Session ID cookie verwendet und get als Fallback Modus m ssen Sie Ihre gesamten Links mit der Session ID kennzeichnen Um andere Methoden f r die Verbrei tung der Session ID zu verwenden die wir in Kapitel 4 vorgestellt haben m ssen Sie PHPLib um einen zus tzlichen Wert f r mode erweitern PHPLib vereinfacht sogar die manuelle Neuschreibung von URLs Es stel
373. ht war es einfach vern nftig PHP zu benutzen da es kosteneffektiv ist und den Einsatz von leistungsf higen Anwendungen erm glicht Zus tzlich haben die Six Entwickler f r einige Bereiche Hexbase WebSQL WebObjects Cold Fusion Oracle Web Application Server CGI embperl Java C und Perl unter die Lupe genommen und getestet PHP ist zwar nicht die einzige Ent wicklungsplattform die bei Six verwendet wird in einigen Bereichen wird immer noch Perl verwendet aber bereits ber 90 der Entwicklungen wur den hier mit PHP erstellt Eine Entscheidung die Six auch heute noch unter stiitzt Alle PHP Anwendungen wurden zuerst mit PHP konzipiert und ent wickelt Zur Entscheidung trugen auch die Open Source Aspekte von PHP bei In einer Umgebung in der Linux Apache und MySQL verwendet werden fiigt sich PHP sehr gut ein Durch die weitverbreitete Verwendung und die wach sende Akzeptanz des Open Source Systemansatzes kann Six diese Umge bung sehr effektiv in seinen kommerziellen Umgebungen einsetzen wie etwa SixCMS Dies ist ein sehr guter Ansatz er bietet eine exzellente Methode um wertvolles geistiges Kapital auf kosteneffektive Weise zu erhalten Seit einiger Zeit bekommen Open Source Technologien mehr und mehr Unterstiitzung aus der Industrie insbesondere da ihre Verwendung immer weiter verbreitet wird und immer mehr L sungen angeboten werden die auf dieser Technolo gie basieren Eine der Vorteile bei Open Source L sungen ist dass
374. htet 1 Element ffnen greeting 2 CDATA Abschnitt ffnen Wert Hello World 3 Element schlie en greeting Im Gegensatz zu baumstrukturbasierten Parsern erzeugen sie keine Struktur darstellung des Dokuments Dies erm glicht einen low level Zugriff und istin Bezug auf Geschwindigkeit und Ressourcennutzung sehr viel effizienter Es muss nicht das gesamte Dokument im Speicher geladen sein Die Dokumente k nnen sehr viel gr er sein als Ihr Systemspeicher Trotzdem haben Sie immer noch die M glichkeit wenn n tig eine reine Baumstruktur zu erstellen Bevor ein Dokument analysiert werden kann fordert Sie ein ereignisbasierter Parser in der Regel auf R ckruffunktionen zu registrieren die aufgerufen werden wenn bestimmte Ereignisse eintreten Expat bildet hier keine Aus nahme Er definiert sechs m gliche Ereignisse und eine Standardroutine Ziel Funktion Beschreibung Elemente xml _set_element_handler ffnen und Schlie en von Elementen Zeichendaten xml _set_character_data_hand Anfang von Zeichendaten lert Externe Entit ten xml_set_external_entity_ref_ Auftreten einer externen handler Entitat Nicht analysierte xml_set_unparsed_entity_decl_ Auftreten einer nicht ana externe Entit ten handler lysierten externen Entitat Verarbeitungs xml_set_processing_instruction_ Auftreten eines Verarbei befehle handler tungsbefehls 318 Pearson Education A ADDISON
375. i PHP ist die Tatsache dass Sie den gesamten Quell code Ihrer Anwendung an den Kunden oder Partner weiterleiten miissen Der Wert Ihrer Anwendungen in Form von geistigem Eigentum und Kapital und die Notwendigkeit diese zu sch tzen k nnen f r Sie wesentlich sein Six hat f r den Entwurf der Website mit einer Reihe von Werbe und Designagen turen zusammengearbeitet die begannen sich neben ihrem grafischen F hig keiten auch Programmierkenntnisse zuzulegen nachdem sie offenen Zugriff auf den Six Code hatten um sich als Mitbewerber zu behaupten Dies sind Firmen die versuchen Komplettl sungen f r das Web anzubieten im Gegen satz zu Six die sich auf ihre Kernkompetenz der Anwendungsentwicklung konzentrieren Man kann sicherlich argumentieren dass sich die Technologie derma en schnell entwickelt dass das Problem dass jedermann Ihren Code sehen kann langfristig kein wesentliches Problem darstellt Die M glichkeit mit PHP einen Bytecode Compiler zu verwenden sobald dieser verf gbar ist wird die Situation erheblich verbessern Six schlie t derzeit wichtige Funktio nen in der Datenbank selbst ein um die Zug nglichkeit des PHP Codes und lokale nderungen durch Dritte zu begrenzen 8 2 5 PHP im Einsatz Die beiden zuvor genannten kommerziellen Produkte SixCMS und SixAIM sind Beispiele von Six Anwendungen die mit PHP 3 0 realisiert wurden In der Version 3 0 hat SixCMS 283 Dateien die 25 000 Programmzeilen enthalten und 1 2MB S
376. i optionale Argumente Diese optionalen Argumente k nnen mit den zus tzlichen Makros PHP_INI_ENTRY1 das ein weiteres Argu ment zul sst PHP_INI_ENTRY2 das zwei weitere Argumente zul sst und PHP_ INI_ENTRY3 das drei weitere Argumente zul sst angegeben werden Die nderungsbenachrichtigungsroutinen sollten eingesetzt werden um Ini tialisierungseintr ge lokal im Cache zu puffern um einen schnelleren Zugriff zu erhalten oder bestimmte Aktionen durchzuf hren die erforderlich sind wenn sich ein Wert ndert Wenn beispielsweise ein Modul eine konstante Verbindung zu einem bestimmten Host ben tigt und jemand den Namen des Host ndert wird automatisch die alte Verbindung geschlossen und versucht eine neue aufzubauen Der Zugriff auf die Initialisierungseintr ge kann auch ber die Makros erfol gen die in Tabelle 9 17 aufgef hrt sind Makro Beschreibung INI_INT Name Gibt den aktuellen Wert des Eintrags name als Integer Long zur ck INI_FLT Name Gibt den aktuellen Wert des Eintrags name als Flie kom mazahl Double zur ck INI_STR Name Gibt den aktuellen Wert des Eintrags name als String zu r ck Hinweis Dieser String wird nicht dupliziert sondern zeigt statt dessen auf interne Daten Bei weiteren Zugriffen ist eine Duplizierung in den lokalen Speicher erforderlich Tab 9 17 Makros f r den Zugriff auf Initialisierungseintr ge in PHP 434 Pearson A ADDISON WESLEY Education Wie
377. iable schreiben wird nicht der alte Speicherbereich 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 durch langfristige Projekte belegt Wenn Sie langfristige Skripte ver wenden wollen dann stellen Sie sicher dass Sie Ihre Datenbankergebnisse beispielsweise mit mysq _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 folgenderma en aus class tree_node var left_child right_child var value Dies ist zwar nur 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 tree_node left_node new tree_node right_node new right_node root_node gt value 1 left_node gt value 2 right_node gt value 3 root_node gt left_child left_node root_node gt right_child right_node Dieser Programmcode erzeugt einen Baum mit einem Stammkno
378. ibuten Verarbeitungsbefehle Entit ten Kommentare und CDATA Abschnitte Aber wie wird aus diesen Einzelteilen ein sinnvolles XML Doku ment Die XML Spezifikation definiert nur eine sehr allgemeine Dokumentenstruk tur Sie besagt dass jedes wohlgeformte Dokument folgende Eigenschaften hat mehr ber die Bedeutung von wohlgeformt sp ter kann einen Prolog haben der die XML Version und die verwendete DTD angibt muss genau ein Stammelement und kann eine beliebige Anzahl von Ele menten unterhalb des Stamms enthalten danach kann Verschiedenes folgen Der letzte Teil hier etwas flapsig Verschiedenes bezeichnet wird von vielen Leuten als Konzeptfehler von XML betrachtet Er erschwert m glicherweise die Analyse der XML Dokumente da Sie sich nicht darauf verlassen k nnen dass das Dokumentenende das schlie ende Stammelement ist Wenn Sie ein Dokument ber eine Netzwerkverbindung analysieren k nnen Sie beispiels weise die Verbindung nicht einfach schlie en nachdem Sie das schlie ende Stammelement erhalten haben Sie m ssen warten bis der Server die Verbin dung von selbst schliefst da ja immer noch Verschiedenes folgen kann Bisher haben wir noch kein Wort ber die Syntax und Struktur des Elements verloren das f r den ganzen Zauber von XML verantwortlich sein soll die Dokumententyp Definition Tats chlich ist es die DID die einem XML Dokument die Bedeutung verleiht Sie definiert seine Syntax die Abfolge un
379. ical writing are present and to tell you the truth even very esoteric ones are there or have you ever seen a MouseButton element from the quick reference The conventional name of a mouse button in your word processor XML and DocBook offers some clear advantages to us We can use CVS as version control tool for both the PHP examples and the book files Transformation to HTML is easy either with PHP or using a style sheet processor like James Clark s XT And editing is very comfortable thanks to Softquad s XMetaL which allows intuitive visual editing by using Cascading Style Sheets CSS for the display in the authoring environment as shown in Figure acronym action address anchor application author authorinitials beginpage blockquote calloutist caution citation citerefenty citetitle classname cmdsynopsis command comment computeroutput corpauthor database email emphasis envar eaustion I Change insert Appl WML Wireless Markup Language WML is another Document Type Definition which has quickly become an industry standard It s intended for use in specifying content and User Interfaces for wireless devices such as mobile phones or Personal Digital Assistants These devices have some common constraints which make HTML a bad choice for a markup language e small and low resolution graphical displays limited user interaction elo 5 eoakToants chanter secon para IQ Cutting E
380. ich vom eigentlichen Variablennamen getrennt sein Es sollte aus einem einzigen Wort bestehen am besten einer Abk rzung siehe Listing 1 9 phpPolls_setCookies phpPolls_lastIP db_session_id freakmod_last_known_user Listing 1 9 Beispiele fiir Namen globaler Variablen 47 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte Der Vorteil von kleinen Gr en Erzeugen Sie lieber mehrere kleinere Projekte in denen Sie jeweils ein anderes Namensschema verwenden Dies hat folgende Vorteile Sie haben die M glichkeit Ihren ganz eigenen Stil zu finden Wenn Sie den Stil eines Anderen bernehmen m ssen haben Sie bereits Erfahrung Wie diese Beispiele zeigen sind die Namen globaler Variablen in der Regel l nger als die Namen lokaler Variablen Dies liegt nicht nur an dem Modul pr fix sondern auch an der exakteren Abgrenzung Wenn nicht klar erkenn bar ist an welchen Stellen eine Variable definiert und initialisiert wurde weil diese in einem Modul liegen auf das Sie keinen Zugriff haben sollten Sie im Namen unbedingt den Inhalt und die Bedeutung der Variablen angeben Nat rlich geht dies nicht unbegrenzt wer will sich schon 40 Zeichen merken aber das ist mehr eine Grenze die der gesunde Menschenverstand setzt Im Prinzip sollten Sie globale Variablen so benennen als w rden Sie diese jemandem beschreiben Wie w rden Sie zum Beispiel die Variable phpPolls_ lastIP beschreiben M glicherweise wissen
381. ickler haben Sie h ufig die Aufgabe Spezifikationen zu lesen Projektspezifikationen formale Sprachspezifikationen oder Whitepapers zu Standards Beim Lesen einiger Spezifikationen vom W3C die bekanntesten sind wahrscheinlich die HTML und XML Dokumente stolpern Sie wahr scheinlich ber eine seltsame Mischung von Zeichen die vermutlich eine Grammatikdefinition bilden document prolog element Misc 314 Pearson vy ADDISON WESLEY Education PHP und XML Dies ist die allererste Syntaxdefinition in der XML Spezifikation Sie definiert die grundlegende Struktur eines XML Dokuments Die verwendete Notation wird als erweiterte Backus Naur Form oder EBNF bezeichnet Sobald Sie die Grundlagen von EBNF verstanden haben werden Sie formale Spezifikation sehr viel einfacher verstehen EBNF ist eine formale Methode um die Syntax einer Programmiersprache zu definieren so dass hinterher eindeutig feststeht was g ltig oder zugelassen ist Sie wird auch in vielen anderen Standards verwendet wie etwa Protokoll oder Datenformaten sowie in einigen Auszeichnungssprachen wie XML oder SGML EBNF erm glicht eine vollst ndige und eindeutige Grammatik definition Deshalb gibt es einige Softwaretools die eine Reihe von EBNF Regeln automatisch in einen Parser umwandeln Programme die dies tun werden Compiler Compiler genannt Der bekannteste von ihnen ist YACC Yet Another Compiler Compiler aber es gibt noch eine Reihe weiterer Sie k
382. ie Datenbank Probleme mit gro en bin ren Objekten BLOBs hat CT_ Split_Sql ist nicht mit den Tabellen von CT_Sq kompatibel Mit der Variablen split_length k nnen Sie die L nge festlegen an der die Klasse die Session Daten trennt Der Standardwert hierf r ist 4096 4KB CT_Shm speichert Session Daten im gemeinsam genutzten Speicher dem sogenannten Shared Memory Um diesen Container zu verwenden m s sen Sie PHP mit Unterst tzung f r den gemeinsamen Speicher kompilie ren Dieser Container ist schneller da er Session Daten direkt im Speicher verf gbar ablegt Der Nachteil ist dass alle Session Daten verloren gehen wenn Sie Ihren Server aus irgendeinem Grund neu starten m ssen Au er dem ist die Anzahl der gleichzeitig offenen Sessions durch die Speicherka pazit t begrenzt Jede Session beansprucht einen gewissen Speicherplatz die H he h ngt von der Menge und Gr e der Sitzungsvariablen ab sobald der gesamte verf gbare Speicher belegt ist k nnen keine weiteren Sitzungen gestartet werden Folgende Klassenvariablen unterscheiden sich von jenen aus CT_ q Variable Beschreibung max_sessions H chstzul ssige Anzahl an gleichzeitig aktiven Sessions Der aktu elle Standardwert ist 500 shm_key Eindeutiger Schl ssel f r das Segment des Shared Memory das verwendet werden sollte Es ist wichtig dass dieser Schl ssel f r jede Anwendung eindeutig ist shm_size Gr e des Segments des Shared Memory in
383. ie Ergebnisse einer bestimmten Suche hinweisen die sie f r n tzlich erachten Unter phpWizard net finden Sie beispielsweise ein Formular das automatisch Ama zon nach allen PHP verwandten B chern durchsucht Nun wird die Sache haarig Ein Hacker kann auf seiner ffentlichen Website einen Link zu Suchergebnissen f r den Begriff lt script gt alert Hello World lt script gt haben Alle Benutzer die diesen Link nutzen oder das Suchformular abschicken erhalten die gemeine Hello World Nachricht als Popup Mel dung auf ihrem Browser Man k nnte nat rlich noch viel gef hrlichere Dinge tun als Nachrichten auf den Bildschirm zu bringen Wenn wir das Beispiel ein wenig erweitern k nnen wir PHP als Suchmaschine f r eine E Commerce Website verwenden die eine eigene Sitzungsverwaltung verwendet und die Sitzungskennnummer in Cookies speichert Wenn wir nun von einem intelli genten Hacker ausgehen wird er anstelle der Hello World Nachricht ein anderes JavaScript verwenden um die Cookie Daten zu lesen die er dann an seine Website schickt Dort wartet er auf ankommende Sitzungskennnum mern bernimmt die Sitzungen der anderen Benutzer und kauft ein paar nette Geschenke f r die Leute unter phpWizard net 190 Pearson A ADDISON WESLEY Education Sicherheitsaspekte Vielleicht sind wir gut im Geschichten erfinden aber dies k nnte tats chlich passiert sein Die Produktsuchmaschine von Amazon hatte Tags nicht richtig kod
384. ie Ihre Werkzeuge sorgf ltig ausw hlen PHPLib eignet sich am besten f r Projekte die mehr als zwei Tage Entwicklung ben tigen Bei der ersten Verwendung der Bibliothek m ssen Sie jedoch zun chst mit Mehrarbeit rechnen Sie brau chen Zeit um die Dokumentation zu lesen die Konzepte zu verstehen und Ihre Fehler zu beheben PHPLib scheint ideal f r Projekte mit mehr als einem Softwareentwickler zu sein Es zwingt Programmierer hnliche Schnittstellen zu verwenden und f rdert objektorientierte Programmierung die zumindest die Struktur einer Anwendung verbessert Da PHPLib zudem ein tieferes Verst ndnis von PHP und Webanwendungen im allgemeinen voraussetzt befinden sich die Ent wickler im Team auf einem vergleichbaren Wissensniveau 258 Pearson A ADDISON WESLEY Education PHPLib Die PHP Basisbibliothek PHPLib ist in reinem PHP geschrieben wodurch es nicht ganz so schnell ist wie eine C Erweiterung von PHP Auf der anderen Seite wird es dadurch fle xibler Die Bibliotheken sind als Klassen definiert dadurch lassen sie sich leicht an Ihre Bed rfnisse anpassen Tats chlich werden Sie einige nderun gen vornehmen m ssen PHPLib ist kein Produkt das Sie einfach auspacken und sofort benutzen k nnen Sie sollten sich dar ber im Klaren sein dass Sie einige Funktionen selbst bereitstellen m ssen Die einzelnen PHPLib Klassen sind auf recht komplexe Weise miteinander verwoben so k nnen Sie beispielsweise Sitzungsverwalt
385. ie 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 zu diesem Thema im Abschnitt Vererbung 82 Pearson A ADDISON WESLEY Education 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_list 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 W rde 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 fe
386. ie Sie fortfahren m ss ten wenn Sie st rker verschachtelte Elemente h tten Wenn Sie das f r einen zu gro en Aufwand halten k nnen wir Ihnen nur zustimmen Gl cklicher weise war Uwe Steinmann derselben Meinung Deshalb stellte er eine elegan tere Methode f r den willk rlichen Zugriff auf Dokumentenelemente zur Verf gung xmltree Diese Funktion generiert eine Struktur der PHP Objekt die das gesamte XML Dokument darstellen Wenn Sie ihr im ersten Argu ment eine Zeichenkette bergeben die ein XML Dokument enth lt gibt die Funktion ein Dokumentenobjekt zur ck Das Objekt unterscheidet sich jedoch von dem weiter oben beschriebenen Es erlaubt keinen Aufruf von Funktionen aber setzt Eigenschaften genauso Anstatt eine Liste der Tochter elemente mit dem Aufruf children zusammenzustellen sind die Tochterele mente bereits in der Struktur vorhanden in der Klassenvariablen children Dies erleichtert den Zugriff auf Elemente in jeder Tiefe Auf den Inhalt des Elements greeting k nnen Sie demnach mit dem folgenden Aufruf zugreifen Create xmldoc object from file doc xmldocfile join file file or die XML error while parsing wfile file print doc gt root gt children L0 gt content Das sieht sehr viel besser aus Wenn Sie die Struktur die mit xmltree zur ck gegeben wurde mit var_dump ausdrucken erhalten Sie folgende Ausgabe object Dom document 2 L version gt string 3 1 0 L ro
387. iedenen 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 berech nen k nnen Nehmen wir beispielsweise an Sie m chten bei Index 2 begin nend drei aufeinanderfolgende Array Elemente auslesen base_index 2 for i base_index i lt base_index 3 i print Element i is my_array i 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 werden um assoziative Arrays zu verarbeiten 101 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax Indizierte Arrays sind in PHP nur eine Sonderform der assoziativen Arrays Wenn Sie u
388. ieren k nnte In Zeiten plattform bergreifender Systeme w re dies nicht von Vorteil Eine IRC Bibliothek die gut funktioniert n mlich phpIRC siehe unter ww phpwizard net phpIRC abstrahiert den Zugriff auf IRC Netzwerke durch eine Reihe von leicht zu verwendenden API Funktionen und setzt damit die IRC Verwaltung in Bezug auf die Komplexit t des Programms auf die gleiche Stufe wie die Datenbankverwaltung Eine bereits vorhandene IRC Serversoftware handhabt alle kleinen und gro en Probleme der Benutzerverwaltung des zuverl ssigen Datenver kehrs Routing usw zwischen Netzwerken Die Software gibt es bereits seit l ngerem und hat sich bew hrt Au erdem ist sie f r alle Systemtypen verf gbar IRC ist extrem skalierbar Wenn Sie aufgrund von unvorhergesehenen Ereignissen auf dem Server A zu Spitzenzeiten eine zu hohe Belastung haben schalten Sie einfach Server B hinzu und errichten dynamisch eine Serververbindung zu dem bestehenden Chat IRC l sst dieses zu und der Vorgang ist vollautomatisch Damit haben Sie einen weiteren Server mit gen gend freier Kapazit t f r zus tzliche Benutzer 3 3 Grundlagen des IRC Netzwerks Nachdem wir einen Kommunikationsstandard f r den Chat ausgew hlt haben m chten wir uns den Aufbau des IRC Netzwerks genauer ansehen Idealerweise sollten Sie die IRC Netzwerkgrundlagen die in diesem Ab schnitt besprochen werden durchgearbeitet haben bevor Sie sich f r IRC ent scheiden Es ist imm
389. iert bis entsprechende Sicherheitsratschlage von CERT ausgegeben wur den Diese finden Sie unter ww cert org advisories CA 2000 02 html Selbst wenn wir uns all diese Ratschl ge merken und alle vom Benutzer gelie ferten Variablen berpr fen k nnen wir sehr leicht die falschen berpr fun gen vornehmen Bei einigen Programmen sollen beispielsweise bestimmte HTML Tags in Daten zugelassen sein Eines dieser Tags ist das Tag lt p gt das die Formatierung von Texten in Abs tzen erm glicht Es kann ein Attribut namens align haben das die Ausrichtung des Absatzes angibt Um das ff nende Tag anzupassen sollten Sie in einem ersten Versuch den regul ren Ausdruck lt p gt gt verwenden Viele Browser unterst tzen aber auch f r eine ganze Reihe von Tags das allgemeine Skriptverhalten Benutzer k nnen ein beliebiges JavaScript senden das im Ereignis onClick oder onMouseOver des Tags lt p gt eingebettet ist und den gemeinen Code erneut ausf hren Zun chst m chten wir Ihnen klarmachen dass all diese Bedrohungen zusam mengenommen ein sehr h ssliches Bild ergeben Sie m ssen wirklich sehr vorsichtig sein wenn Sie alle Fallen vermeiden m chten Dies ist auch der Hauptgrund weswegen wir empfehlen einen Sicherheitsberater in das Ent wicklungsteam aufzunehmen Hier einige allgemeine Hinweise und Richtlinien um diese Risiken zu mini mieren Verwenden Sie Sitzungen anstatt Daten auf dem Client von einer Seite auf die n chste
390. in ASP und Sie haben wieder ein Array Wie die Serialisierungs und Deserialisierungsfunktion tats chlich rea lisiert wird ist unerheblich In PHP haben Sie die wddx Funktionen in ColdFusion k nnen Sie das Tag CFWDDX verwenden und in ASP steht ein COM Element zur Verf gung Zugegeben dies k nnten Sie auch ohne WDDX bewerkstelligen Es w re jedoch recht kompliziert insbesondere wenn Sie die Datentypen in den ver schiedenen Programmierumgebungen erhalten m chten Der Vorteil von WDDX liegt darin dass es Sie von diesen M hen befreit und eine flexible offene und pragmatische Alternative bietet um strukturierte Anwendungs daten auszutauschen 7 3 5 WDDX Datentypen Die meisten Programmiersprachen verwenden die gleiche Art von Datenty pen z B Strings oder Arrays Der Zugriff auf diese Strukturen kann von Spra che zu Sprache variieren aber der allgemeine Ansatz bleibt der gleiche Ein String ist eine Folge von Zeichen Ob Sie diese nun in einfache Anf hrungs striche doppelte Anf hrungsstriche oder gar nicht einschlie en macht vom Konzept her keinen Unterschied WDDX unterst tzt diese generischen Datentypen In der Version 1 0 der Spe zifikation werden folgende Typen definiert Null Werte Element nul Boolesche Werte bool Zahlen ohne Unterscheidung zwischen ganzen Zahlen und Flie komma zahlen number Strings string Datum Zeitangabe dateTime Indizierte Arrays array Assoziative Arrays struct Samml
391. in der gleichen Darstellung an 211 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Verwenden Sie f r die Benennung von Schaltfl chen und Verkn pfungen ein konsistentes Namensschema Verwenden Sie ein konsistentes Mittel um den Status eines Dialogs zu ndern Platzieren Sie beispielsweise die Schaltfl che zum Abschicken eines Formulars stets in die untere rechte Ecke Erfinden Sie kein neues grafisches Benutzerelement wenn es nicht not wendig ist Eine Website die wir berpr ften verwendete beispielsweise Bilder anstelle von reinen HTML Kontrollboxen Beim Klicken auf ein Bild wurde die gesamte Seite mit einer leichten nderung des Kontrollk st chenbildes neu geladen je nach vorherigem Status entweder aktiviert oder deaktiviert Ein l stigeres Verfahren gibt es wohl kaum Ist es benutzerspezifisch Personenspezifische Inhalte das ist eines der Schlagworte im Internet Wir meinen damit nicht dasselbe wie die Marketingabteilung die personenspezi fische Werbung personenspezifische Spammails oder personenspezifische Nachrichten anpreist Fiir uns bezieht sich der Begriff personenspezifische Webanwendungen einfach auf Programme die auf die Bed rfnisse und die kulturellen Eigenschaften individueller Benutzer zugeschnitten sind 7 Quick Cost Calculator Netscape Ben l x Eile Edit View Go Communicator Help 2i ne Bookmarks Netsite frit www ups com using services tave rate h
392. ine bereinstimmung gefunden wird gibt der Rest der Zeile das Programm an das aufgerufen wird Das Programm sollte bertragungsinformationen als Standardeingabe erwarten Anstelle eines regul ren Ausdrucks k nnten Sie auch eine Zeile in der Datei verwenden die mit DEFAULT beginnt Diese Anweisung wird herangezogen wenn kein ber einstimmendes Verzeichnis gefunden wird Ein weiterer spezieller Befehl ist ALL der immer ausgef hrt wird Zwei Beispiele solcher Zeilen phpBook cvs loginfo_process phpBook sh ALL cvs loginfo_process_all sh 242 Pearson A ADDISON WESLEY Education Versionsverwaltung mit CVS Das erste Shell Skript loginfo_process_phpBook sh wird nur f r das Archiv phpBook aufgerufen Das zweite Skript loginfo_process_all sh wird bei jeder R ck bertragung aufgerufen ungeachtet des Archivs da es das Schl ssel wort ALL enth lt In das aufzurufende Programm k nnen ein paar spezielle Variablen eingef gt werden die ausf hrliche Informationen ber die R ck bertragung angeben Diese Variablen werden durch ein vorangestelltes Prozentzeichen mar kiert hnlich der Formatdeklaration in printf Wenn mehr als eine Variable verwendet wird m ssen diese in geschweiften Klammern angegeben sein Die folgende Tabelle zeigt die verf gbaren Variablen Variable Bedeutung s Dateiname V Versionsnummer vor der R ck bertragung v Versionsnummer nach der R ck bertragung Sobald Sie e
393. ine Shop des Benutzers mit dem Warehouse Programm der Firma kombinieren 5 4 3 PHP und COM Das Component Object Model COM ist eine von Microsoft entwickelte Soft warearchitektur die eine Unterteilung von Programmteilen in bin re Module erm glicht COM definiert einen Standard f r das Zusammenspiel der einzel nen Module und spezielle Funktionen die jedes Modul haben muss Es h ngt von keiner Programmiersprache ab Microsoft versucht sogar COM als offe nen IETF Internet Engineering Task Force Standard zu etablieren Auf COM Objekte kann mit kompatiblen Anwendungen und Programmiersprachen zugegriffen werden z B ber Visual Basic Delphi oder PHP COM besch ftigt sich mit folgender Frage Wie kann ein System aufgebaut werden so dass bin re Programmkomponenten von verschiedenen Herstel lern zusammenarbeiten k nnen Microsofts erste Antwort auf diese Frage n mlich das Konzept der DLL scheiterte kl glich Aufgrund der fehlenden Versionskennungen in den DLLs k nnen auf demselben System keine zwei DLLs verwendet werden welche dieselbe Schnittstelle benutzen Betrachten 251 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien wir ein Beispiel Angenommen Sie haben ein server berwachendes Pro gramm dass in regelm igen Abst nden berpr ft ob ein Server noch arbei tet und die gesammelten Daten protokolliert Daneben haben Sie einen Front end mit sch nen Statistiken und ein wenig Prog
394. ine Struk turierung und logische Auszeichnung vorgenommen wird Im Gegensatz zu HTML unterscheiden Tags Klein und Gro schreibung sind Leerr ume bedeutend 304 Pearson A ADDISON WESLEY Education PHP und XML muss jedes ffnende Tag stets ein entsprechendes schlie endes Tag haben oder selbst schlie end sein z B lt xref gt k nnen Dokumente eine beliebige g ltige Document Type Definition haben Um es zusammenzufassen XML reduziert die Komplexit t von SGML ent h lt aber trotzdem alle notwendigen Funktionen f r die strukturelle Aus zeichnung einschlie lich der Definition von benutzerspezifischen Dokumen tentypen Vorteile von XML Aber warum XML Bei all diesen formalen Definitionen Datenbl ttern und Kurz bersichten erkennen Entwickler manchmal nicht auf den ersten Blick den Nutzen f r ihre t gliche Arbeit Warum sollten Sie jetzt XML an Stelle von Word oder Notes verwenden Oder Ihrem eigenen propriet ren Speicherfor mat Oder einer relationalen Datenbank Gegen propriet re Formate spricht haupts chlich ein Argument Sie sind pro priet r Daten die auf einem heterogenen Netzwerk wie etwa dem Internet verwendet werden sollen m ssen f r alle Typen von Computern benutzbar sein die mit diesem verbunden sind XML besteht aus reinem Text im Gegen satz zum bin ren Format der meisten propriet ren Anwendungen wodurch es auf allen derzeitigen Computerplattformen unterst tzt werden kann b
395. ine dieser Variablen verwenden wird automatisch eine weitere Zeichenfolge mit dem Namen des CVS Moduls vor der Variablen eingef gt Um eine Mail an John und Jane zu schicken k nnte folgende Zeile verwendet werden f api bin mail s CVS update s c john jane Was ist jedoch wenn die R ck bertragungsnachricht auch in einer Datei pro tokolliert werden soll CVS berpr ft nur den ersten Eintrag f r ein Verzeich nis auf bereinstimmung so dass das Einf gen einer weiteren Zeile f r f api nichts helfen w rde Zweifellos liefe sich dieses Problem durch ein Shell Skript l sen Aber was ist wenn die Routine erweitert werden sollte um sp ter die Nachricht in einer Datenbank zu speichern Listing 5 2 zeigt wie Sie dieses Problem mit PHP l sen In der Datei loginfo lautet der Aufruf fol genderma en phpBook usr local cvsroot CVSROOT Commit_Info php3 w usr local cvsroot CVSROOT logs default log CVS update s till tobias Diese Zeile weist CVS an das Skript Commit_Info php3 aufzurufen wenn eine Datei oder ein Verzeichnis in das Archiv phpBook zur ck bertragen werden soll Das Skript wird mit mindestens drei Argumenten in unserem Beispiel vier aufgerufen einem Dateinamen in dem eine protokollarische Zusammenfassung die ser Riickiibertragung gespeichert werden soll der Themenzeile der Email Nachricht 243 Pearson Education A ADDISON WESLEY 5 Grundlegende Webanwendungsstrategien dem den Empf
396. ine lokale Kopie des gesamten Projekts haben k nnen sie die Dateien bearbeiten Sie haben vereinbart dass John an f api_read php3 und Jane an f api_write php3 arbeitet Dies ist ein wichtiger Punkt CVS kann die Absprache im Team nicht ersetzen 234 Pearson A ADDISON WESLEY Education Versionsverwaltung mit CVS Nach einem ersten Entwicklungsdurchgang sendet John die Datei wieder zum zentralen Datenarchiv zur ck Da niemand anderer die Datei in der Zwi schenzeit bearbeitet hat braucht er hierf r nur einen einzigen CVS Befehl john dev home john f api gt cvs commit f api_read php3 Daraufhin zeigt CVS den Standardtexteditor des Systems an auf dem UNIX System ist es h ufig vi auf Windows Notepad und wartet auf einen Protokoll eintrag der dieser ge nderten Version zugeordnet wird Diese Meldungen k nnen sich andere Entwickler ansehen Deshalb sollte sie exakt beschreiben welche Arbeiten durchgef hrt wurden Nachrichten wie Datei ge ndert oder neue Funktion sind nicht sehr hilfreich und sollten daher vermieden werden Versuchen Sie so pr zise und klar wie m glich eine Zusammenfas sung Ihrer Arbeit zu geben und denken Sie dabei an die Richtlinien die wir in Kapitel 1 Entwicklungskonzepte f r eingebettete Quellcodekommentare aufgestellt haben Einige Entwicklungsteams verwenden die Protokollnach richten sogar um den Kunden automatisch ber die aktuellen Arbeiten zu informieren En gutes Bei
397. inen Integer enthalten werden in die ent sprechende numerische Darstellung umgewan delt ansonsten in 0 Arrays und Objekte werden in 0 konvertiert sofern sie leer sind ansonsten in 1 convert _to_ double ex Wert Erzwingt die Konvertierung in einen Double den Standardflie kommatyp NULL Werte Boolesche Werte Ressourcen Longs und nat rlich Doubles bleiben unver ndert Strings die eine Zahl ent halten werden in die entsprechende numerische Darstellung umgewandelt ansonsten in 0 0 Ar rays und Objekte werden in 0 0 konvertiert wenn sie leer sind ansonsten in 1 0 convert_to_string_ex Wert Erzwingt die Konvertierung in einen Sting Strings bleiben unver ndert NULL Werte werden in einen leeren String umgewandelt Der boolesche Wert TRUE wird in 1 umgewandelt ansonsten wird ein leerer String erzeugt Longs und Doubles wer den die entsprechende Stringdarstellung konver tiert Arrays werden in den String Array und Objekte in den String Object umgewandelt Tab 9 4 Funktionen zur Argumentenkonvertierung 399 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Funktion Beschreibung convert_to_array_ex Wert Erzwingt die Konvertierung in einen Array Arrays bleiben unver ndert Objekte werden in einen Array konvertiert indem alle ihre Parameter der Array Tabelle zugewiesen werden Die Parameter namen werden als Schl ssel verwendet die Para
398. ingen mag es kann zum Problem werden wenn Sie gr ere Projekte verwalten die Hunderte von PHP Dateien enthalten 220 Pearson A ADDISON WESLEY Die PHP Normal Form Education Es f hrt zu solchen Meldungen wie Ihr Formular hat einen Fehler bitte klicken Sie auf die Schaltfl che Zur ck um zum Formular zur ckzu kehren die wir bereits in Kapitel 4 abgelehnt haben Es ist einfacher einige Formularfelder im Voraus auszuf llen wenn sich berpr fungsmethode und Formular in einer Datei befinden Es ist uner heblich woher die vorweg eingetragenen Daten kommen vom Benutzer im Falle eines Fehlers oder von einer Datenbank f r eine zu bearbeitende Seite Nach unserer Erfahrung ist die PHP Normal Form das Standardformular von PHP das in Abbildung 5 1 zu sehen ist die vielseitigste Alternative zur Bearbeitung von Formularen M glicherweise sind andere Strategien f r Ihre Bed rfnisse besser geeignet aber die Logik die wir im Standardformular vor stellen ist so allgemein dass sie sich auch in den meisten anderen Formularen einsetzen l sst Grunds tzlich vereint die PHP Normal Form die Benutzer schnittstelle das Formular und die Programmlogik auf einer Seite wobei HTML Layout und Code trotzdem getrennt bleiben Bei der ersten Anfrage nach der Seite wird das Formular angezeigt Sobald der Benutzer das Formu lar weiterleitet berpr ft das Programm die Daten Durch POST aufgerufen Daten berpr fen
399. inhaltsgesteuerten Websites Die Firmen Website http www six de und der SixCMS spezifische URL http www sixcms com liefern zus tzliche Informationen ber die Firma ihre Kunden und die L sungen Diese Websites sind zwar ein hervorragendes Medium um Informationen zur ber die Firma und ihre L sungen zu ver breiten aber Mund zu Mund Propaganda von zufriedenen Kunden begr n den ebenso den Erfolg und den Zustrom neuer Kunden Die Pr sentation im Web ist auch eine Gelegenheit um SixCMS in Aktion zu zeigen und kunden spezifische Demos und Test Websites zu erstellen 8 2 3 Warum PHP Benutzerfreundlichkeit und geringe Lizenzgeb hren waren f r Six nat rlich wesentliche Kriterien f r die Wahl von PHP Kosten und Lizenzanforderun gen sind bei PHP kein Thema Bei anderen Optionen k nnen leicht Kosten in H he von Tausenden von Dollars pro Entwicklung oder aktivem Server ent stehen Anbieter welche die Open Source Technologie verwenden haben damit einen betr chtlichen Vorteil Sie kommen nicht in die Verlegenheit mit 354 Pearson A ADDISON WESLEY Education SixCMS dem Kunden komplizierte abgestufte Lizenzgeb hren zu er rtern sondern k nnen mit ihm die Kosten anhand der gew nschten Funktionalit t der Anwendung darlegen Ein weiterer Aspekt war die Leistung von PHP Die M glichkeit PHP als Modul auf dem Apache Webserver zu integrieren erbrachte Leistungsvorteile gegen ber anderen CGI Methoden Aus Firmen sic
400. inzugef gt sobald track_vars aktiviert wird Nachdem die Funktion serialize in PHP 4 0 verbessert wurde k nnen Sie auch Objekte Klassen als Sitzungsvariablen behandeln Aktivieren von track_vars und register_globals Um die gesamte Funktionalit t der Sitzungsverwaltungsbibliothek nutzen zu k nnen m ssen Sie in Ihrer PHP Konfiguration track_vars und register_glo bals aktiviert haben Alle Variablen die Sie ber mehrere Seitenanfragen hinweg erhalten m ch ten m ssen mit der Funktion session_register in der Sitzungsbibliothek registriert werden Beachten Sie dass im Argument der Funktion nicht die Variable selbst sondern der Namen der Variablen anzugeben ist Die Variable foo m ssten Sie folgenderma en eingeben session _register foo Der Code session _register foo 177 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte w rde nur dann etwas Sinnvolles ausgeben wenn foo der Name einer ande ren Variablen w re bar This is a string foo bar session_register foo Mit session_unregister k nnen sie Variablen aus der Sitzungsbibliothek ent fernen Genau wie im wirklichen Leben l sst es sich nicht immer vorhersagen wann eine Sitzung endet es sei denn durch ein gewaltsames Ende das durch session destroy erzwungen wird Wenn die Sitzung an beralterung einge hen soll m ssen verschiedene Konfigurationen in Augenschein genommen werden Wenn wir die Sitzungskenn
401. ion calculate req_code x eval req_code return m x b x 3 req_code enthalt die Eingabe aus dem zweiten Formularfeld in diesem Bei spiel m 10 b 20 Wenn wir dies mit eval ausfiihren erhalten wir die korrekte Variablenzuordnung fiir die n chste Zeile welche bereits die gesamte Berechnung vornimmt Und das war es 126 Pearson A ADDISON WESLEY Education Polymorphisierung und selbstmodifizierender Code 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 Z hler Ein einfaches Beispiel f r selbstmodifizierende Z hler sind Trefferz hler Nor 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 11111111111111 III III III III I II Do not modify above this point FITTTTTLTTTTT III III II III III I II increase counter counter write counter back to ourselves file fopen basename PHP SELF r fputs file lt n counter
402. ird der Destruktor aufgerufen den Sie zuvor f r diese Ressource registriert haben Der sch ne Nebeneffekt die ser Einstellung ist dass Sie sich nicht um Speicherl cher k mmern m ssen die durch Zuweisungen in Ihrem Modul entstehen Sie registrieren einfach alle Speicherzuweisungen als Ressourcen auf die Ihr aufrufendes Skript refe renziert Sobald das Skript beschlie t dass es diese nicht mehr ben tigt stellt Zend dieses fest und informiert Sie Um eine Ressource explizit aus einer Liste zu entfernen verwenden Sie die Fuktion zend_list_delete Des weiteren k nnen Sie auch die Erh hung des Referenzz hlers erzwingen wenn Sie genau wissen dass Sie eine weitere Referenz f r einen bereits zugewiesenen Wert generieren z B wenn Sie einen Standarddatenbanklink wiederverwenden F r diesen Fall verwenden Sie die Funktion zend_list_addref Um bereits zugewiesene Ressourceneintr ge zu suchen verwenden Sie zend_list_find Die vollst ndige API finden Sie in zend_list h Ein kleines Beispiel das zeigt wie Sie Ressourcen nutzen finden Sie auf der CD ROM 9 15 Makros zur automatischen Erstellung von globalen Variablen Neben den bereits besprochenen Makros gibt es einige Makros mit denen wir auf einfache Weise globale Variablen erstellen k nnen Dies kann sehr n tz lich sein wenn wir z B globale Flags einf hren wollen In der Praxis wird dies zwar nicht gern gesehen aber Tabelle 9 12 beschreibt Makros die genau dies t
403. ird zend_get_parameters_ array_ex verwendet um parameter_array mit g ltigen Zeigern auf die Argu mentwerte zu f llen Eine clevere Realisierung dieser Methode stellt der Code dar der PHPs fsockopen handhabt die sich im ext standard fsock c befindet Siehe hierzu auch Listing 9 7 Seien Sie nicht beunruhigt wenn Sie noch nicht alle Funktio nen kennen die in diesem Quellcode verwendet werden Wir kommen in K rze auf sie zur ck pval args 5 int sock emalloc sizeof int int sockp int arg_count ARG_COUNTCht int socketd 1 unsigned char udp 0 struct timeval timeout 60 0 unsigned short portno unsigned long conv char key NULL FLS_FETCH if arg_count gt 5 arg_count lt 2 zend_get_parameters_array_ex arg_count args FAILURE CLOSE_SOCK 1 WRONG_PARAM_ COUNT switch arg count case 5 convert_to_ double _ex args 4 conv unsigned long args 4 gt value dval 1000000 0 timeout tv_sec conv 1000000 timeout tv_usec conv 1000000 fall through case 4 if ParameterPassedByReference ht 4 php_error E_WARNING error string argument to fsockopen not passed by reference pval_copy_constructor args 3 397 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern args 3 gt value str val empty_string args 3 gt value str len 0 args 3 gt type IS STRING fal
404. ise von PHPLib besser verstehen 6 3 3 Auth Interna Wenn wir davon ausgehen dass Sie als Datenbank MySQL verwenden wird f r Ihre Benutzertabelle folgendes Schema verwendet CREATE TABLE auth_user user id varchar 32 NOT NULL username varchar 32 NOT NULL password varchar 32 NOT NULL perms varchar 255 PRIMARY KEY user id UNIQUE k_username username u Der prim re Schl ssel ist user_id da PHPLib intern nicht mit dem Benutzer name Passwort Paar des Benutzers arbeitet sondern mit dieser ID Diese ID die bei PHPLib uid hei t ist eine eindeutige Zeichenfolge vergleichbar mit der Session ID die aus einer Kombination von uniqid und md5 erzeugt wird uid md5 unigid hash_secret Warum verwendet PHPLib nicht einfach einen prim ren Schl ssel der sich aus den Feldern username und password zusammensetzt Auf diese Weise k nnte man sich das zus tzliche Feld user_id sparen Die Antwort ist einfach PHPLib soll f r einen beliebigen Authentisierungsprozess einsetzbar sein und den Verbindungsaufbau so einfach wie m glich halten Wenn Sie f r jeden Benutzer einen separaten eindeutigen Bezeichner fester L nge nehmen k nnen Sie einfach zus tzliche Tabellen erstellen die ber eine relationale Datenbank mit der auth_user Tabelle verkn pft werden 275 Pearson A ADDISON WESLEY Education 6 Datenbankzugriff mit PHP In unserem letzten Beispiel funktionierte der Trick weil wir einfach die Stan da
405. isierung von Benutzern Im n chsten Kapitel zeigen wir Ihnen den Einsatz von PHPLib in einer realen Anwendung In diesem Kapitel werden wir auch eine weitere Klasse von PHPLib einf hren die wir bisher noch nicht erw hnt haben die Klasse Temp late mit der Sie Programmcode und Layout trennen k nnen 286 Pearson vy ADDISON WESLEY Education Anwendungen der Spitzentechnologie Wenn Sie feststellen dass sich alle Dinge ndern werden Sie an nichts mehr festhalten Wenn Sie keine Angst vorm Sterben haben gibt es nichts was Sie nicht erreichen k nnen In diesem Kapitel werden wir uns eingehender mit den Aspekten moderner Webanwendungen befassen Im ersten Abschnitt Wissensrepr sentation erzeugen wir eine Tipp Daten bank f r Benutzerbewertungen Trefferz hler und eine unbegrenzte Anzahl von geschachtelten Kategorien Sie erfahren etwas ber Baumstrukturen und k nnen das in Kapitel 2 Erweiterte Syntax erworbene Wissen in die Praxis umsetzen XML Extensible Markup Language hat sich zum am weitesten verbreiteten Standard f r den Datenaustausch entwickelt Trotzdem erschweren allge meine Bemerkungen wie XML ist ein HTML mit dem Sie Ihre eigenen Tags erzeugen das tats chliche Konzept dahinter zu verstehen Wir werden ver suchen dieses zu erl utern und Ihnen eine umfassende Einf hrung in die XML Analyse mit Expat der Dokumentenobjektmodell Schnittstelle DOM und LibXML zu geben WDPDX Web Distri
406. isse zu generieren und zu l schen Dazu m ssten wir allerdings die bestehenden Funktionen im Nachhinein ndern es ist wenig sinnvoll eine einzige Funktion hinzuzuf 59 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte gen Wie Sie sehen h tten wir durch eine sorgf ltige Planung viel Zeit sparen k nnen Wenn wir zun chst einen Strukturtyp f r Zuordnungen definiert h tten und danach die ersten beiden Funktionen h tten wir diesen Datentyp daf r verwenden k nnen Dadurch h tten wir eine exakte L sung erhalten die wir nun in unsere Listenfunktion implementieren k nnten Da eine Klasse ein Stilbruch im Programmcode bedeuten w rde verwenden wir das assoziative Array Die Listenfunktion wird keinen Fehlercode zur ck geben also verwenden wir den zur ckgegebenen Wert der Funktion um die Daten zum Anrufer zur ckzuschicken Wenn Sie Fehlercodes verwenden m chten sorgen Sie daf r dass alle Funktionen Fehlercodes zur ckgeben auch wenn die bertragung immer klappt Der Benutzer Ihrer API wei nor malerweise nicht welche Funktion fehlschlagen kann und erwartet dass alle Funktionen einen Fehlercode zur ckgeben wenn einige dies bereits getan haben Arbeiten Sie ein konsistentes Fehlercode Schema aus mehr dazu fin den Sie in Kapitel 3 Zur ck zur Listenfunktion Der zuk nftige Prototyp k nnte folgenderma en aufgebaut sein function calendar_get_event_list range Retrieve event list
407. it 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 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 my_object gt var3 lt br gt 76 Pearson A ADDISON WESLEY Education PHP und objektorientierte Programmierung print New object goes new_object gt varl new_object gt var2 new_object gt var3 lt br gt 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 y Netscape olx File Edit View Go Communicator Help My object goes 1 2 3 New object goes 3 2 1 at b og eZ 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 R
408. ite f r ihre Aufgabe eignet Sie kennen die meisten der blichen Fehler und k nnen Schw chen Ihres Schnittstellendesigns entdecken ohne dabei die Entwicklungskosten in die H he zu treiben Letztendlich sind es Ihre Benutzer die ber den Erfolg oder Misserfolg Ihrer Projekte entscheiden und dieses Kapitel hat Ihnen gezeigt wie Sie sie zufrie den stellen 217 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte 4 5 Literaturhinweise 1 Siehe die historische Protokolldefinition unter www w3 org Protocols HTTP AsImplemented html Wiener M J Efficient DES Key Search Technical Report TR244 School of Computer Science Carleton Universit t Ottawa Canada May 1994 3 Fagan M E Design and Code Inspections to Reduce Errors in Program Development IBM Systems Journal Bd 15 Nr 3 1976 182 211 4 Nielsen Jakob Alertbox 22 August 1999 Siehe www useit com alert box 990822 html 5 Mantei M M und Teorey T J Cost benefit analysis for incorporating human factors in the software lifecycle Communications of the ACM 31 4 April 1988 428 439 218 Pearson vy ADDISON WESLEY Education Grundlegende Web anwendungsstrategien Wenn Menschen etwas als h bsch betrachten werden andere Dinge h sslich Wenn Menschen etwas als gut betrachten werden andere Dinge schlecht Kapitel 4 Webanwendungskonzepte beschrieb die grundlegenden Unter schiede zwischen Webanwendungen
409. its einige Bem hungen Magnetstreifenkarten f r Verschl s selungssysteme mit ffentlichen Schl sseln einzuf hren Die dritte Art der Authentisierung ist sehr viel gebr uchlicher Die Authenti sierung nach Merkmalen etwas das sie sind wird beispielsweise in Firewall Systemen verwendet um einem Objekt nur zu den Systemen mit einer bestimmten IP Adresse oder in einem bestimmten Bereich Zugriff zu gew h ren Au erhalb dieses Web Bereichs wird die Authentisierung nach Merkma len vermehrt in Systemen eingesetzt die Retina Abtastungen oder Fingerab dr cke als Berechtigung verwenden Dieses Verfahren ist zwar das sicherste der drei immerhin zielt die Berechtigung darauf ab sicherzustellen wer Sie sind und dieser dritte Typ kommt diesem Ziel sehr nah Seine Umsetzung ist aber auch die kostenintensivste Wie wir bereits betont haben k nnen IP Adressen zur Identifizierung von Einzelpersonen nicht in Betracht gezogen werden Sie brauchen immer noch ein pers nliches Identifizierungssystem das ein Peripherieger t verwendet Die unterschiedlichen Authentisierungsverfahren lassen sich nat rlich kombi nieren damit das Ergebnis sicherer wird Vorl ufig m chten wir jedoch unsere Anmeldeprozedur mit dem Authentisierungsverfahren nach Wissen fortsetzen Der Benutzer gibt zusammen mit seiner Identit t ein Authentisierungsele ment ein das h ufig ein Passwort ist Doch wie werden diese Daten vom Client zum Authentisierungssystem weiter
410. itungssperren 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 listQ 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 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 erweiterte PHP Programmierung und einen gro en Schritt weiter auf Ihrem Weg zum PHP Experten 128 Pearson vy ADDISON WESLEY Education Programmentwicklung ein Praxisbeispiel Vermeide Arger bevor er entsteht Bringe die Dinge in Ordnung bevor sie existieren Die gro e Pinie entspringt aus einem kleinen Spross Eine Reise von tausend Meilen beginnt mit einem einzigen Schritt Programmentwicklung ist ein so breites Feld dass es auch in einem einzigen Buch nicht vollst ndig abgehandelt werden kann Der Begriff
411. izeof zval NULL 409 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Listing 9 10 zeigt einen Quellcode der zwei Variablen erzeugt 1ocal_variable mit lokalem G ltigkeitsbereich und global_variable mit einem globalen G l tigkeitsbereich siehe Abbildung 9 7 Das vollst ndige Beispiel finden Sie auf der CD ROM Netscape iof x File Edit View Go Communicator Help Creating variables in a local scope Local Variable Type integer Contents 10 Global Variable Type NULL Contents Accessing variables from the main scope Local Variable Type NULL Contents Global Variable Type integer Contents 5 Document Done St W GP Z Abbildung 9 7 Variablen mit verschiedenen G ltigkeitsbereichen Hinweis Wie Sie sehen kann auf die globale Variable nicht innerhalb der Funktion zugegriffen werden Dies liegt darin dass sie im PHP Quellcode nicht mit global global_variable in den lokalen G ltigkeitsbereich impor tiert wurde 410 Pearson A ADDISON WESLEY Education Erzeugen von Variablen ZEND_FUNCTION variable_creation zval new_varl new_var2 AKE_STD_ZVAL new_varl AKE_STD_ZVAL new_var2 new_varl gt type IS LONG new_varl gt value lval 10 new_var2 gt type IS_LONG new_var2 gt value lval 5 ZEND_SET_SYMBOL EG active_symbol_ table local_variable new_varl ZEND_SET SYMBOL amp EG
412. k nnen Sie direkt in die Apache Bearbeitungsroutine eingreifen Damit wird es zu einer sehr sch nen Erg nzung f r PHP und andere Skriptsprachen zur Implemen tierung von Proxies f r spezifische Neuschreibregeln und Posttransaktions routinen u a Des weiteren hat Six Java auf der Server und der Clientseite getestet Obwohl es in Bezug auf die Leistung und die Kompatibilit t einige Probleme gab scheint das serverseitige Java f r bestimmte zuk nftige Anwendungen vielversprechend Im Vergleich zu anderen Technologien wie etwa Mod_Perl Java Cold Fusion und ASP ist PHP im Allgemeinen g nsti ger bietet eine hohe Leistung integriert sich gut in andere Technologien und arbeitet auf dem Apache Server sehr stabil Gibt es auch Probleme Im Grunde genommen ist die PHP Plattform recht gut Entwickler sollten jedoch die Grenzen kennen und die manchmal vorkommenden leichten nderun gen in der Programmiersprache oder den Funktionsaufrufen verschiedener Version beachten Zus tzlich sollten Probleme wie die Speicherbehandlung insbesondere bei Zeichenketten die mehrere Megabytes des Serverspeichers belegen ein Problem dessen sich PHP 4 0 hoffentlich annimmt und die schlechte Oracle Integration ber cksichtigt werden Weitere Defizite welche die Six Entwickler notierten sind die fehlende Konsistenz der Sprachsyntax und des Design sowie implizite Typumwandlung 356 Pearson vy ADDISON WESLEY Education SixCMS Ein weiteres Problem be
413. k Entwickler mit der hervorragenden R ckw rtskompatibilit t die PHP bietet sehr zufrieden Dem Vorhaben von BizChek PHP 4 0 zu verwenden das intern bereits getes tet ist steht nur die Besorgnis entgegen Betaversionen auf einem Produk tionsserver einzusetzen Die Firma begr fst die Updates im Bereich der Array 352 Pearson A ADDISON WESLEY Education SixCMS Verarbeitung Installation und die neuen Module der PHP 4 0 Betaversion Das aktualisierte System zur Sitzungsunterst tzung war eine der Funktionen auf die BizChek gewartet hat insbesondere da es bei der Einf hrung von Biz Chek noch kein PHPLib gab und sie nie auf diese Bibliothek umgestellt haben Obwohl ihr eigenes Sitzungsverwaltungssystem zuverl ssig arbeitet werden sie auf das in PHP 4 0 integrierte Session Management umsteigen 8 1 4 SchluBfolgerung PHP hat unsere Anforderungen genau erfiillt sagt CTO Mark Musone Es arbeitet mit Apache MySQL und Oracle zusammen um nur einige zu nen nen Und das auf sehr zuverlassige und leistungsfahige Weise was zu effi zienten dynamischen Webseiten mit sehr wenigen Problemen und nahezu keinen Ausfallzeiten f hrt PHP ist f r unser Gesch ft ganz klar von Vorteil und wir sind froh dass wir es benutzen k nnen 8 2 SixCMS Professionelle Inhaltsverwaltungssysteme waren bisher die Dom ne gro er Firmen und sehr kostenintensiv da sie mit Standardprodukten realisiert wur den die in der Regel eine sechsst
414. keitspr fungen anzuwenden Tats chlich konnte er die Tauglichkeit bereits mit einer Reihe von Basisverfahren deutlich verbessern Nach dem Prinzip der fr hen Fokussierung auf den Benutzer setzte er einige Techniken ein die wir in den folgenden Abschnitten besprechen Szenarien Vereinfachtes lautes Denken Heuristische Auswertung Szenarien Ein Szenario ist eine deutlich reduzierte Reihe von Funktionen oder Funktio nalit ten die einem Tauglichkeitstest unterzogen werden Traditionell wer den f r Tauglichkeitspr fungen komplexere Testf lle verwendet die schwie rig einzurichten und zu testen sind Da unser Szenario klein ist k nnen Sie es ohne weiteres h ufig ndern und es zum Testen verschiedener Versionen eines Prototyps verwenden Dieses Szenario wurde auf der Basis einer Aufgabenanalyse von realen Benutzern und ihrer Arbeit erstellt womit es in Hinsicht auf die tats chliche Verwendung des Systems so wirklichkeitsgetreu ist wie m glich Typische Szenarien sind Aufgaben wie Dokument ausdrucken oder einen Flug nach Honolulu f r den 1 Januar 2001 buchen Diese k nnen vom Benutzer mithilfe einer vereinfachten Version des lauten Denkens getestet werden Die ses Verfahren beschreiben wir im n chsten Abschnitt Vereinfachtes lautes Denken In einer Studie ber das laute Denken wird ein Benutzer berwacht w hrend er eine zuvor definierte Aufgabe in einem Szenario durchf hrt Traditionell wurde diese Studien
415. klung verschiedene Entwicklungsphasen und Gesch ftsprozesse kommt erscheinen Marketingfachleute auf der Bildfl che und schreien nach mehrstufigen Anwendungen Was soll das Ganze 5 4 1 Herk mmnliches Client Server Modell In der Vergangenheit war eine Nicht Webanwendung verantwortlich f r die Abwicklung aller Angelegenheiten beginnend bei der Benutzereingabe ber die Anwendungslogik bis zur Datenspeicherung Diese drei Einheiten waren miteinander verwoben was es schwierig wenn nicht gar unm glich machte eine von ihnen ohne Auswirkungen auf die anderen zu ndern Wenn Sie solch eine Anwendung mehreren Benutzern zur Verf gung stellen wollten hatten Sie ein Problem Was ist wenn sich das Datenformat ndert Was pas siert wenn Sie die Programmlogik ndern m ssen Sie m ssten alle Benutzer mit einer neuen lokalen Kopie der Anwendung versehen was bei gr eren Systemen unm glich ist Mit der Einf hrung der objektorientierten Entwicklung in bezug auf Analyse Design und Programmierprinzipien wurden Gesch ftsanwendungen modu lar Benutzerschnittstellen wurden blicherweise auf Arbeitsplatzrechnern eingesetzt w hrend Daten und Programmlogik auf einem Mainframeserver untergebracht waren Der Begriff Client Server wurde verwendet um die Trennung der Schichten oder Stufen zu beschreiben Eine zweistufige Client Server Architektur bietet grunds tzlich die M glichkeit Aufgaben zu tren nen Der Client bzw die erste Stufe ist f
416. l Id Extending Zend xml v 1 22 2000 05 22 20 02 58 till Exp dn config m4 for extension my_module dn don t forget to call PHP_EXTENSION my module dnl If your extension references something external use with PHP ARG_WITH my module for my_module support dnl Make sure that the comment is aligned with my_module Include my_module support 376 Pearson A ADDISON WESLEY Education PHPs automatisches Erstellungssystem dn Otherwise use enable PHP_ARG_ENABLE my_module whether to enable my_module support dn Make sure that the comment is aligned enable my module Enable my_module support if test PHP_MY_MODULE no then dnl Action PHP_EXTENSION my module ext_shared fi Listing 9 2 Die Standard config m4 Wenn Sie mit den M4 Dateien noch nicht vertraut sind jetzt ist sicher eine gute Zeit sich mit ihnen vertraut zu machen kann dies zun chst etwas ver wirrend erscheinen es ist aber tats chlich sehr einfach Hinweis Alles was das Pr fix dn hat wird als Kommentar behandelt und nicht analysiert Die Datei config m4 ist zust ndig f r die Analyse der Befehlszeilenoption die w hrend der Konfiguration an configure bergeben werden Dies bedeutet dass sie berpr fen muss ob erforderliche externe Dateien vorhanden sind und hnliche Konfigurations und Installationsaufgaben bernimmt Die Standarddatei generiert zwei Konfigurationsbefehle im Skript configure with my_
417. l through case 3 if ParameterPassedByReference ht 3 php_error E_WARNING error argument to fsockopen not passed by wreference args 2 gt type IS_LONG args 2 gt value lval 0 break convert_to_string_ex args 0 convert_to_long_ex args 1 portno unsigned short args 1 gt value 1val key emalloc args 0 gt value str len 10 Listing 9 7 Eine PHP Realisierung variabler Argumente mit fsockopen fsockopen nimmt zwei drei vier oder fiinf Parameter an Nach den obligato rischen Variablendeklarationen tiberpriift die Funktion den Bereich der Argu mente auf G ltigkeit Anschlie end verwendet sie ein Fall Through Mecha nismus mit der Anweisung switch um alle Argumente zu verarbeiten Die Anweisung switch beginnt mit der gr ten Anzahl von tibergebenen Argu menten fiinf Danach verarbeitet sie automatisch die Falle mit vier tibergebe nen Argumenten dann jene mit drei wobei in allen Stufen das ansonsten obligatorische Schliisselwort break weggelassen wird Nachdem der letzte Fall verarbeitet wurde beendet sie die Anweisung switch und f hrt die Minimalverarbeitung der Argumente durch wenn die Funktion mit nur zwei Argumenten aufgerufen wird Der mehrstufige Verarbeitungstyp der einer Treppe hnelt erm glicht eine bequeme Verarbeitung von einer variablen Anzahl von Argumenten 9 11 4 Zugriff auf Argumente Um auf Argumente zuzugreifen muss es f r jedes Arg
418. l und gibt das Ergebnis der Konvertie rung aus Wenn Sie so weit gekommen sind herzlichen Gl ckwunsch Sie haben soeben Ihre erste Erweiterung von PHP generiert 9 9 Fehlersuche Genau genommen ist bei der Kompilierung von statischen oder dynamischen Modulen kaum eine Fehlersuche m glich Das einzige Problem das auftreten k nnte ist dass sich der Compiler sich ber fehlende Definitionen oder etwas hnliches beschwert Stellen Sie in diesem Fall sicher dass alle Headerdateien verf gbar sind und dass Sie Ihren Pfad im Kompilierbefehl korrekt angege ben haben Um sicher zu gehen dass alles an der richtigen Stelle ist extrahie ren Sie ein sauberes PHP Quellverzeichnis und nutzen Sie die automatische Erstellung im Verzeichnis ext mit den frischen Dateien von der CD ROM Dies garantiert eine sichere Kompilierungsumgebung Wenn dieses Verfahren fehlschl gt versuchen Sie es mit der manuellen Kompilierung M glicherweise beschwert sich PHP auch ber fehlende Funktionen in Ihrem Modul Dies solle bei den Beispielquelldateien nicht passieren wenn Sie diese nicht ver ndert haben Wenn die Namen der externen Funktionen auf die Sie mit Ihrem Modul zugreifen m chten falsch geschrieben sind verblei ben Sie als nicht verkn pfte Symbole in der Symboltabelle W hrend des dynamischen Ladens und Verkn pfens durch PHP werden sie aufgrund der Schreibfehler nicht aufgel st Es gibt keine entsprechenden Symbole in der Hauptbin rdatei
419. l_cookieName poll_cookiePrefix poll_timeStamp 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 stempel f r die Wahl besteht und dann mit dem Pr fix des Cookies poll_ 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 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax Variable Funktionsnamen Was wir ber variable Variablennamen gesagt haben gilt auch f r 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 l 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
420. late Variable TITLE undefined gt lt title gt lt body gt Hello World lt body gt lt html gt Bei remove der Standardeinstellung werden nicht zugewiesene Platzhalter ohne Nachfrage aus der Schablone gel scht In der zweiten Zeile unseres Beispiels wird eine Schablonendatei mithilfe von set_file einer Klasse zugeordnet Diese Funktion hat zwei Argumente Im ersten Argument wird ein Handle angegeben mit dessen Hilfe die Schablo nendatei in k nftigen Funktionen referenziert wird Das zweite Argument enth lt den Dateinamen Bedenken Sie dass die Datei in jenem Pfad gesucht wird der im Konstruktor angegeben wurde in unserem Beispiel das aktuelle Verzeichnis Sie k nnen der Funktion set_file auch ein assoziatives Array bergeben um mehrere Dateien auf einmal zuzuweisen In diesem Fall sind die Schl ssel des Array die Handle und die Elemente definieren die einzel nen Dateinamen Anschlie end werden den Platzhaltern der Schablone mithilfe von set_var Zeichenketten zugeordnet Auch hier k nnen Sie wieder ein einzelnes Schl s sel Wert Paar an die Funktion bergeben oder ein assoziatives Array zur Sta pelverarbeitung Die brigen Zeilen unseres Beispiels rufen die Analysefunk tion parse auf und geben das Ergebnis aus p Dieses Beispiel zeigt eine sehr einfache Verwendung der Klasse Template Es arbeitet mit einer einzigen Schablonendatei und ersetzt jeden Platzhalter durch eine Zeichenkettenvari
421. le nderungen vorgenommen hat kopiert er die aktualisierte Datei wieder in das zentrale Datenarchiv Den Rest erledigt das CVS Programm Dieses weist jeder nderung eine Versionsnummer zu macht f r jede ge nderte Version einen Eintrag ins Protokoll protokolliert wer eine Datei zur Bearbeitung ausgelesen hat und gibt eine Warnung aus wenn andere eine Datei bearbeitet haben die Sie abmelden m chten Lassen Sie uns eine typische CVS Sitzung zu Beginn eines Projektes ansehen Es arbeiten zwei Entwickler an der Implementierung einer API John und Jane Wir gehen davon aus dass ihr Projektleiter einen vollst ndigen CVS Server eingerichtet hat ein zentrales Modul namens f api erzeugt hat und die CVS Umgebungsvariablen in ihren Shell Accounts entsprechend gesetzt hat Weitere Informationen zur Installation auf einem CVS Server oder Client fin den Sie im CVS Referenzhandbuch Zun chst m ssen sich beide Entwickler auf dem CVS Server anmelden und eine Kopie des Moduls auf ihr lokales System laden Dies geschieht mit dem Befehl cvs checkout der ein Verzeichnis erzeugt das nach dem Modul benannt ist in unserem Beispiel f api john dev mnt daten home john gt cvs login Logging in to john ww phpwebdev com CVS password lt password gt john dev home john gt cvs checkout f api cvs server Updating f api U f api config inc php3 U f api f api_read php3 U f api f api_write php3 Nachdem beide Entwickler jeweils e
422. le f r IRC Dieses Kapitel f hrt die Planungsgrundlagen an gibt Richtlinien zur Projektorganisation und zeigt wie modulare plugin f hige Anwendungen entwickelt werden 23 Pearson A ADDISON WESLEY Education Einf hrung Kapitel 4 Webanwendungskonzepte Sitzungsverwaltung Sicherheitsaspekte und Genehmigung sowie Tauglich keit bilden die Grundlage f r alle Webanwendungen Ohne die richtige Sit zungsverwaltung lassen sich Webanwendungen nicht ausf hren Sie m ssen einen Weg finden um Benutzer w hrend einer mehrseitigen Anfrage zu erkennen wenn Sie Variablen wie einen Einkaufskorb einem speziellen Benutzer zuordnen m chten Diese Identifizierung sollte so sicher sein wie m glich wenn Sie nicht wollen dass ein Benutzer die Kreditkarteninforma tionen eines anderen Benutzers sieht Tats chlich sind spezielle Erw gungen erforderlich um die Sicherheit in Ihren Anwendungen zu erh hen Auch wenn PHP f r Hackerattacken weniger anf llig ist als andere CGI Umgebun gen kann es sehr leicht passieren dass Sie vollkommen ungesch tzte Anwendungen schreiben wenn Sie einige wichtige Prinzipien au er Acht las sen die in diesem Kapitel behandelt werden Dieses Kapitel f hrt au erdem die grundlegenden Tauglichkeitskonzepte ein Sobald wir nicht mehr von unabh ngigen Skripten sondern von Anwendun gen reden f llt die Rolle des Benutzers mehr ins Gewicht Immerhin ist es der Benutzer der ber den Erfolg oder Misserfol
423. len Zur Kompensation der fehlenden Information aus dem ersten Schritt ber nimmt Ihr logischer Analysator diesen Schritt und ist damit doppelt belastet Genau wie bei einem Computer hat Ihr Gehirn nur eine begrenzte Kapazit t Die zus tzliche Belastung des logischen Analysators entspricht also dem Kapazit tsengpass des Gehirns wenn dieses versucht den Quellcode zu ver stehen und zu behalten Verstehen und behalten ist aber genau das was andere Leute beim Lesen Ihres Quellcodes tun sollen und was Sie beim Lesen fremder Codes beabsichtigen Dies war eine nahezu wissenschaftliche Erkl rung warum die Formatierung von Quellcode sinnvoll ist Gibt es noch einen anderen Grund Ja Gut forma tierter Quellcode sieht einfach gut aus Im Folgenden finden Sie einige Richtlinien die wir f r die optimalen Mittel zur Formatierung des Quellcodes halten Sie sind nicht bindend aber sie wer den allgemein als guter Stil betrachtet Viele industrielle und Open Source Projekte wurden auf diese Weise formatiert und h ufig zahlt es sich aus in diesem Stil zu schreiben Setzen Sie Block Tags lt gt lt php lt gt usw in separate Zeilen Ziehen Sie Bl cke stets mit Tabulatoren ein im Idealfall setzen Sie den Tabulator auf mindestens 4 F gen Sie zwischen Schl sselw rtern und Schl sselzeichen Leerzeichen ein insbesondere wenn Sie Berechnungen vornehmen Fassen Sie logische Programmteile in einem Block zusammen indem Si
424. lgende Skript 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 4 print lt h2 gt Looping without reset lt h2 gt print lt h3 gt First loop lt h3 gt for i 0 1 lt 2 i list key value each my_ array 71 Pearson A ADDISON WESLEY Education 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 4 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 ke
425. lick here We have recommendations for you in Books Music and Video Search of the Day tong i Fl ee In Books What s Hot in Auctions Only Connect The Blair Witch A It was in 1980 that Tim Berners Lee first began project Books fiddling with a nascent version of the World e Pok mon Wide Web Almost two decades later his p aving e Nora Roberts paceles Da weaved invention has transformed commerce Kids Business gm communications and our very notion of Music n 3 soi tae Scien 00 Hot New Releases To eH connectivity a revolution he chronicles to Amazon com 100 Hot Sellers Classical fascinating effect in Weaving the Web Goto Books f Soundtracks Books Updated Hourly Video r DVDs Top Sellers New In Music 1 Harry Potter and the Releases Kids amp Live Loreena Prisoner of Azkaban Family On the two disc benefit package Live in ee by J K Rowling i 2 ris and Te k Loreena cKennitt 2 Harry Potter and the e Auctions aris and Toronto M Harry Potter and E FE Deena Dare AORE Asn Poste Fama KCxMet E eney Sjewo Blado Kowo ea 2 si a TRAOS 1503 Abbildung 4 1 Amazon com versteckt die Sitzungskennnummer in der URL 170 Pearson A ADDISON WESLEY Education HTTP und Sitzungen Alle anderen Nachteile der manuellen URL nderung bleiben jedoch bei dynamischen Pfaden bestehen Dynamische Pfade mit mod_rewrite Mit ei
426. lie t einen Kaffee trinken geht um 15 Minuten sp ter wieder im Online Gesch ft zu erscheinen nat rlich mit einer anderen IP Nachdem Sie die Tatsache akzeptiert haben dass es keinen allgemeinen Ansatz gibt um den Benutzer mit einer vordefinierten magischen Nummer zu kenn zeichnen bleibt Ihnen nur noch die M glichkeit selbst eine Sitzungskennnum mer Session ID zu erzeugen und diese von Seite zu Seite weiterzuleiten Wie werden Sie fragen Lesen Sie weiter wir liefern die Einzelheiten ein wenig sp ter Die ID muss willk rlich sein da ansonsten ihre Benutzer versu chen werden sie herauszufinden um andere Sitzungen zu bernehmen Wenn die ID linear ist z B eine normale Nummer page php3 1D 5 k nnen Sie darauf wetten dass mindestens ein Benutzer versuchen wird page php3 ID 6 zu ffnen Vielleicht ist es Ihnen einfach nur peinlich wenn normale Benutzer die Ein kaufswagen anderer Benutzer einsehen k nnen Es wird jedoch zu einem gef hrlichen Sicherheitsproblem wenn Hacker Sitzungen von Anderen ber nehmen um die Kreditkartennummer herauszubekommen oder gef lschte Auftr ge zu erzeugen 167 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte PHP hat eine eingebaute uniqid Funktion Diese basiert jedoch auf der Sys temzeit und ist nicht sicher genug um als Sitzungskennnummer zu dienen Sie k nnen sie jedoch mit einer Hash Funktion und rand kombinieren um eine wirklich willk rliche
427. lio theksfunktionen sollte ihnen au erdem ein Pr fix vorangestellt sein Im vor angegangenen Beispiel haben die Bezeichner das Pr fix FI_ 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 Pearson vy ADDISON WESLEY Education 2 Erweiterte Syntax 2 3 Array Funktionen Die wichtigsten Array Funktionen sind 1ist each und count list ist eine Art Operator der aus einer Reihe von Variablen einen l Wert bildet einen Wert der auf der linken Seite eines Ausdrucks
428. ll Ihre Bed rfnisse abzu decken sie werden auch nicht unbedingt f r Ihre Probleme geeignet sein Einige Bibliotheken sind au erdem zu gro um sie stets mit sich rumzutra gen wenn Sie f r jeden Treffer Hunderte von Kilobytes Programmcode durchforsten m ssen wird die Leistungsf higkeit Ihres Standorts erheblich reduziert In diesem Fall zahlt es sich m glicherweise aus eine sub optimale L sung durch eine 100 optimale L sung zu ersetzen die Sie selbst entwi ckelt haben Bei gr eren Projekten ist die Gefahr von Problemen durch mangelnde Pla nung noch gr er Im letzten Drittel der Entwicklung sto en Sie pl tzlich auf Schwierigkeiten die Sie nicht vorhergesehen haben weil Sie zu wenig Zeit f r die Planung aufgewendet haben Diese Probleme k nnen so schwerwie gend sein dass Sie das gesamte Projekt neu strukturieren m ssen Stellen Sie sich ein datenbankgest tztes Programm vor dass sich auf eine zus tzliche Datenbank Abstraktionsebene st tzt Diese Abstraktionsebene l sst nur Text daten zu Sp ter stellen Sie aber fest dass Sie auch numerische Daten ben ti gen M glicherweise schaffen Sie es das Problem ber einen kleinen Umweg zu l sen m ssen aber feststellen dass dieser Umweg Ihren Anforderungen nicht gen gt Das Einzige was Sie an diesem Punkt noch tun k nnen ist die Datenbank Schnittstelle zu ndern Dazu m ssen Sie sowohl die Abstrak tionsebene ndern als auch alle Stellen im Hauptprogramm b
429. llen F llen drastisch senkt Ohne Investitionen in Hard Software und wegefallenem Wartungsaufwand aus Sicht der Informationstechnologie werden die Einspa rungen real messbar Outsourcing kann sich auch in einem verringerten Risiko ausdr cken durch Bereitstellung einer professionellen und zuverl ssi gen L sung bei der die Virus berwachung und die Vermeidung von Werbe mails zentral verwaltet und kontrolliert werden Dies ist ein weiterer immate rieller Vorteil den ein ausgelagertes webbasiertes Kommunikationsmittel bietet 8 1 2 Entscheidung f r PHP Seit der Einf hrung von BizChek im Jahre 1998 verwenden BizChek Entwick ler PHP und zwar PHP 2 0 Auch wenn BizChek ganz und gar auf PHP aus gerichtet ist bedeutet dies nicht dass zuvor keine anderen L sungen in Betracht gezogen wurden Die Experten verbrachten mehrere Monate damit verschiedene Alternativen zu testen und zu bewerten ASP Mod_Perl und Cold Fusion Sie befanden dass PHP die beste Wahl f r BizChek sei und seit Anbeginn richtete sich ihr Hauptaugenmerk auf PHP Als junges dot com Unternehmen mit begrenzten Mitteln das nichts als seine Arbeitskraft anzu bieten hatte waren sie von der Open Source Gemeinschaft sehr angetan Obwohl PHP wie viele andere Open Source Produkte von gro en Firmen nicht kommerziell unterst tzt wird belegten Marktstudien erst vor kurzem einen enormen Anstieg der PHP Verwendung auf Websites und in anderen Produkten Laut einer Webserver Um
430. lt die Funktion ur bereit welche die Session ID an den Link anh ngt sobald es in den get Modus wechselt link sess gt url script php3 272 Pearson A ADDISON WESLEY Education Authentisierung Wenn Ihre Session derzeit im get Modus ist s he die dabei erzeugte Variable link etwa folgenderma en aus script php3 Example_Session 2e4c3670ce9a143fee398aec282f960c Diese Funktion handhabt sogar Abfragezeichenketten korrekt Selbst wenn Sie eine URL aufrufen die einen Parameter beispielsweise script php3 foo bar enth lt entstehen keine Probleme Als Kurzform k nnen Sie f r die Ausgabe des entstandenen Links die PHPLib Funktion pur1 verwenden die genauso funktioniert wie ur1 aber auch die generierte URL ausgibt self_ur1 und pself_url erzeugen ent sprechend mit letzterer Funktion einen mit Tags gekennzeichneten Link auf die aktuelle Datei und geben diesen aus 6 3 Authentisierung Im Abschnitt Authentisierung in Kapitel 4 haben wir erw hnt dass die HTTP Authentisierung einige Nachteile hat und dass Sie diese mit der PHP basierten Authentisierung umgehen k nnen In den folgenden Abschnitten gehen wir hierauf ausf hrlich ein 6 3 1 Vorteile der PHP Genehmigung Dieser Abschnitt setzt dort an wo wir den Abschnitt Authentisierung des Kapitel 4 verlassen haben Dort erl uterten wir dass die HTTP Authentisie rung einige Nachteile hat und dass wir diese mit der PHP basierten Authenti
431. lt haben k nnte Der Absender muss daher mit seinem privaten Schl ssel unter zeichnen so dass der Empf nger mit dem ffentlichen Schl ssel des Senders abgleichen kann um die Authentizit t und Integrit t der Daten sicherzu stellen Dieses System wird als Verschl sselung mit ffentlichem Schl ssel bezeichnet Die beiden bekanntesten Algorithmen hierf r sind Diffie Hell man und RSA RSA steht f r die Erfinder des RSA Verschl sselungsystems Rivest Shamir und Adleman Der Hauptvorteil der Verschl sselung mit ffentlichem Schl ssel gegen ber der Verschl sselung mit geheimem Schl ssel besteht in dem h herem Niveau an Sicherheit und Benutzerfreundlichkeit Es m ssen keine privaten Schl ssel an andere Teilnehmer weitergeleitet werden Im Gegenteil bei der Ver schl sselung mit geheimem Schl ssel muss der geheime Schl ssel ber einen Kommunikationskanal ausgetauscht werden Dies bietet f r Hacker wieder die M glichkeit durch Abh ren w hrend der bertragung den Schl ssel her auszubekommen Ein weiterer Vorteil ist dass Systeme mit ffentlichen Schl sseln digitale Unterschriften bereitstellen k nnen indem ein Benutzer die Nachricht mit seinem privaten Schl ssel unterschreibt Die Verschl sselung mit geheimen 194 Pearson A ADDISON WESLEY Education Sicherheitsaspekte Schl sseln erfordert dagegen eine zentrale Datenbank mit Kopien aller gehei men Schl ssel eines Systems damit digitale Signaturen
432. lue struct _zval_struct Variable information zvalue_value value value unsigned char type active type unsigned char is_ref short refcount E Listing 9 8 Definition des PHP Zend Typs zval Genau genommen ist pval das in php h definiert ist nur ein Alias von zval das in zend h definiert ist das seinerseits auf _zval_struct referenziert Dies ist eine sehr interessante Struktur _zval_struct ist die Haupt struktur wel che die Struktur des Wertes den Typ und Referenzdaten enth lt Die Unter struktur zvalue_value ist ein Verbund der den Inhalt der Variablen enth lt Je nach dem Variablentyp m ssen Sie auf verschiedene Mitglieder dieses Ver bunds zugreifen Eine Beschreibung der beiden Strukturen finden Sie in der Tabellen 9 5 bis 9 7 Eintrag Beschreibung value Verbund der den Inhalt dieser Variablen enth lt Siehe Tabelle 9 6 f r eine Beschreibung type Enth lt den Typ dieser Variablen Siehe Tabelle 9 7 f r eine Liste der verf gbaren Typen is_ref 0 bedeutet dass diese Variable keine Referenz ist 1 bedeutet dass diese Variable eine Referenz auf eine andere Variable ist refcount Anzahl der Referenzen die f r diese Variable existieren F r jede neue Referenz auf diesen Wert der in dieser Variablen gespeichert ist wird der Z hler um 1 erh ht F r jede verlorenen Referenz wird der Z hler um 1 heruntergesetzt Wenn der Referenzz hler 0 erreicht gibt es keine Referenzen auf
433. lung von Kate gorien Wir haben uns f r die einfachste und am leichtesten zu realisierende L sung zur Verschachtelung von Kategorien entschieden Die Tabelle catego ries wird wie folgt definiert CREATE TABLE categories cat_id bigint 21 DEFAULT 0 NOT NULL auto_increment name varchar 32 NOT NULL parent_id bigint 21 DEFAULT 0 NOT NULL PRIMARY KEY cat_id KEY parent_id parent_id Verantwortlich f r die Verschachtelung ist nat rlich das Feld parent_id Es enth lt den Wert cat_id der Kategorie eine Ebene dar ber Genau genommen ist dies die einfachste Form f r eine Verzeichnisstruktur Jeder Knoten hat genau eine Eigenschaft die auf den Elternknoten referenziert Dieser Ansatz hat jedoch eine Reihe von Nachteilen Der gr te ist wohl dass es unm glich ist f r einen Knoten alle Elternknoten in einer SQL Abfrage zu ermitteln Dazu brauchen Sie mehrere SQL Abfragen Genau genommen brauchen Sie n 1 Einzelabfragen bei einer Verschachtelung von n Ebenen Wir haben uns f r eine rekursive Funktion entschieden um die Elternknoten mit der Funktion kb_cat_get_parents zu ermitteln Sie liest die Kategorien knoten aus der Datenbank aus solange cat_id mit der Stammkategorie ber einstimmt Dies l sst sich am besten anhand eines Beispiels demonstrieren Angenommen es gibt drei verschachtelte Kategorien INSERT INTO categories VALUES 1 Main Category 0 INSERT INTO categories VALUES 2 Sub Category I 1 I
434. m Auftreten eines Fehlers einfach abbricht Nicht zuletzt haben Sie eine vollst ndige Unterst tzung f r die Fehlersuche Connect to RDBMS link mysql_connect localhost root or die mysql_error Select database db mysal_select_dbC test or die mysql_error Create SQL statement sql SELECT FROM test Execute query res mysql_query sql or die mysql_error Loop through result set while row mysql_fetch_array res Loop through the db gt Records hash while list key value each row Print only non numeric indexes print is string key lt b gt key lt b gt valuesbr gt print lt p gt Listing 6 2 Beispiel einer herk mmlichen Programmierung Achten Sie auf eine potentielle Falle Sie sollten sich pro Anwendung auf eine Datenbank beschr nken PHP hat Probleme in einem Skript den Zugriff auf unterschiedliche Datenb nke zu gew hren insbesondere mit MySQL PHP geht davon aus dass es Verbindungen die bereits hergestellt wurden still schweigend wiederverwenden kann indem es denselben Benutzernamen und dasselbe Passwort verwendet Betrachten Sie dazu folgendes Beispiel res_one mysql_connect localhost root or die mysql_error res_two mysql_connect localhost root or die mysql_error Sie w rden erwarten dass es hier zwei verschiedene Verbindungsbezeichner gibt oder Die gibt es jedoch nicht
435. mal mit nur einem Argument und ein anderes mal mit vier Argumenten aufgerufen werden beide Aufrufe sind syntaktisch absolut korrekt 9 11 1 Anzahl der Argumente feststellen Da PHP keine formalen Funktionsdefinitionen besitzt die eine Unterst tzung f r die berpr fung der Aufrufsyntax bieten aber variable Argumente ver wendet m ssen Sie manchmal ermitteln mit wie vielen Argumenten Ihre Funktion aufgerufen wurde Hierf r k nnen Sie das Makro ZEND_NUM_ARGS ver wenden In fr heren PHP Versionen las dieses Makro die Anzahl an Argu menten aus mit denen die Funktion aufgerufen wurde Als Basis diente daf r der Eintrag ht in der Hash Tabelle der Funktion der in der Liste INTERNAL_ FUNCTION_PARAMETERS bergeben wurde Da ht inzwischen die Anzahl der Argu mente selbst angibt die an die Funktion bergeben wurden ist ZEND_NUM_ARGS zu einem Dummy Makro mutiert siehe seine Definition in zend_API h Es ist aber immer noch gute Praxis es zu verwenden um zu zuk nftigen nderun gen der Aufrufschnittstelle kompatibel zu bleiben Hinweis Die alte PHP quivalente dieses Makros hei t ARG_COUNT Der folgende Programmcode berpr ft die richtige Anzahl der Argumente if ZEND_NUM_ARGS 2 WRONG PARAMETER COUNT Wenn diese Funktion nicht mit zwei Argumenten aufgerufen wird wiirde eine Fehlermeldung ausgegeben Der obige Programmabschnitt verwendet das Makro WRONG_PARAMETER_COUNT das zur Generierung einer Standardfehler meldu
436. mangelnde Kommunikation zwischen den Entwicklern zur ckzuf hren Dieses Problem kann kein Versionskontrollsystem der Welt beheben Nachdem Jane es mit Konflikten zu tun hatte ist sie vorsichtig geworden und m chte den Status der Datei f api_write php3 berpr fen Deshalb gibt sie den CVS Befehl status aus jane dev home jane f api gt cvs status f api_write php3 Durch diesen Befehl erf hrt sie dass ihre lokale Kopie die derzeit aktuelle ist CVS hat folgende Statuscodes Code Beschreibung Up to date Die lokale Kopie ist identisch mit der Kopie auf dem CVS Server Locally Modified Die lokale Kopie wurde ge ndert aber noch nicht zum Archiv bertragen Locally Added Diese Datei wurde nur im lokalen Verzeichnis hinzugef gt Locally Removed Diese Datei wurde nur im lokalen Verzeichnis gel scht eeds Checkout or Needs Patch Die Version im zentralen Archiv ist neuer als die lokale Kopie die aktualisiert werden m sste eeds Merge Die Version im zentralen Archiv ist neuer als die lokale Kopie die ebenfalls ge ndert wurde Beide w rden nach der Aktualisierung abge glichen File had conflicts on merge Es gab einen manuellen Abgleich und die dar aus resultierenden Konflikte wurden noch nicht gel st Unknown Diese Datei geh rt nicht zur CVS Versionskon trolle Jede ge nderte Version die von einem Entwickler an das zentrale Archiv geschickt wird erh lt automatisch eine Versionsnummer Wi
437. mentare sollten innerhalb von Funktionen verwendet werden um zu erl utern was eine bestimmte Programmzeile oder ein Block genau macht 40 Pearson A ADDISON WESLEY Education Kodierungskonventionen Die folgenden Abschnitte sollen Ihnen einen Eindruck vermitteln wie diese Kommentare aussehen und welche Informationen sie enthalten k nnen Inzwischen werden diese Kommentare mit RAD Rapid Application Develop ment Werkzeugen oder anderen Autorenhilfen erstellt aber da es zum Zeit punkt der Bucherstellung keine hnlichen Systeme f r PHP gibt sollten Sie die Kommentare trotz der zus tzlichen Belastung von Hand schreiben In den folgenden Abschnitten werden die Kommentartypen nach Abstrak tionsgrad geordnet er rtert Wir beginnen dabei mit dem abstraktesten Typ Aktualisierung von Kommentaren Denken Sie daran die Kommentare einzugeben bevor oder w hrend Sie die Module oder Funktionen bearbeiten die sie beschreiben Es ist sehr rgerlich eine Datei im Nachhinein noch einmal ffnen zu m ssen nur um die Kom mentare einzuf gen Achten Sie darauf wenn Sie sp ter Funktionen ver n dern auch die Kommentare entsprechend zu ndern Wenn Sie beispiels weise globale Variablen hinzuf gen oder entfernen aktualisieren Sie auch ihren Verwendungszweck im Kommentarkopf Das Gleiche gilt f r nderun gen in der Reihenfolge von Parametern Parametertypen usw Einsatz von Makros zur Beschleunigung der Kommentierung Erstellen
438. mententypdefi nition zwei Standardattribute besitzen xml lang und xml space Das Attribut xml lang wurde definiert weil Sprachunabh ngigkeit eines der wichtigsten Ziele von XML ist Ohne jedoch zu wissen in welcher Sprache ein Text geschrieben ist kann eine Anwendung einen Text nicht anzeigen auf Rechtschreibung berpr fen oder indizieren Die Unicode Unterst tzung f r XML ist nicht sehr hilfreich wenn der Autor einem bestimmten Teil eines Dokumentes kein Sprachtag zuweisen kann Aus diesem Grund wurde das Attribut xm lang eingef hrt lt p gt Worldwide declarations of love lt p gt lt p xml lang It gt Ti amo lt p gt lt p xml lang De gt Ich liebe Dich lt p gt lt p xml lang X Klingon gt qabang lt p gt Ein Sprachbezeichner kann folgenderma en aussehen ein zweibuchstabiger Sprachcode nach ISO 639 ein Sprachcode der bei der Internet Assigned Numbers Authority IANA registriert wurde er beginnt mit dem Pr fix i oder I ein benutzerdefinierter Code der mit dem Pr fix x oder X beginnt Das andere Standardattibut xml space ist nicht so einfach zu verstehen und zu verwenden Wie bereits erw hnt ist Leerraum in XML signifikant Er wird an die verarbeitende Anwendung bergeben Wenn Sie unsere Kodierstil Richt linien gelesen haben wissen Sie dass Leerraum wichtig ist um den Pro grammcode zu strukturieren und Leerzeilen einzuf gen welche die Lesbar keit verbessern So wir
439. meter da diese in der Dokumentation nachzulesen sind Statt dessen zeigen wir den gro en Rahmen auf und erl utern PHPLib mit unseren eigenen Worten 6 1 1 Entstehung Die erste Version von PHPLib wurde 1998 von Boris Erdmann und Kristian Koehntopp entwickelt W hrend sie in Kiel bei einem Internetdienstanbieter an einem gro en Projekt arbeiteten stellten sie fest dass sie immer wieder dieselben Prozeduren programmierten Sie fanden die Art diese Probleme zu l sen nicht sehr zufriedenstellend Sie brauchten beispielsweise eine Anmeldeprozedur die nicht auf der HTTP Authentisierung basierte da dieses Genehmigungsverfahren weder sicher noch benutzerfreundlich ist F r eine korrekte Genehmigung brauchten sie eine funktionierende Sitzungsverwaltung wie wir bereits in Kapitel 4 Web anwendungskonzepte hervorgehoben haben Also begannen sie eine objektorientierte Bibliothek f r die Sitzungsverwaltung und genehmigung zu entwickeln die sich auf einem Konzept f r die Sitzungsverwaltung von Karl Heinz Wild st tzt Wie bei vielen Open Source Projekten kamen im Laufe der Zeit immer mehr Leute hinzu und das Projekt wuchs schnell Inzwischen verf gt PHPLib ber Module f r viele Aspekte der Genehmi gung und Sitzungsverwaltung und besitzt verschiedene Verfahren um HTML Eingabeformulare Tabellen und Baumstrukturen zu erstellen 6 1 2 Vorteile und Nachteile Wie wir in Kapitel 1 Entwicklungskonzepte erl utert haben sollten S
440. mit PHP entwickelt und m chten Ihre Fertigkeiten ausbauen Sie haben Erfahrung mit anderen Programmiersprachen und m chten Webanwendungen mit PHP entwickeln Sie sind PHP Experte und m chten Ihre PHP Kenntnisse erweitern Sie m ssen kein PHP Guru sein um dieses Buch zu lesen aber Sie sollten mit der Syntax von PHP vertraut sein oder sich mit Programmierprinzipien aus kennen Voraussetzungen Dieses Buch geht davon aus dass Sie eine funktionierende PHP Installation haben vorzugsweise PHP 4 0 oder h her Aufgrund seiner Beliebtheit ver wenden wir bei Bedarf als Datenbanksystem MySQL Da Plattformunabh n gigkeit eine der st rksten Vorz ge von PHP ist sollten unsere Beispiele sowohl unter UNIX als auch unter Windows laufen 22 Pearson A ADDISON WESLEY Education Aufbau dieses Buches Aufbau dieses Buches Dieses Buch ist in drei Teile unterteilt Teil I Erweitertes PHP befasst sich mit der erweiterten Syntax von PHP z B der Objektausrichtung den dynami schen Funktionen und Variablen und dem selbstmodifizierenden Programm code Er gibt einen berblick ber Projektplanungsprinzipien Programmier stile und Programmdesign Dieser Teil bietet Ihnen die notwendige Grundlage f r eine schnelle und produktive Entwicklung von industriellen Webanwendungen Teil II Webanwendungen konzentriert sich auf die Entwicklung der Soft ware Er geht darauf ein warum Sitzungen wichtig sind welche Sicherheits Richtlini
441. n Schl ssel Wert 0 Element 1 1 Element 2 2 Element 3 67 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax Hier sehen die Auflistung aller Schl ssel 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 zurtickgegeben welches das erste Schltissel Wert Paar aus my_array enthalt 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 Schliissel 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 7 Netscape Ol x Eile 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 Element 3 while four_element_array each my_array while list key value each four_element_array print Key ke
442. n Die mit dem obigen Code erzeugte Variablen haben stets nur lokal G ltigkeit so dass sie in dem Kontext abgelegt werden in dem die Funktion aufgerufen wurde Um neue Variablen auf globaler Ebene zu erzeugen verwenden Sie dieselbe Methode referenzieren aber auf eine andere Symboltabelle zval new_ variable allocate and initialize new container MAKE_STD_ZVAL new _variable set type and variable contents here introduce this variable by the name new_variable name into the global symbol table ZEND_ SET SYMBOL amp EG symbol table new_variable Das Makro ZEND_SET_SYMBOL wird nun mit einer Referenz auf die globale Hauptsymboltabelle aufgerufen indem EG symbol_table referenziert wird Hinweis Die Variable active_symbol_table ist ein Zeiger symbol_table hin gegen nicht Deswegen m ssen Sie EG active symbol table und amp EG symbol_ table als Parameter zu ZEND SET SYMBOL verwenden dieses Makro ben tigt einen Zeiger Wenn Sie die Version noch effizienter machen wollen k nnen Sie die Aktuali sierung der Symboltabelle auch direkt im Programm kodieren zval new_ variable allocate and initialize new container MAKE_STD_ZVAL new _variable set type and variable contents here introduce this variable by the name new variable name into the global wsymbol table zend_hash_update amp EG symbol table new_variable name strlen new variable name 1 amp new variable s
443. n denn lange Zeichenkettenbe fehle erzeugen einen sehr viel h heren Datenverkehr als einzelne bin re Zei chen Auf der anderen Seite vereinfacht es aber die Datenweiterleitung Die meisten der heutigen IRC Server unterst tzen komprimierte Backbone Ver bindungen die den Datenverkehr stark reduzieren IRC ben tigt zwar f r jedes teilnehmende System eine spezielle Client Soft ware aber wir k nnen diese Anforderungen zu unserem Vorteil nutzen Warum sollten wir nicht die Client Software auf der Serverseite bereitstellen 132 Pearson A ADDISON WESLEY Education Vergleich von Technologien und sie abstrahieren indem wir eine HTML Schnittstelle benutzen und den Netzwerkzugriff f r den Benutzer ber einen HTML Client erm glichen Dies g be uns die Kontrolle dar ber was der Benutzer tun kann jeder Benut zer ist gezwungen unseren HTML Client zu verwenden und was nicht Zus tzlich stehen uns alle Vorteile eines bereits bestehenden Netzwerksys tems zur Verf gung zuverl ssige Client Software ein bew hrte Konzept Hunderte von Werkzeugen usw Wir k nnten den Benutzern sogar erlauben ihre eigene Client Software zu benutzen Diese Option werden wir in den meisten F llen nicht nutzen da wir ein geschlossenes Chat Netzwerk erzeugen m chten In einem geschlossenen Netzwerk kennen Sie alle Wege ber die ein Client auf Ihr Netzwerk zugreifen kann Wenn Sie die Zugriffs m glichkeiten auf spezielle Einstellungen beschr
444. n tigen Sie einen neuen Hash Tabellen Handle der im Mitglied ht des zval value Containers gespeichert wird 413 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Es gibt eine API die nur f r die Erstellung von Arrays zust ndig ist Dies ist sehr praktisch Um ein neues Array zu initialisieren rufen Sie array_init auf zval new_array MAKE_STD_ZVAL new_array if array_init new_array SUCCESS Wenn array_init kein neues Array generieren kann wird FAILURE zur ck gegeben do error handling here Zum Hinzuf gen neuer Elemente in das Array k nnen Sie zahlreiche Funkti onen verwenden je nachdem was Sie tun m chten In den Tabellen 9 8 bis 9 10 erhalten Sie eine Beschreibung dieser Funktionen Alle Funktionen geben beim Fehlschlagen FAILURE zur ck im Falle eines Erfolgs SUCCESS Hinweis Die Funktionen aus Tabelle 9 8 arbeiten alle mit dem Array array mit dem Schl ssel key Der Schl selstring muss sich nicht im internen Zendspeicher befinden er wird von der API dupliziert Funktion Beschreibung add_assoc_long zval array F gt ein Element des Typs long hinzu char key long n add_assoc_unset zval array F gt ein nicht gesetztes Element hinzu char key add_assoc_bool zval array F gt ein boolesches Element hinzu char key int b add_assoc_resource zval F gt im Array eine Ressource hinzu array char key int r add_assoc_do
445. n wir sp ter noch n her ein F r den Moment verwenden wir einfach die Stan darddateien Alle Beispiel Quelldateien auf der CD ROM haben funktionie rende config m4 Dateien Um sie in den Erstellungsprozess von PHP zu inte grieren brauchen Sie lediglich die Quellverzeichnisse in Ihr PHP Verzeichnis ext kopieren buildconf ausf hren und dann die Beispielmodule mithilfe der entsprechenden enable Anweisungen mit configure einzubinden 9 6 Erweiterungen erzeugen Wir beginnen zun chst mit einer einfachen Erweiterung die nichts weiter tut als eine Funktion zu installieren welche die Ganze Zahl die es erh lt als Parameter auszugeben Listing 9 3 zeigt den Quellcode include standard header include php h declaration of functions to be exported ZEND_FUNCTION first_module compiled function list so Zend knows what s in this module zend_function_ entry firstmod_functions ZEND_FE first_module NULL NULL NULL NULL compiled module information zend_module_entry firstmod_module_ entry First Module firstmod_functions NULL NULL NULL NULL NULL STANDARD_MODULE_PROPERTIES implement standard stub routine to introduce ourselves to Zend 378 Pearson A ADDISON WESLEY Education Kompilierung von Modulen if COMPILE DL DLEXPORT zend module entry get_module void return amp firstmod_module_ wentry endi f implement function
446. n INTERNAL_FUNCTION_PARAMETERS das wir bereits fr her in diesem Kapitel besprochen haben Wenn Sie auf die globalen Variablen des Executors in 428 Pearson A ADDISON WESLEY Education Initialisierungs und Deinitialisierungsfunktionen einer anderen Funktion zugreifen wollen f r die sie nicht automatisch ver fiigbar sind rufen Sie in dieser Funktion einmalig das Makro ELS_FETCH auf Damit werden die Variablen einmal im lokalen G ltigkeitsbereich verf gbar Schlie lich kann die derzeit ausgef hrte Zeilennummer ber die Funktion zend_get_executed_lineno ausgelesen werden Diese Funktion ben tigt eben falls die globalen Variablen des Executors Beispiele dieser Funktionen sehen Sie in Listing 9 15 und Abbildung 9 10 Nat rlich sind alle Beispiele auch auf der CD ROM verf gbar zend_printf The name of the current function is s lt br gt get_active_function_name zend_printf The file currently executed is s lt br gt wzend_get_executed_filename ELS_C zend_printf The current line being executed is i lt br gt wzend get executed_lineno ELS_C Listing 9 15 Ausgabe von Ausf hrungsinformationen XY Netscape OP x File Edit View Go Communicator Help Printing some debug information The name of the current function is debugprint The file currently executed is home wwrw htdocs infoprint php The current line being executed is 11 Document Done 34 ey A Abbildung 9 10 Ausgab
447. n PHP 4 0 Knacken wir den PHP Kern php_info_print_table_row 2 Just to fill another row here php_info_print_table_end Listing 9 14 Quellcode und Ausgabe in phpinfo 7 Netscape Ioj xi File Edit View Go Communicator Help Host kraftwerk tower net User Agent Mozilla 4 61 en Win98 D HTTP Response Headers X Powered By PHP 4 0b4pl1l Connection close Content Type text html charset iso 8859 1 Printing information examples First column Second column Entry in first row Another entry Just to fill another row here Additional Modules File functions Socket functions oi Document Done SEITE Abbildung 9 9 Ausgabe aus phpinfo 9 18 4 Informationen ber die Ausf hrung Sie k nnen auch Informationen ber die Ausf hrung ausgeben wie etwa ber die Ausf hrung der aktuellen Datei Der Name der Funktion die gerade ausgef hrt wird kann ber die Funktion get_active_function_name ausgele sen werden Diese Funktion gibt einen Zeiger auf den Funktionsnamen aus und hat keine Argumente Um den Namen der gerade ausgef hrten Datei auszulesen verwenden Sie zend_get_executed_filename Diese Funktion greift auf die globalen Variablen des Executors zu die ber das Makro ELS_C an diesen bergeben wurden Die globalen Variablen sind automatisch f r alle Funktionen verf gbar die direkt von Zend aufgerufen werden sie sind Teil vo
448. n Sie Zeit und Programmcode sparen Die Standardroutine berpr ft ob der vorliegende Datenabschnitt ein Kom mentar ist und gibt diesen zur ck wenn es der Fall ist Zusammen mit dem Kommentar wird auch die aktuelle Zeilennummer ausgegeben ausgelesen mit xml_get_current_line_number Dieses Beispiel zeigt zwar die grundlegenden Konzepte f r den Aufruf des XML Parsers Registrierung von R ckruffunktionen und die Verarbeitung von Daten ist aber keine exakte Wiedergabe der blichen Verwendung eines XML Parsers Informationen werden nicht verarbeitet Rohdaten werden ein fach eingelesen und Zeichenketten gescannt Nichts was nicht auch mit einem herk mmliche regul ren Ausdruck bewerkstelligt werden k nnte In 320 Pearson A ADDISON WESLEY Education PHP und XML den meisten F llen in denen Sie XML einsetzen m chten Sie zumindest eine einfache Darstellung der Dokumentenstruktur erhalten Stapel Tiefen und Listen Unser zweites Beispiel zeigt wie die Elementtiefe erfasst wird die der Parser gerade bearbeitet In der Startelementroutine wird die globale Variable depth um vier erh ht In der Stoppelementroutine wird sie um denselben Betrag reduziert Dies ist der kleinste Fall eines Parserstapels Au er der Tiefenan gabe werden keine Strukturinformationen gespeichert Als XML Pretty Prin ter verwendet das Beispiel die Tiefe f r den richtigen Einzug des Codes Die Funktionen der Routine wenden einfach ein Cascading
449. n Sie auf diese Variable zu indem Sie das Array GLOBALS in der Form GLOBALS REQUEST_METHOD verwenden oder ber global REQUEST_METHOD eine globale Anfrage starten Die weitergeleiteten Daten werden auf syntaktische Richtigkeit berpr ft Dazu werden zwei Funktionen aus der Datei String_Validation inc php3 ver wendet die einige h ufig verwendete berpr fungsfunktionen f r Zeichen ketten bereitstellt siehe Tabelle 5 1 Wird ein Fehler in den bertragenen Daten gefunden dann wird im zugeh rigen Feld errors eine entsprechende 223 Pearson vy ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien Fehlermeldung ausgegeben Dies hilft sp ter festzustellen ob ein Fehler gefunden wurde Wenn count errors gr er ist als Null reagiert das Pro gramm entsprechend und verarbeitet das Formular nicht Funktion Zweck is_alpha Pr ft ob eine Zeichenfolge nur Buchstaben enth lt stellt optional die k rzeste und l ngste Zeichenfolge fest is_numeric Pr ft ob eine Zeichenfolge nur numerische Zeichen enth lt stellt optional die k rzeste und l ngste Zei chenfolge fest is_alphanumeric Pr ft ob eine Zeichenfolge nur alphanumerische Zei chen enth lt stellt optional die k rzeste und l ngste Zeichenfolge fest is_clean_text Pr ft ob eine Zeichenfolge einen erweiterten Satz von Zeichen enth lt der im Namen des westlichen Alphabets vorkommen kann einschlie lich aller Buchsta
450. n den Rahmen f r das Projekt ausarbeiten als auch wenn Sie mit Ihren Entwicklern sprechen um den Programmcode zu umrei en Je weniger M he Sie auf Konsistenz und Pflege verwenden umso eher werden Sie Probleme bekommen wenn Sie alte Dateien wieder ffnen m s sen um Fehler zu entfernen oder neue Funktionen hinzuzuf gen Die Zeit f r die Planung muss nicht unbedingt proportional zur Gr e des Projekts sein Denken Sie zum Beispiel an einen Suchalgorithmus den Sie ent werfen sollen Das Programm muss nicht mehr tun als sich durch einen Hau fen von Informationen durchzugraben und Daten nach bestimmten Regeln auszusortieren Angenommen die Daten seien bereits vorhanden so dass die Einrichtung und die Ausgabe keine gro e M he kostet Den gr ten Teil der Zeit wird das Programm in seiner Haupt Suchschleife verbringen Diese Schleife ben tigt wahrscheinlich nicht mehr als 100 Zeilen Programmcode aber das Ausw hlen bzw Entwickeln eines optimalen Algorithmus kann leicht einen ganzen Tag dauern Diese kleine Schleife erfordert m glicher weise die meiste Zeit Ihrer Planung w hrend Sie auf der anderen Seite Pro jekte mit einigen Tausend Zeilen in weniger als einem Tag durchgeplant haben Ein zweites Beispiel Angenommen Sie ben tigen ein kleines Skript das alle Dateien eines Verzeichnisses auflistet Sie k nnten den Programmcode ein fach runterhacken so dass es genau und nur diese spezielle Aufgabe erf llt und alle Dateie
451. n erstellen Sie haben gesehen wie PHP und Zend mit der internen Speicherung von Variablen umgehen und wie Sie diese Variablen generieren und auf sie zugreifen k nnen Sie ken 435 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern nen eine Reihe von Toolfunktionen die Ihnen viele Routineaufgaben wie etwa die Ausgabe von informativen Texten die automatische Einf hrung von Variablen in die Symboltabelle usw abnehmen Auch wenn dieses Kapitel h ufig einen referenziellen Charakter annahm hoffen wir dass Sie einen ersten Eindruck bekommen haben wie Sie Ihre eigenen Erweiterungen schreiben k nnen Aus Platzgr nden haben wir vieles weggelassen Wir empfehlen Ihnen sich die Zeit zu nehmen die Headerda teien und einige Module n her anzusehen insbesondere jene im Verzeichnis ext standard und das MySQL Modul da diese allgemein bekannte Funktio nen bieten Dadurch erhalten Sie eine Vorstellung davon wie andere Leute die API Funktionen benutzt haben speziell jene die keinen Eingang in dieses Kapitel fanden 9 22 Referenz Einige Konfigurationsmakros 9 22 1 config m4 Die Datei config m4 wird von buildconf verarbeitet und muss alle Anweisun gen enthalten die w hrend der Konfiguration ausgef hrt werden sollen Hierzu k nnen Befehle zur berpr fung von externen Dateien wie etwa Headerdateien Bibliotheken usw geh ren PHP definiert eine Reihe von Makros die in diesem Pro
452. n genauso gut eine API oberhalb von Expat generieren um eine DOM Schnittstelle bereitzustellen Zugegeben die LibXML Bibliothek erleichtert diese Aufgabe Sie m ssen lediglich die API ndern um sie der DOM Spezifikation anzupassen In Gnome gibt es sogar ein Gdome Modul das eine DOM Schnittstelle f r LibXML bereitstellt 332 Pearson vy ADDISON WESLEY Education PHP und XML Hinweis Als dieses Buch erstellt wurde war die LibXML API noch nicht hundertprozentig in PHP integriert Sie war noch instabil und enthielt Bugs Trotzdem konnte man bereits die immensen Vorteile sehen welche die fertige LibXML API bieten wird Deswegen haben wir beschlossen hier die grundlegenden Prinzipien zu erl utern und einige Beispiele vor zustellen Wenn nderungen auftreten werden wir diese auf der Website des Buches dokumentieren berblick Die meisten Entwickler werden uns zustimmen dass ein XML Dokument am besten durch eine Baumstruktur dargestellt wird LibXML bietet eine sch ne API um aus einer XML Datei B ume und DOM hnliche Datenstrukturen zu generieren Wenn Sie ein Dokument mit LibXML analysieren erstellt PHP eine Reihe von Klassen mit denen Sie direkt arbeiten k nnen Indem Sie die Funktionen dieser Klassen aufrufen k nnen Sie auf alle Ebenen der Struktur zugreifen und das Dokument ver ndern Die beiden wichtigsten Objekte die Ihnen bei der Arbeit mit LibXML begeg nen werden sind Dokumente und Knotenobjekte XML Dok
453. n genutzt werden k nnen Diese Strategie der Top Down Pro grammierung garantiert dass der Fokus nicht auf der Codeproduktion son dern auf der Produktentwicklung liegt was im Bereich der Entwicklung von Webinhalten unerl sslich ist PHP hat sich als skalierbar und schnell erwiesen da es von MarketPlayer com auf Websites mit hohem Datenverkehr ohne St rungen verwendet werden 361 Pearson A ADDISON WESLEY Education 8 Fallstudien kann Bei Beschr nkungen w re eine Migration auf schnellere Maschinen oder eine nderung der Netzwerktopographie empfehlenswerter als der Wechsel auf eine andere Technologie Durch permanentes Profiling k nnen Engp sse gefunden werden Es erleichtert auch die Entscheidung welcher PHP Code in C neu geschrieben und eingebunden werden muss 8 3 6 Sitzungsverwaltung MarketPlayer com verwendet zwei Techniken zur Verwaltung von Sitzungen Im ersten Fall werden die Benutzerdaten verschl sselt und auf dem Client rechner in Form eines Cookie gespeichert Dies hat den Nachteil dass jeder Server der dynamische Inhalte bereitstellt den Cookie entschl sseln k nnen muss In der Entwicklungsumgebung wird die Entwicklung neuer Funktio nen so lange verz gert bis die Speicherung mittels Cookies realisiert ist Der zweite und portierbarere Fall schlie t eine Datenbanktabelle ein die belie bige einzigartige Sitzungskennnummern mit authentisierten Benutzern abgleicht Sobald der Benutzer ber einen g lti
454. n in einem angegebenen Verzeichnis auflistet Dann m ssen Sie sich nicht mehr darum k mmern Das Problem ist gel st und Sie k nnen zu anderen Aufgaben bergehen Eine andere Strategie k nnte sein dass Sie sich berlegen ob Sie zu einem sp teren Zeitpunkt vielleicht in einem ganz anderen Projekt dies oder ein hnliches Werkzeug noch einmal ben tigen Jedes Mal eine Routine zum Auflisten von Verzeichnisinhalten zu schreiben die jeweils auf eine ganz spezielle Aufgabe zugeschnitten ist w re Zeitver schwendung Denken Sie dar ber nach wenn Sie in solch eine Situation kom men Sie k nnten beispielsweise ein separates Modul schreiben mit dem Sie verschiedene Verzeichnisse auflisten und optional Unterverzeichnisse mehr fach aufrufen und m glicherweise auch Platzhalter verwenden Sie k nnten eine kleine abgesicherte Funktion definieren welche die meisten Spezialf lle 31 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte abdeckt und gleichzeitig die allt glichen Anforderungen einer Verzeichnis auflistungsfunktion erf llt Mit letzterem Verfahren h tten Sie nach ein paar Projekten eine kleine Bibliothek an robusten Programmierwerkzeugen die Sie bedenkenlos wieder einsetzen und denen Sie vertrauen k nnen Dies k nnte die Entwicklungszeit in k nftigen Projekten erheblich verk rzen Die Anzahl der kostenlos erh ltlichen Werkzeugbibliotheken wird zwar immer gr er aber das wird kaum ausreichen um a
455. n integer constant if is_integer algorithms i print lt b gt algorithms i mcerypt_get_cipher_name algorithms i lt b gt lt br gt else print lt b gt algorithms i is not supported lt b gt lt br gt continue Get the block size of the current algorithm block_size merypt_get_block_size algorithms i Create an initialization vector from device dev random iv mcrypt_create_iv block_size MCRYPT_DEV_RANDOM Encrypt the plaintext with algorithms i encrypted mcrypt_cbc algorithms i secret message weMCRYPT ENCRYPT iv Decrypt it again unencrypted mcrypt_cbc algorithms i secret encrypted wMCRYPT_DECRYPT iv Qutput plaintext and ciphertext print Ciphertext encrypted lt br gt print Plaintext unencrypted lt p gt Listing 4 5 Mcrypt Routinen MCrypt verwendet zur Verschl sselung und Entschl sselung von Daten Blockverschl sselungsalgorithmen Die Blockverschl sselung ist eine Anwen dung der bereits erw hnten symmetrischen Verschl sselungsmethode Gegen teil Verschl sselung mit ffentlichem Schl ssel Wenn Sie eine Nachricht mit einer Blockverschl sselung bearbeiten k nnen Sie verschiedene Betriebsarten verwenden um den Klartext zu verschl sseln IS092b definiert vier generische Modi die f r die Verschl sselung von Bl cken beliebiger Gr e eingesetzt wer den k nnen Electronic Code Book Cipher Block Chaining Ci
456. nd der Laufzeit das berschreiben einer nderung durch den Benutzer zu und zwar ber zus tzliche Konfigurationsdateien wie etwa htaccess PHP_ INI_ALL erm glicht unbeschr nkt nderungen Daneben gibt es noch eine vierte Ebene PHP_INI_PERDIR Deren Verhalten konnten wir jedoch bisher noch nicht herausfinden Der vierte Parameter besteht aus einem Zeiger auf eine nderungsbenach richtigungsroutine Wenn einer dieser Initialisierungseintr ge ge ndert wird dann wird diese Routine aufgerufen Solch eine Routine kann ber das Makro PHP_INI_MH deklariert werden PHP_INI_MH OnChangeSecond handler for ini entry w second_ini_entry specify ini entries here PHP_INI_MH OnChangeSecond 433 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern zend_printf Message caught our ini entry has been changed to s lt br gt wnew value return SUCCESS Der neue Wert wird der Anderungsroutine als String in der Variable new_value tibergeben Wenn Sie sich die Definitionen von PHP_INI_MH ansehen stellen Sie fest dass Sie einige Parameter verwenden k nnen define PHP INI MH name int name php_ini_entry entry char new_value wwuint new_value_length void mh_argl void mh_arg2 void mh_arg3 Diese Definitionen finden Sie alle in php_ini h Ihre Nachrichtenroutine hat Zugriff auf eine Struktur die den gesamten Eintrag enth lt den neuen Wert seine L nge und dre
457. nd die Serverbelastung begrenzt Wie Abbildung 3 2 zeigt kann jeder Server jeden anderen Server ber mehr oder weniger Serverspr nge erreichen so dass jeder Server einfach alle ankommenden Daten an alle ausgehenden Verbindungen weiterleitet Server C und Server F haben m glicherweise Clients die am selben Kanal teilnehmen Kan le sind die Chat R ume von IRC Pl tze an denen sich Leute treffen und unterhalten k nnen In unserem Beispiel w rde Server C Daten ber die einzige ihm zur Verf gung stehende Verbindung schicken n mlich zu Server B Server B verteilt dann die Daten auf seine anderen Verbindungen n mlich Server A und Server D Server A hat keine weiteren Verbindungen macht also nichts aber Server D leitet die Daten an Server E weiter und der wiederum an Server F Dies ist recht einfach zu reali sieren hat aber einen Nachteil Wenn keiner der Clients die mit Server A ver bunden sind an dem Datenverkehr ber die Kan le teilnimmt ber die Server C Daten schickt werden alle Daten f r Server A die ber diesen Kanal geschickt werden einfach nur Bandbreite verschwenden RFC f r IRC hnlich wie bei allen offenen Standards im Internet wurden die Grundlagen des IRC Protokolls in einer RFC Request For Comments spezifi ziert Die RFC f r IRC ist die RFC 1459 die Sie etwa unter www irchelp orgherun terladen k nnen Diese Website enth lt viele Informationen ber IRC Server A Server F
458. nd hierhin weitergeleitet Damit kann Jane im Entwicklungszweig arbeiten ohne den Hauptzweig zu ndern Aber Vorsicht Die Pflege verschiedener Zweige kann sich zu einem verwalterischen Alptraum entwickeln Wir emp fehlen daher nicht mehr als drei Zweige je Projekt zu verwenden Tipp Wenn Sie sehen m chten zu welchem Zweig eine Datei geh rt ver wenden Sie cvs status Die Ausgabe Sticky Tag gibt den Namen des Ver sionszweigs und die Versionsnummer an H ufig wird ein Abgleich zwischen dem neuen Zweig und dem Hauptzweig vorgenommen Von Zeit zu Zeit m chte Jane die neuen Funktionen aus dem Entwicklungszweig wieder in den Hauptzweig bertragen Dazu muss sie zun chst den Hauptzweig auslesen und dann einen Diff f r den Entwick lungszweig erstellen jane dev home jane gt cvs checkout f api jane dev home jane f api gt cvs update j dev Die Option j join des Befehls cvs update weist CVS an die Unterschiede aus dem Entwicklungszweig mit der lokalen Kopie zu vermengen 241 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien Tipp Der Name des Hauptzweigs lautet immer HEAD Jane k nnte den Hauptzweig und den Entwicklungszweig mit dem Befehl cvs update j HEAD zusammenfassen Nach Behebung m glicher Konflikte kann Jane ihre Kopie an das Hauptver zeichnis zur ckschicken und die R ck bertragung ist abgeschlossen Automatische Benachrichtigung An diesem Punkt muss Jane wied
459. nd nicht unterbrochen werden kann und einen weiteren der alle ankommenden Nachrichten vom Benutzer annimmt Au erdem brauchen wir eine Art von Beh lter als Schnittstelle zwischen diesen beiden Prozessen Abbildung 3 7 demonstriert dieses Problem Eingabefeld gt Datenaustausch Container T r lt gt Hauptprozess Abbildung 3 7 Upstream Kommunikation Die Situation l sst sich mit einem Autorennen vergleichen Der Fahrer auf der Piste ist der Haupt Client und das Rennteam in der Box entspricht dem Benutzereingabefeld Der Fahrer ist an das Rennen gebunden in dem er sich befindet Er kann nicht einfach die Bahn verlassen und anhalten um nachzu sehen was los ist Wenn ihn das Rennteam per Flagge zum Halt in der Box auffordert kommunizieren sie mit ihm indem sie ihm ein Signal geben nach der n chsten Runde die Fahrt zu unterbrechen Die Kommunikation besteht hier wenn man den Funk einmal beiseite l sst aus dem Signal das gegeben wird sobald ein Fahrer die Ziellinie berquert Dieses Signal funktioniert als Schnittstelle zum Fahrer Im Prinzip ist dies genau das was wir auch tun m ssen um unserem Hauptprozess ein Signal geben Da der Hauptprozess ereignisbasiert ist haben wir h ufig die M g lichkeit die Kontrolle ber das Programm zu bernehmen und die gew nschte Aktion durchzuf hren Wir k nnen somit eine Verarbeitungsrou tine installieren die h ufig nach einem Signal von au en Au
460. nden Skript verwendet wird 0 gibt an dass der Ausgabewert nicht verwendet wird 1 gibt an dass der Anrufer einen R ckgabewert erwartet Sie k nnen diesen Flag auswerten um zu berpr fen ob die Funktion korrekt verwendet wurde oder um die Geschwindigkeit zu op timieren wenn die R ckgabe eines Wertes aufwendige Opera tionen erfordern w rden als Beispiel sehen Sie sich an wie array c ihn verwendet executor_globals Diese Variable zeigt auf die globale Einstellung der Zend En gine Sie ist beispielsweise zur Erzeugung neuer Variablen n tzlich mehr dazu sp ter Die globalen Variablen des Execu tors k nnen ber das Makro ELS_FETCH in Ihre Funktionen integriert werden Tab 9 1 Zend Parameter f r Funktionen die mit PHP aufgerufen werden 385 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern 9 10 4 Deklarationen des Zend Funktionsblocks Nachdem Sie die zu exportierenden Funktionen deklariert haben m ssen Sie sie auch f r Zend einf hren Die Einf hrung der Funktionsliste geschieht ber einen Array von zend_function_entry Dieser Array enth lt alle Funktio nen die bereitgestellt werden sollen wobei der Funktionsname so angegeben ist wie er in PHP erscheinen soll und der Name wie er in der C Quelle defi niert ist Intern wird zend_function_entry wiein Listing 9 5 gezeigt definiert typedef struct _zend_function_entry char fname void handle
461. ndere dann n tzlich wenn Sie eine neue Variable erzeugen m chten indem Sie auf einen String referenzieren der bereits im internen Speicher von Zend zugewiesen wurde Wenn Sie den String an einer bestimmten Stelle kappen m chten oder seine L nge bereits im voraus kennen k nnen Sie ZVAL_STRINGL zval string length duplicate verwenden Dieses Makro l sst die Angabe einer exakten L nge f r den neuen String zu und ist schneller als ZVAL_STRING und au erdem bin rsicher Zum Generieren eines leeren Strings setzen Sie die Stringl nge auf 0 und ver wenden Sie als Inhalt empty_string new_string gt type IS_STRING new_string gt value str len 0 new_string gt value str val empty_string Nat rlich gibt es auch hierf r ein Makro ZVAL_EMPTY_STRING MAKE_STD_ZVAL new_string ZVAL_EMPTY_STRING new_string 9 12 5 Boolesche Werte Boolesche Werte werden genauso erzeugt wie Longs haben aber den Typ IS_BOOL Zul ssige Werte f r Ival sind 0 und 1 zval new_boo MAKE_STD_ZVAL new _boo1 new _bool gt type IS BOOL new_bool gt value lval 1 Die entsprechende Makros f r diesen Typ hei en ZVAL_BOOL das eine Wertan gabe erm glicht sowie ZVAL_TRUE und ZVAL_FALSE welche den Wert explizit auf TRUE bzw FALSE setzen 9 12 6 Arrays Arrays werden in den internen Hash Tabellen von Zend gespeichert auf die Sie ber die API zend_hash_ zugreifen k nnen F r jedes Array das Sie erzeugen m chten be
462. nen 25 Teil 1 PHP f r Fortgeschrittene 1 Entwicklungskonzepte 29 1 1 Ist PHP etwas fiir mich 29 1 2 Die Bedeutung der Planung 30 1 3 Kodierungskonventionen 33 1 3 1 Ausw hlen von Namen 33 1 3 2 Lesbarmachen Ihres Codes 35 1 3 3 Hinzuf gen von Kommentaren 40 1 3 4 Ausw hlen von sprechenden Namen 47 1 3 5 _ Generieren von klaren und konsistenten Schnittstellen 50 1 3 6 Unterteilung des Programms in logische Gruppen 51 1 3 7 Abtrennen separater Programmteile 52 1 4 Verwenden von Dateien zur Gruppierung von Funktionen 53 1 5 Schreiben einer Dokumentation 54 1 6 Entwicklung einer Anwendungsprogrammschnittstelle 55 1 7 Zusammenfassung 61 2 Erweiterte Syntax 63 2 1 PHP Syntax 63 2 2 Definition von Konstanten 64 2 3 Array Funktionen 66 24 PHP und objektorientierte Programmierung 74 2 4 1 Klassen PHP 3 0 versus PHP 4 0 80 2 4 2 Implementierung von Klassen 8 243 Zugriff auf Objekte 82 Pearson Education 2 5 2 6 2 7 2 8 Inhaltsverzeichnis 24 4 Konstruktoren 24 5 Vererbung 2 4 6 Spezielle Funktionen f r objektorientierte Programmierung Verkn pfte Listen 2 5 1 Verkn pfte Listen und Baumstrukturen ein Arbeitsansatz Assoziative Arrays 2 6 1 Mehrdimensionale Arrays 2 6 2 Variable Argumente Polymorphisierung und selbstmodifizierender Code 2 7 1 Dynamischer Funktionsgenerator 2 7 2 Selbstmodifizierender Z hler Zusammenfassung 3 Programmentwicklung ein Praxisbeispiel 3 1 3 2 3 3 3 4 3 5 3 6
463. nen kleinen Trick k nnen Sie sich zumindest die rgerliche manuelle Codierung der Sitzungskennnummer ersparen Wie w re es wenn die URL folgenderma en auss he http server com lt session id gt page php3 Hier betrachtet der Browser die Sitzungskennnummer als Teil des Verzeich nisses und w rde sie bei jeder Anfrage verschicken Wenn Sie dieses Format unver ndert verwenden w rden Sie allerdings nur den Fehler File not found erhalten da es kein Verzeichnis gibt das wie die Sitzungskennnum mer aussieht Wir brauchen eine Methode die Sitzungskennnummer aus dem Pfad zu entfernen bevor der Webserver die URL tats chlich sieht Hier kommt mod_rewrite ins Spiel mod_rewrite ist ein Apache Modul das komplexe Umwandlungen von regul ren Ausdr cken in eine URL durch f hrt bevor es diese an den Apache Server weiterleitet Mit mod_rewrite k n nen wir die Sitzungskennnummer einfach aus der URL streichen Dies ist eine interne nderung der URL die nur Apache sehen wird nicht aber der Client Apache sieht eine normale Anfrage ohne Sitzungskennnummer die aber noch in den blichen Variablen f r PHP verf gbar ist Einlesen von mod_rewrite Das Modul mod_rewrite wird nicht standardm ig in Apache kompiliert Informieren Sie sich in der INSTALL Datei von Apache ber die Anweisun gen mit denen Sie Apache mit diesem Modul kompilieren k nnen Ein URL wie der folgende http www server com b6ac8ca8e453cdc43e6078abF044cdb5 sc
464. nformation Es gibt ein Schl sselkonzept das Sie verstehen m ssen wenn Sie ber XML reden strukturierte Dokumente oder eleganter ausgedr ckt strukturierte Informationsauszeichnung Die strukturierte Auszeichnung definiert explizit den Aufbau und den semantischen Inhalt die kontextuelle Bedeutung eines Dokuments Sie hat keinen Einfluss auf die Art und Weise in der das Doku ment f r den Leser erscheint Die Interpretation der Daten syntaktische Ana lyse Layout usw bleibt der verarbeitenden Anwendung berlassen Neh men wir z B das HTML Tag lt p gt paragraph Absatz Es kennzeichnet mehrere S tze die zusammengeh ren und eine logische Einheit bilden Das Tag an sich sagt nichts dar ber aus wie der Ansatz im Browser wiedergege ben wird Der Browser k nnte davor oder danach eine Leerzeile einf gen die erste Zeile einziehen oder einen Zierrahmen um den Absatz ziehen Hier geht 302 Pearson A ADDISON WESLEY Education PHP und XML es um logische Auszeichnung Die Stilinformation wird direkt im Browser eingegeben XML Dokumente setzen sich aus solchen logischen Auszeich nungen zusammen Wie bei HTML werden Tags verwendet um die Aus zeichnungsinformationen zu kennzeichnen Bei XML gibt es jedoch keine visuellen Elemente wie bei HTML denken Sie an lt font gt Es ist auf logische Auszeichnung beschr nkt Es gibt keine M glichkeit in XML z B ein Wort kursiv zu setzen Sie k nnen es lediglich gem seine
465. ng Discount Usability Engineering 213 4 3 3 Tauglichkeit Tun Sie es einfach 217 44 Zusammenfassung 217 4 5 Literaturhinweise 218 5 Grundlegende Webanwendungsstrategien 219 5 1 Die PHP Normal Form 220 5 1 1 Verwendung von HTML Schablonen 227 5 2 Projektstruktur 229 5 2 1 Zusammenarbeit im Team 229 5 2 2 Verzeichnisstruktur 230 5 3 Versionsverwaltung mit CVS 233 5 3 1 CVS Optimierung Grafische Benutzeroberflachen und CVSweb 238 5 3 2 Erweitertes CVS 240 Pearson Education Inhaltsverzeichnis 5 4 Dreistufige Anwendungen 5 4 1 5 4 2 5 4 3 5 4 4 Herk mmliches Client Server Modell PHP und mehrstufige Anwendungen PHP und COM PHP und Java 5 5 Zusammenfassung 6 Datenbankzugriff mit PHP PHPLib Die PHP Basisbibliothek 6 1 6 2 6 3 6 4 6 1 1 Entstehung 6 1 2 Vorteile und Nachteile 6 1 3 Wichtige Dateien 6 1 4 Anpassung von PHPLib Datenbankabstrahierung 6 2 1 Portierbarkeit 6 2 2 Fehlersuchmodus 6 2 3 Fehlerbehandlung 6 2 4 DB_Sql Beispiel 6 2 5 Sessions 6 2 6 Automatischer R ckfallmodus 6 2 7 Seiten Caching 6 2 8 Serialisierung 6 2 9 Session Beispiel 6 2 10 Abk rzungen I page_open 6 2 11 Abk rzungen II purl url und pself Authentisierung 6 3 1 Vorteile der PHP Genehmigung 6 3 2 Auth Beispiel 6 3 3 Auth Interna 6 3 4 Verwaltung von Berechtigungsebenen 6 3 5 Bitweise Berechnungen Zusammenfassung A ADDISON WESLEY 249 249 250 251 255 256 257 257 258 258
466. ng wird von den beiden Klassenfunktionen verwaltet die Sie definieren m ssen auth_loginform und auth_validatelogin Wenn ein Benutzer eine gesch tzte Seite anfordert aber noch nicht angemel det ist ruft die Klasse Auth die Funktion auth_loginform auf Diese Funktion sollte einen Anmeldebildschirm erzeugen Da sie auch aufgerufen wird wenn die Authentisierung fehlschl gt sollte sie auch ber Mechanismen ver f gen um auf fehlgeschlagene Versuche reagieren zu k nnen In unserem Beispiel wird eine entsprechende Fehlermeldung angezeigt und im Benut zerfeld des Formulars wird der bertragene Wert eingetragen Die zweite Funktion auth_validatelogin bildet den Kern der Klasse Sie f hrt die Authentisierung durch Diese Funktion wird aufgerufen nachdem der Benutzer die Authentisierungsdaten aus dem Formular bertragen hat die von der Funktion auth_loginform bereitgestellt wurden Die Variablen des Formulars werden hier als globale Variablen verwendet und sollten daher in der Funktion als solche definiert sein damit auf sie zugegriffen werden kann Wie Sie die Authentisierung durchf hren bleibt Ihnen berlassen Im Beispiel f hren wir einen Abgleich mit der Standard auth_user Tabelle aus der PHPLib Distribution durch Statt dessen k nnten Sie auch htaccess Stilda teien einen LDAP Server o verwenden Wenn die Authentisierung erfolgreich ist muss die Funktion eine g ltige Benutzerkennnummer zur ckgeben und das Arr
467. ng 7 2 Einheiten Beziehungsdiagramm ERD fiir die Wissensdatenbank Nachdem Sie die grundlegenden Datenstrukturen der Anwendung kennen stellt sich als Nachstes die Frage was mit ihnen passiert Der Anforderungs katalog nennt eine Reihe von Aktionen welche die Anwendung zulassen soll Es ist nun unsere Aufgabe diese Aufgaben sauber zu trennen 292 Pearson A ADDISON WESLEY Education Wissensrepr sentation In der Regel werden die Aktionen unter den einzelnen Datenstrukturen zusammengefasst die zuvor definiert wurden Konzentrieren wir uns zun chst auf die Aktionen die sich mit Eintr gen in der Datenbank befassen Auslesen eines speziellen Eintrags F r diese Aktion muss der Bezeichner des auszulesenden Eintrags bekannt sein Die Aktion schl gt fehl wenn es in der Datenbank keinen Eintrag gibt der mit dem Bezeichner berein stimmt Sie kann auch fehlschlagen wenn Systemfehler auftreten z B wenn es keinen Zugriff auf das Datenbanksystem gibt Wenn die Aktion erfolgreich ist wird die Struktur f r den Eintrag zur ckgegeben Auslesen von Eintr gen in einer spezifischen Kategorie F r diese Aktio nen muss der Name der Kategorie bekannt sein f r welche Eintr ge aus gelesen werden sollen Wenn die Aktion erfolgreich ist wird eine Liste der g ltigen Eintr ge zur ckgegeben Eine Liste der Eintr ge Moment sol che Datenstrukturen hatten wir bisher noch nicht definiert Es wird Zeit zur Spezifikation zur ckzuke
468. ng bei Ihnen in Auftrag geben haben h ufig nicht die Sachkenntnis ein solches Programm selbst zu entwickeln Deshalb heuern sie Sie an Wenn Sie die Anforderungen mit Ihrem Kunden besprechen leiten Sie ihn ein wenig Wenn der Kunde beispielsweise sagt Ich m chte ein Chat Programm das ganzseitige Bilder jedes Chatters anzeigt und mindestens einmal pro Sekunde aufgefrischt wird k nnten Sie einen Gegenvorschlag machen W re es nicht besser neben jede Zeile Minia turansichten zu platzieren Die meisten ihrer Chatter werden nicht gen gend Bandbreite haben um ganzseitige Bilder anzuzeigen Seien Sie aber vorsichtig Bestehen Sie niemals auf Ihrem Standpunkt es sein denn Ihr Kunde m chte nicht realisierbare Funktionen haben Immerhin bezahlt der Kunde Sie damit Sie seine Vorstellung verwirklichen Um Ihren Vertrag nicht zu gef hrden m ssen Sie m glicherweise vor bergehend eine schlechte L sung akzeptieren wenn Sie feststellen dass Sie den Kunden nicht berzeugen k nnen den besseren Weg zu w hlen und diese sp ter ndern wenn der Kunde einsieht dass seine Strategie nicht funktioniert F r dieses Projekt bernehmen Sie die Rolle des Projektleiters und wir Autoren werden Ihre Kunden sein Da wir nette Kunden sind werden wir nicht darauf bestehen dass Sie die Details dieses Programms schriftlich fixieren Wir berlas sen es Ihnen den Rest zu entwerfen Wann immer in diesem Kapitel eine Wahl 130 Pearson A ADDISO
469. ng verwendet werden kann siehe Abbildung 9 4 Diese Makro gibt eine Standardfehlermeldung aus und kehrt anschlie end zum Anrufer zur ck Seine Definition finden Sie in zend API h sie sieht fol genderma en aus ZEND API void wrong _param_count void define WRONG PARAM COUNT wrong _param_count return 394 Pearson A ADDISON WESLEY Education Annahme von Argumenten XY Netscape olx File Edit View Go Communicator Help Warning Wrong parameter count for firstmodule in home wwwrhtdocs firstmod php on line 5 iE se ee SD ZAI Abbildung 9 4 WRONG_PARAMETER_COUNT in Aktion Wie Sie sehen wird in dieser Definition eine internen Funktion namens wrong_ param_count aufgerufen die f r die Ausgabe der Warnung zust ndig ist Auf Einzelheiten f r die Erstellung benutzerspezifischer Fehlermeldungen gehen wir sp ter im Abschnitt Ausdrucken von Informationen ein 9 11 2 Auslesen von Argumenten Nachdem Sie die Anzahl der Argumente berpr ft haben m ssen Sie auf diese Argumente zugreifen k nnen Hierf r steht Ihnen zend_get_parameters_ ex zur Verf gung zval parameter if zend_get_parameters_ex 1 amp parameter SUCCESS WRONG_PARAMETER_COUNT Alle Argumente werden im Container zval gespeichert auf den zweimal gezeigt werden muss Das obige Beispiel zeigt den Versuch ein Argument zu lesen und es ber den Zeiger parameter bereitzustellen zend_get_parameters_ex nimmt mindeste
470. nger n Mindestens ein Empf nger ist erforderlich Wenn Sie die Nachricht an mehrere Empf nger verschicken m chten f gen Sie wie im vorhergehenden Beispiel gezeigt einfach eine Adressliste hinzu php3 logfile subject to address to address int A script to log and mail CVS commit messages n int Tobias Ratschiller and Till Gerken Copyright c 2000 New Riders Publishing n n n n print From Web Application Development with PHP n n O Check for correct number of arguments if count argv lt 4 print Usage Commit_Info J n print n pri pri exit First argument is the logfi logfile argv 1 Second argument is the mail subject argv 2 Initialize the body variabl body lename s subject Get the commit message passed via stdin fp fopen php stdin r wstdin while feof fp body fgets fp 64 felose fp or die Fatal Error could not read from Mail the message to all specified recipients for i 2 i lt count argv i Log the message fp fopen logfile a or w logfile for writing fputs fp subject n fputs fp body n mail argv i subject 244 body die Fatal Error could not write logfile Pearson A ADDISON WESLEY Education Versionsverwaltung mit CVS TPULSCSTD Hessessessresce cee aan a SE n fclose fp
471. ngineering In der Praxis werden die empfohlenen Tauglichkeitspr fverfahren f r Soft wareentwicklungsprojekte nur selten verwendet Dies liegt zum gro en Teil an den Kosten die mit den traditionellen Tauglichkeitspr fverfahren verbun den sind In der angesehenen Zeitschrift Communications of the ACM sch tzten die Autoren Mantei und Teorey 1988 dass sich die Kosten die erforderlich sind um das Element menschlicher Faktor zur Softwareentwick lung hinzuzuf gen auf ber 120 000 Dollar belaufen ungeachtet der Gr e des Softwareentwicklungsprojektes Diese Sch tzung bezog sich haupts ch lich auf die Bewertung fester Kosten wie Testen und Auswertung Praxis tests Produktanalysen usw die sich nicht mit der Gr e des Projekts und des Programmcodes w hrend der Entwicklung ndern Diese Zahl berschreitet 213 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte den Betrag fiir das gesamte Budget f r Entwicklungsprojekte vieler Websites Es ist nicht berraschend dass ein Projektmanager beim Lesen solcher Sum men Tauglichkeitspr fverfahren ganz und gar ablehnt Jakob Nielsen s Ansatz einer einfachen Tauglichkeitspr fung ww useit com papers guerrilla_hci html zielt darauf ab Tauglichkeitspr fungen einfa cher billiger und weniger zeitaufwendig zu gestalten Als er 1989 seine Methode untersuchte fand er heraus dass es f r die meisten Projekte unn tig ist alle herk mmlichen Tauglich
472. ngswerkzeug ob der Entwickler eine M glichkeit vorgesehen hat die Funktionalit t des Pro gramms zu erweitern 152 Pearson A ADDISON WESLEY Education Schnittstelle zum Netzwerk Im Laufe der Zeit haben sich haupts chlich zwei Verfahren zur Programmer weiterung herausgebildet Entweder bietet das Programm die M glichkeit Skripte zu erstellen hnlich wie Makros oder das Programm kann Plugins verwenden Bei PHP bedeutet die Implementierung einer Skriptsprache in einem zeitkritischen Teil eines Systems wir brauchen das gar nicht zu Ende zu denken Dar ber hinaus w re die Entwicklung eines ausgereiften Parsers wirklich zu viel verlangt Plugins lassen sich dagegen sehr viel leichter instal lieren und bieten viele Vorteile Ein Plugin ist ein kleines Programmfragment das sich selbst beim Programm anmelden kann und bestimmte Ereignisse aus diesem abfangen auf interne Daten zugreifen kann usw Es f gt sich zwar nahtlos in das Hauptsystem ein bleibt aber trotzdem eine eigenst ndige Datei die abgetrennt und separat verteilt werden kann Es kann an das Sys tem angeh ngt werden ohne dass Sie daf r eine Programmzeile ndern m s sen Damit kann auch ein Systemadministrator der keine Kenntnisse in PHP besitzt das Programm mithilfe eines fremden Programmcodes erweitern Wie dies genau geht zeigt Abbildung 3 9 registriert sich im registriert sich im gt Hauptsystem gt erh lt Daten vom erh lt Daten vom
473. nisse berwacht Sie brauchen einen Projektleiter Die Projektverwaltung f r die Entwicklung eines Programms ist ein so umfassendes Gebiet dass wir es in diesem Buch leider nicht behandeln k n nen Es gibt viele gute Methoden und Mittel und wir k nnen Ihnen nur emp fehlen diese anzusehen wenn Sie auf diesem Gebiet noch keine Erfahrung haben Sie reichen von Werken wie The Mythical Man Month bis zu Metho den wie dem Personal Software Process Wir werden uns auf die einzelnen Stufen eines Projektes konzentrieren die eine technische Entwicklung durchl uft Sie haben bereits in Kapitel 3 Pro grammentwurf gesehen wie Sie eine Anwendungsprogrammierschnittstelle API konzipieren k nnen Genau genommen war dies bereits ein eigenes Miniprojekt Wir haben dabei im Stillen einige Annahmen gemacht Wie wird der Code in Verzeichnissen organisiert wer ist im Entwicklungsteam wie werden verschiedene Versionen der API gepflegt In realen gr eren Projekten m ssen Sie diese Entscheidungen selbst treffen Da diese die Grundlage f r Ihr Projekt bilden sollten Sie sich sorgf ltig vorbe reiten bevor Sie etwas beschlie en was sich sp ter m glicherweise als unpassend herausstellt 5 2 2 Verzeichnisstruktur Die grundlegendste und trotzdem h ufig vernachl ssigte technische Ent scheidung die Sie zu Beginn der Quellcodeentwicklung f r ein neues Projekt treffen m ssen betrifft die zu verwendende Verzeichnisstruktur In
474. nktion ist schneller und length int duplicate bin rsicher Ansonsten verh lt sie sich wie add_ index_string Tab 9 10 Zends API fiir indexierte Arrays Teil 2 Diese Funktionen bieten alle eine praktische Abstrahierung der internen Hash API von Zend Nat rlich k nnen Sie die Hash Funktionen auch direkt verwenden z B wenn Sie bereits einen zval Container zugewiesen haben den Sie in einen Array einf gen m chten Bei assoziativen Arrays geschieht dies ber zend_hash_update siehe Listing 9 12 und bei indizierten Arrays tiber zend_hash_index_update siehe Listing 9 13 zval new_array new_element char key element_key MAKE_STD_ZVAL new_array MAKE_STD_ZVAL new_element if array_init new_array FAILURE ZVAL_LONG new_element 10 do error handling here if zend_hash_update new_array gt value ht key strlen key 1 void amp new_element sizeof zval NULL FAILURE Listing 9 12 Hinzuf gen eines Elements in einen assoziativen Array do error handling here zval new_array new_element int key 2 MAKE_STD_ZVAL new_array MAKE_STD_ZVAL new_element 416 Pearson A ADDISON WESLEY Education Objekte if array_init new_array FAILURE ZVAL_LONG new_element 10 do error handling here if zend_hash_index_update new_array gt value ht key void amp new_element wsizeof zval NULL FAILURE Listing 9 13
475. noten 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 Pearson A ADDISON WESLEY Education 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 mit 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
476. ns zwei Argumente an Das erste Argument gibt die zu lesende Anzahl der Argumente an Dies sollte der Anzahl von Argumenten entsprechen mit welcher die Funktion aufgerufen wurde deswegen sollten Sie die korrekte Aufrufsyntax berpr fen Das zweite Argument und alle weiteren Argumente sind Zeiger auf Zeiger auf Zeiger auf zvals Verwirrend nicht wahr Diese Zeiger sind alle erforder lich da Zend intern mit zval arbeitet Um einen lokalen zval in unserer Funktion auszurichten ben tigt zend_get_parameters_ex einen Zeiger darauf 395 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Als R ckgabewert von zend_get_parameters_ex wird entweder SUCCESS oder FAILURE ausgegeben die eine erfolgreiche bzw fehlgeschlagene Argumen tenverarbeitung angeben Ein Fehlschlagen geht wahrscheinlich auf eine fal sche Angabe der Argumentenanzahl zur ck In diesem Falle sollten Sie die Funktion mit WRONG_PARAMETER_COUNT beenden Um mehr als ein Argument zu lesen k nnen sie ein hnliche Konstruktion verwenden zval paraml param2 param3 param4 p p p p if zend_get_parameters_ex 4 amp paraml amp param2 amp param3 amp param4 gt SUCCESS WRONG PARAMETER COUNT zend_get_parameters_ex berpr ft nur ob Sie versuchen zu viele Parameter auszulesen Wenn die Funktion mit f nf Argumenten aufgerufen wird Sie aber nur drei von ihnen mit zend_get_parameters_ex
477. nset 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 list 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_array 0 1 my_array 1 777 my_array 2 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 Eingabedaten 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
478. nt 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_array i lt br gt 69 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax Damit erhalten Sie die in Abbildung 2 3 gezeigte Ausgabe w Netscape Of x File Edit View Go Communicator Help Element 0 Landon Element 1 Element 2 Element 3 Graeme Abbildung 2 3 Ung ltiger Zugriff auf ein nicht zusammenh ngendes Array Fehlerberichterstattung Wenn Sie PHP so eingerichtet haben dass es ung ltige Array Indizes anzeigt werden auch ein paar Warnungen ausgegeben Es empfiehlt sich w hrend 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 tunlichst nicht verwenden each ist auch
479. nummer ber Cookies verbreiten ist die Standardlebensdauer eines Cookies 0 d h er wird gel scht sobald der Benut zer den Browser schlie t Sie k nnen die Lebensdauer mithilfe des Konfigura tionswertes lifetime ver ndern Da der Server nicht wei ob der Cookie auf der Client Seite noch existiert hat PHP eine weitere Lebenszeitvariable die festlegt wie lange die Daten nach dem letzten Zugriff auf diese Sitzung zer st rt werden sollen gc_max ifetime Wollte man jedoch so ein Cleanup alter Sit zungen auch Speicherbereinigung genannt bei jeder Seitenanfrage durchf h ren w rde dies zu einem erheblichen Overhead f hren Deshalb haben Sie die M glichkeit anzugeben mit welcher Wahrscheinlichkeit die Speicherbereini gungsroutine aufgerufen werden soll Wenn gc_probability den Wert 100 hat wird das Cleanup bei jeder Anfrage durchgef hrt d h mit einer Wahrschein lichkeit von 100 Wenn dieser wie standardm ig eingestellt 1 ist werden alte Sitzungen mit einer Wahrscheinlichkeit von 1 pro Anfrage gel scht Wenn Sie keine Cookies verwenden sondern statt dessen die Sitzungskenn nummer per GET oder POST bergeben m ssen Sie auf die Speicherbereini gungsroutine besonders achten M glicherweise setzen Benutzer Lesezeichen f r die URLs welche die Sitzungskennnummer enthalten Stellen Sie sicher dass Sitzungen h ufig bereinigt werden Wenn die Sitzungsdaten noch exis tieren wenn der Benutzer die Seite mit der Sitzungsk
480. nung und m chten gerne wissen was richtig war was wir besser machen k nnen und an welchen anderen Bereichen Sie interessiert sind Wenn Sie m chten geben Sie uns auch andere weise Ratschl ge Als leitender Herausgeber bei New Riders Publishing begr e ich Ihre Kom mentare Sie k nnen mir faxen eine Email schicken oder direkt schreiben um mir mitzuteilen was Ihnen an diesem Buch gefallen hat und was nicht und um mir zu sagen was wir tun k nnen damit unsere B cher noch besser werden Bitte beachten Sie dass ich Ihnen bei technischen Problemen die mit dem Thema dieses Buches zusammenh ngen nicht weiterhelfen kann Aufgrund der Masse der Emails die ich erhalte kann ich m glicherweise auch nicht jede Nachricht beantworten Wenn Sie mir schreiben denken Sie daran den Titel und den Autor dieses Buches sowie Ihren Namen und Ihre Telefonnummer bzw Fax Nummer anzugeben Ich werde Ihre Anmerkungen gr ndlich berpr fen und sie mit dem Autor und Herausgebern er rtern Fax 317 581 4663 Email nrfeedback newriders com Post Al Valvano Executive Editor New Riders Publishing 201 West 103rd Street Indianapolis IN 46290 USA Pearson vy ADDISON WESLEY Education Vorwort von Zeev Suraski Als ich vor drei Jahren das erste Mal mit PHP konfrontiert wurde hatte ich keine Ahnung dass ich eines Tages ein Vorwort f r ein PHP Buch schreiben w rde Tats chlich schien mir damals die Vorstellung dass es jemals ein Buc
481. nzinformation Coe No ooy pi jR Verweise auf nderungsprotokoll Home Page Distributionsdatei usw 10 Schlie lich Ausz ge aus dem nderungsprotokoll wenn erforderlich Wenn dies nach zu viel Informationen aussieht bedenken Sie dass Sie besser redundante Informationen haben als wenn Informationen fehlen Nat rlich sind nicht alle Felder in allen Situationen geeignet auch in den vorhergehen den Beispielen haben wir nicht alle Felder aufgenommen Trotzdem sollten Sie so viel Informationen wie m glich in den Kopf packen Das Schlimmste was passieren kann ist dass einige Leute sie nicht lesen Andere sind viel leicht dankbar daf r Vielleicht sogar Sie denn das Weglassen von Urheber rechts und Lizenzinformationen in einem kommerziellen Produkt kann sp ter einige Kopfschmerzen bereiten wenn andere Programmierer Ihren Code zur freien Verwendung weiterverwenden Modul Header Kommentare Wenn Ihre Datei mehr als ein Modul hat z B wenn ein Modul nur aus drei Funktionen besteht welche die Funktionalit t aus einer gr eren Prozedur eines bergeordneten Moduls extrahieren sollten Sie vor der ersten Funk tion einen Informationsblock einf gen Ein Modul Header sollte in etwa so aussehen wie in Listing 1 5 FITTILLLLLLTTT TTL TTT TTT T TTT TATA TT TATA ATT ATTA AAT TTT ATT Submodule for file access from main FITTILTLLTLTTTTT LTT TTT ATTA TAT TT TAT ATT AAT TAA ATT This submodule will provide function
482. o Braille alles aus einer einzigen Quelle Da Sie XML Klartextdokumente mit Ihrer bevorzugten Skriptsprache analysieren k n nen wird es Ihnen nicht schwer fallen Hyperlinks dynamisch zu ndern den Inhalt von Elementen zu ndern oder Strukturen einer Datenbank zuzuord nen Wenn Sie immer noch nicht berzeugt sind schauen Sie sich einmal die Docu ment Type Definitions an die entwickelt werden oder bereits in Gebrauch sind XML ist eher die Technik im Hintergrund die W rze gibt die Anwen dung welche XML verwendet Wof r wird XML verwendet Als Auszeichnungssprache f r strukturierte Informationen wird XML nat r lich in Content Management Systemen Archivierungsprogrammen und Fir men Dokumentarchiven eingesetzt Es gibt jedoch eine Vielzahl andere XML Anwendungen und Unterprotokolle Aufgrund der Offenheit dieses Stan dards entstanden in kurzer Zeit viele DTDs 7 2 2 DocBook Die beliebte DocBookX DTD besteht aus einer Reihe von Tags zur Beschrei bung von B chern Atikeln und anderen Prosadokumenten insbesondere technischen Dokumentationen Sie wurde urspr nglich 1991 vom Verlag O Reilly als SGML DTD f r den eigenen Gebrauch entwickelt und errang schnell Beliebtheit bei Autoren so dass sie bald auch in anderen Verlagsh u sern eingesetzt wurde O Reilly unterst tzte dies indem sie die DTD zur wei teren Entwicklung an die Davenport Gruppe bergab Mitte 1998 bernahm OASIS Organization for the Advance of Stru
483. o anders auf Ihrer Website Werkzeuge zur Registrie rung eines Benutzers Bearbeitung von Registrierungen und Verschicken von vergessenen Passw rtern einrichten Da diese Aufgabe Ihnen berlassen bleibt haben wir auch keine M glichkeit den vollst ndigen Namen eines Benutzers zu ermitteln Alles was wir haben ist die eindeutige Benutzer kennnummer und den Benutzernamen Es gibt daher eine Funktion namens real_user_name welche als Parameter die Benutzerkennnummer akzeptiert und den vollst ndigen Namen dieses Benutzers zur ckgibt Standardm ig gibt diese Funktion nur die Benutzerkennnummer zur ck Sie sollten diese Funktion erweitern um in Ihrer Datenbank den vollst ndigen Namen des Benutzers zu suchen und zur ckzugeben 7 1 6 Das fertige Produkt Die Funktion real_user_name wird zusammen mit allen anderen API Funkti onen in einer zentralen Datei namens 1ib inc php3 gespeichert Da es f r alle Funktionen im Programmcode eine einfache Dokumentation zur Syntax gibt l sst sich sehr leicht eine API bersicht automatisch erstellen Hierzu ben ti gen wir nur den Befehl grep grep Tib inc php Die bersicht ist jedoch kein Ersatz f r eine vollst ndige technische Doku mentation und sollte nur als Kurzreferenz dienen Nachdem die API definiert ist beschr nkt sich die restliche Anwendung haupts chlich darauf die API Funktionen aufzurufen und die Ergebnisse auszudrucken 301 Pearson vy ADDISON WESLEY
484. obald Sie gr ere Abschnitte von Programmcode in Ihr XML Dokument einf gen m chten die viele lt und amp enthalten werden Sie die Standardmethode einzelne Zeichen per Entit t zu referenzieren als sehr l stig empfinden HTML bietet hierf r das Tag lt pre gt mit welchen die Auszeichnungsinterpretation f r einen Abschnitt ausgeschaltet wird Da XML solche integrierten Tags fehlen k n nen wir dies nicht machen Um diesen Mangel zu beseitigen k nnen Sie Abschnitte in XML wie folgt als CDATA markieren 311 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie lt CDATA print lt a href script php3 foo bar amp baz foobar 11 gt Innerhalb eines CDATA Abschnitts k nnen alle Zeichen mit Ausnahme der Sequenz gt vorkommen Prolog des Dokuments XML Dokumente sollten m ssen aber nicht mit einer XML Deklaration beginnen die angibt welche XML Version verwendet wird Diese Versions information ist Teil des Dokumentenprologs lt xml version 1 0 gt lt greeting gt Hello world lt greeting gt Dadurch dass diese Information zu Beginn des Dokuments angegeben ist kann ein Prozessor entscheiden ob er die XML Version des Dokuments bear beiten kann Es eignet sich auch als Methode um den Dokumententyp zu identifizieren So wie bin sh im Dateikopf angibt dass es sich um ein Shell skript handelt identifiziert die XML Deklaration ein XML Dokument Den zweiten wichtigen
485. oder nicht analysierte Entit t ProcessingInstruction Der Knoten ProcessingInstruction reprasentiert einen Verarbeitungsbefehl in einem Dokument Er besitzt zwei Attribute namlich target das Ziel des Ver arbeitungsbefehls und data den Inhalt Comment Die Schnittstelle CharacterData repr sentiert den Inhalt eines Kommentars d h alle Zeichen zwischen lt und gt Er verf gt ber keine weiteren Attri bute oder Methoden Text Die Schnittstelle Text CharacterData repr sentiert die Zeichendaten textlichen Inhalt eines Element oder Attr Knotens Die Schnittstelle Text hat keine Attri bute aber eine Methode namens splitText Sie teilt einen Text Knoten in zwei H lften was sich beispielsweise bei der Neuanordnung des Inhalts als n tzlich erweisen kann CDATASection Die Schnittstelle CDATASection erbt die Schnittstelle Text und damit die Schnittstelle CharacterData und enth lt den CDATA Abschnitt Notation Dieser Knoten stellt eine in der Dokumententypdeklaration deklarierte Nota tion dar 330 Pearson A ADDISON WESLEY PHP und XML Education Basisschnittstellen Alle oben genannten Objekte erben die Schnittstelle Node die den prim ren Basistyp des DOM darstellt Er stellt einen einzelnen Knoten in der Dokumen tenverzeichnisstruktur dar Die Schnittstelle Node definiert die Attribute und Methoden die Sie am h ufigsten verwenden wenn Sie mit dem DOM arbei ten Um beispielsweise ein Dokum
486. odukte 8 3 3 Warum PHP 8 3 4 Vorteile von PHP f r die Produktentwicklung von MarketPlayer com 8 3 5 Bew hrung im Alltag 8 3 6 Sitzungsverwaltung 8 3 7 PHP Serverintegration 8 3 8 Codeverwaltung 8 3 9 Die Zukunft Zusammenfassung Referenzen Teil 3 ber die Grenzen von PHP hinaus 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern 10 9 1 9 2 9 3 9 4 9 5 9 6 berblick Was ist Zend und was ist PHP Erweiterungsm glichkeiten 9 3 1 Externe Module 9 3 2 Eingebaute Module 9 33 Die Zend Engine Struktur der Quellen 9 4 1 Erweiterungskonventionen 94 2 Makros 9 4 3 Speicherverwaltung 9 4 4 Verzeichnis und Dateifunktionen 9 4 5 Handhabung von Strings 9 4 6 Komplexe Typen PHPs automatisches Erstellungssystem Erweiterungen erzeugen A ADDISON WESLEY 354 356 357 358 359 359 359 360 360 361 362 363 363 364 364 364 367 367 368 369 369 370 370 371 373 373 373 374 375 375 375 378 Pearson A ADDISON WESLEY Education Inhaltsverzeichnis 9 7 Kompilierung von Modulen 379 9 7 1 Kompilierung mithilfe von Make 380 9 7 2 Manuelles Kompilieren 381 9 8 Erweiterungen verwenden 382 9 9 Fehlersuche 383 9 10 Einblick in die Quellen 383 9 10 1 Modulstruktur 384 9 10 2 Einbindung der Headerdatei 384 9 10 3 Deklaration exportierter Funktionen 384 9 104 Deklarationen des Zend Funktionsblocks 386 9 10 5 Deklaration des Zend Modulblocks 388 9 10 6 Einbettung von get_module 392 9 10
487. odule_shutdown_func SHUTDOWN_FUNC_ARGS int request_startup_func INIT_FUNC_ARGS int request_shutdown_func SHUTDOWN FUNC ARGS void info_func ZEND_MODULE_INFO_FUNC_ARGS int t global_startup_func void global_shutdown_func void in in Rest of the structure is not interesting here Listing 9 6 Interne Deklaration von zend_module_entry Die folgende Tabelle beschreibt die Eintrage Eintrag Beschreibung name Enthalt den Namen des Moduls z B File functions Socket functions Crypt usw Dieser Name erscheint in phpinfo im Abschnitt Ad ditional Modules functions Zeigt auf den Zend Funktionsblock der im vorherigen Abschnitt besprochen wurde 388 Pearson vy ADDISON WESLEY Education Einblick in die Quellen Eintrag Beschreibung module _startup_func Diese Funktion wird bei der Initialisierung des Moduls einmal aufgerufen und kann f r einmalige Initialisie rungsschritte verwendet werden z B die anf ngliche Speicherzuweisung usw Bei einem Fehler w hrend der Initialisierung soll die Funktion FAILURE zur ckge geben werden ansonsten SUCCESS Um dieses Feld als nicht benutzt zu markieren verwenden Sie NULL Zur Deklaration einer Funktion verwenden Sie das Makro ZEND_MINIT module _shutdown_func Diese Funktion wird bei der Modul Deinitialisierung einmal aufgerufen und kann f r einmalige Deinitiali sierungschritte ve
488. omment lt comment gt lt data gt lt struct gt lt var name i1 gt lt string gt Foo lt strin lt var gt lt var name i2 gt lt string gt Foo lt strin lt var gt lt var name i3 gt lt string gt Foo lt strin lt var gt lt struct gt lt data gt lt wddxPacket gt g gt g gt g gt 7 4 Zusammenfassung Dieses Kapitel hat Ihnen alles Notwendige tiber die fiihrenden Webanwen dungen vermittelt Wir haben Ihnen gezeigt wie Sie Wissensdatenbanken konzipieren generieren und einrichten Daten darin richtig speichern und sie effizient auslesen Wir haben bliche Datenformate und offene Standards f r den Datenaustausch Prozedurfernaufrufe und plattformunabh ngige Daten speicherung vorgestellt Nachdem Sie die hier gezeigten Verfahren gelesen und verstanden haben sind Sie in der Lage die Schl sselfunktionen der heu tigen Spitzenanwendungen zu nutzen 347 Pearson A ADDISON WESLEY Education Pearson A ADDISON WESLEY Education Fallstudien Andere zu kennen zeugt von Intelligenz Sich selbst zu kennen von wirklicher Weisheit Die folgenden Abschnitte zeigen drei Fallstudien in denen PHP auf gro en Websites und in kommerziellen Produkten eingesetzt wird Diese Fallstudien beschreiben Firmen die sich nach sorgf ltiger Auswertung der konkurrieren den Technologien f r PHP entschieden haben und die in einem gro en Teil ihrer t glichen Arbeit
489. on XML Prozessor 310 XMLStats 325 Z Zeichenketten berpr fung 223 Zend 368 API 385 404 Modulblock 388 Parameter 385 Verzeichnis 372 Zend Engine 256 370 zend h Datei 372 373 444 A ADDISON WESLEY Stichwortverzeichnis zend_API h Datei 372 373 zend_function_entry Arraydeklaration 386 zend_module_entry Arraydeklaration 388 Zombieknoten 92 Zugriffsrechte des Benutzers 206 zustandsloses Protokoll 166 zval Container 395 404 zval Separation Zend Engine 404 zvalue_value Struktur 402 403
490. on Elementen unterhalb dieses Elements Elemente sind korrekt verschachtelt Attribute tauchen nur einmal pro Element auf und sind in einfache oder doppelte Anf hrungszeichen eingeschlossen Sie enthalten keine direkten oder indirekten Entit tenverweise auf externe Entit ten Sie enthalten auch kein ffnendes Tag lt Mit Ausnahme der Standardentit ten m ssen alle Entit ten vor ihrer ers ten Verwendung deklariert werden Entitit ten verweisen nicht rekursiv auf sich selbst Hier ein Beispiel f r ein wohlgeformtes XML Dokument lt greeting gt Hello world lt greeting gt 316 Pearson A ADDISON WESLEY Education PHP und XML Es ist jedoch kein g ltige Dokument In der XML Spezifikation ist dies folgen derma en definiert Ein XML Dokument ist g ltig wenn ihm eine Dokumen tentyp Deklaration zugeordnet ist und wenn das Dokument den Randbedin gungen entspricht die darin genannt sind Dies bedeutet das jedes g ltige XML Dokument auch wohlgeformt ist Ein wohlgeformtes Dokument kann ung ltig sein wenn es nicht der Syntax entspricht die in der zugeh rigen DTD definiert wurde Ein nicht wohlgeformtes Dokument kann niemals g l tig sein Ein nicht wohlgeformtes Dokument ist kein XML Dokument Es ent h lt schwerwiegende Fehler und XML Parser werden an dieser Stelle ange wiesen die Verarbeitung abzubrechen Die Unterscheidung zwischen g ltig und wohlgeformt hat f r XML zwei wichtige Bedeutungen Zun chst f h
491. on Variablen zval parameter retrieve parameter zend_get_parameters_ex 1 amp parameter at this stage lt parameter gt still is connected to Zend s internal data buffers make lt parameter gt write safe SEPARATE_ZVAL parameter now we can safely modify lt parameter gt without implying global changes SEPARATE_ZVAL verwendet emalloc zur Zuweisung des neuen zval Containers dies bedeutet dass er automatisch gel scht wird wenn das Skript beendet wird selbst wenn Sie die Zuweisung des Speichers nicht selbst aufheben Wenn Sie dieses Makro jedoch h ufig aufrufen ohne die entfernten Container wieder freizugeben f llen Sie langsam Ihr RAM Hinweis Da Sie den Mangel an Schreibsicherheit bei der traditionellen API umgehen k nnen mit zend_get_parameters usw scheint diese API veraltet zu sein Deshalb werden in diesem Kapitel nicht mehr darauf ein gehen 9 12 Erzeugen von Variablen Wenn Sie Daten von Ihren eigenen Erweiterungen mit PHP Skripten austau schen betrifft eine der wichtigsten Fragen die Erzeugung von Variablen Die ser Abschnitt beschreibt die von PHP unterst tzten Variablentypen 9 12 1 berblick Um neue Variablen zu generieren die vom ausf hrenden Skript von au en gesehen werden k nnen m ssen Sie einen neuen zval Container zuordnen diesen Container mit sinnvollen Daten f llen und ihn anschlie end in die interne Symboltabelle von Zen
492. onieren Daneben gibt es m glicherweise noch andere Methoden z B alle Ihre Seiten in einen einzigen Frame einzubetten und in den eingebetteten Sei ten JavaScript zu verwerden um auf die Sitzungskennnummer des Hauptfra mes zuzugreifen Aber da Sie auf JavaScript und speziellen Layouteinstellun gen basieren oder anderen Beschr nken unterliegen sind sie in der Regel nicht f r professionelle Webanwendungen geeignet F r die Praxis empfehlen wir eine Kombination von Cookies und entweder dynamischen Pfaden oder DNS L sungen zu verwenden Sofern machbar erspart die Programmierung der Sitzungskennnummer in den Hostnamen dem Entwickler Arbeit In unserer Sitzung wurde die Sitzungskennnummer des Benutzers entweder in die URL oder den Hostnamen einprogrammiert Bei PHP 4 0 ist die auto matischen nderung der URL auch eine Alternative sofern auf der Website der Datenverkehr nicht allzu gro ist Dies funktioniert mit allen Browsern sowohl mit als auch ohne Cookies Sorgen Sie daf r dass Sie m glichst viele Benutzer erreichen Wenn der Benutzer seine Cookies aktiviert hat wird die ID auch als Cookies gespeichert Beim n chsten Besuch des Benutzers wird er automatisch ber den Cookie identifiziert und Sie k nnen ihn mit einer per 174 Pearson A ADDISON WESLEY Education HTTP und Sitzungen s nlichen Indexseite begr en wie Amazon com es tut Wenn der Browser keine Unterst tzung f r Cookies bietet muss der Benutzer sich mit
493. opping_cart var item list function pick item quantity 81 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax this gt item_list item quantity function drop item quantity if this gt item_list item gt quantity this gt item_list item quantity else this gt item_list item 0 Dieser Code definiert die Klasse shopping_cart mit den Mitgliedern item_ list pick 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 D
494. ot 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 PLOT MAX PLOT STEP height DIAGRAM HEIGHT image imagecreate width height allocate colors color_backgr imagecolorallocate image 255 255 255 color_grid imagecolorallocate image 0 0 0 color_plot imagecolorallocate image 255 0 0 clear image imagefilledrectangle image 0 0 width 1 height 1 color_ wbackgr draw axes imageline image 0 0 0 height 1 color_grid imageline image 0 DIAGRAM HORIZON width 1 DIAGRAM HORIZON w color_grid print some text imagestring image 3 10 DIAGRAM HORIZON 10 PLOT MIN color_ w grid imagestring image 3 width 30 DIAGRAM HORIZON 10 PLOT MAX ws color_grid return image return image 122 Pearson A ADDISON WESLEY Education Polymorphisierung und selbstmodifizierender Code function plot image x y import the color handle 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 f 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
495. ot J gt object Dom node 3 type gt 339 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie int 1 name gt string 8 greeting children gt array 1 0 gt object Dom node 3 name gt string 4 text content gt string 12 Hello World type gt int 3 Wie Sie sehen ist dies eine grofse Datenstruktur die das gesamte Dokument darstellt Die tatsachlichen Teile der Struktur sind immer noch Dokumente oder Objektknoten Intern werden die gleichen Klassendefinitionen verwen det Im Gegensatz zu Objekten die mit xmldoc und hnlichen Funktionen erzeugt wurden k nnen Sie bei diesen Strukturen keine Funktionen aufrufen Folglich hat die Struktur die mit xnltree zur ckgegeben wird zum jetzigen Zeitpunkt Nur Lese Status Um XML Dokumente zu konstruieren brauchen Sie andere Methoden 73 Datenaustausch mit WDDX Nachdem Sie erfahren haben wie Sie XML Dokumente erzeugen und verar beiten ist es Zeit Ihnen eine reale Anwendung zu pr sentieren die diese Technologie verwendet Wie Sie wissen ist XML plattform und herstellerun abh ngig und wird sowohl von PHP als auch anderen Programmiersprachen unterst tzt Warum sollten wir XML dann nicht einsetzen um zwischen ver schiedenen Plattformen oder verschiedenen Programmiersprachen zu kom munizieren WDDX tut genau dies 340 Pearson A ADDISON WESLEY
496. out missing values ne ji OID hacet Cooman Ab apaa meere a a Sises ben wg Ar De Pan ee ame Zaren PO SGA S A DO ARD m Aij arse fee ort Jana ta A ET ARD nw Abbildung 4 2 Stufen der Formular berpr fung Gute und schlechte Beispiele Ist eine Benutzerkontrolle m glich Eine Webanwendung ist vom Benutzer kontrollierbar wenn der Benutzer die Geschwindigkeit und Richtung des Programmablaufs beeinflussen kann bis er sein Ziel erreicht Die Anzeigedauer einer Dialogbox sollte stets vom Benutzer kontrollierbar sein und nicht vom Programm diktiert werden Dies klingt logisch Uns ist aber auch ein Beispiel begegnet wie Sie selbst diese grundlegende Regel brechen k nnen Nachdem Sie ein Formular falsch ausgef llt haben blendet das Pro gramm eine Fehlermeldung ein und kehrt automatisch nach f nf Sekunden zum Formular zur ck Die korrekt eingegebenen Daten wurden nat rlich nicht gespeichert und Sie m ssen von vorne beginnen wenn es Ihnen das wert ist wir haben diese Seite einfach verlassen Benutzer die nach dem Abschicken des Formulars zu einem anderen Programm oder einer anderen Browserin stanz gewechselt haben h tten die Fehlermeldung sogar niemals gesehen Sie sollten dem Benutzer auch die Wahl lassen zu entscheiden wie viele Daten angezeigt werden Wenn sich ein Formular ber mehrere Schritte erstreckt 210 Pearson A ADDISON WESLEY Education Die Bedeutung
497. peicher belegen Die Anwendung verwendet eine MySQL Datenbank die aus 40 Tabellen besteht Im Vergleich dazu hat SixAIM etwa 71 000 Programmzeilen im PHP 3 0 Code sowie weitere 10 000 Programm zeilen die in Oracles PL SQL Sprachcode geschrieben sind und belegt 2 MB Speicher Die Oracle Datenbank umfasst nahezu 200 Objekte 65 Tabellen 25 Datenbankfunktionen 15 Prozeduren und 8 Pakete die wiederum zus tzli che 45 Funktionen und 30 Prozeduren enthalten nicht gez hlt spezielle kun denspezifische Funktionen Six hat die Standard oder Basisversion von PHP verwendet und verwendet sie immer noch insbesondere die Versionen 3 0 6 3 0 7 und 3 0 12 sowie zu Testzwecken 4 0b3 Six plant f r neue Projekte auf die Version 4 0 umzusteigen sobald diese keine Beta Version mehr ist und stabil l uft Six hat zwar eine Reihe von L sungen von der PHP Version 2 x nach 3 x migriert aber dies ist eine zeitaufwendige Aufgabe bei der sich auch Programmierfehler einschleichen k nnen selbst wenn die Migration mit Skripten automatisiert wird F r Syntax und Sprach nderungen sowie funk tionale Variationen wie etwa bei der Handhabung von Arrays und der Dekla ration von Variablen werden zus tzliche Migrationszeiten und Testanforde rungen ben tigt PHP hat sich bei Six und seinen Kunden gut bew hrt ist aber wie bereits erw hnt nicht unbedingt ideal f r Websites mit h herem Datenverkehr Einige Caching Konzepte waren hilfreich und au erdem verw
498. pher Feedback und Output Feedback 201 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Electronic Code Book ECB Modus sollten Sie nur mit u erster Vorsicht verwenden Jeder 64 Bit Block des Klartextes wird nacheinander mit den angegebenen Algorithmen unabh ngig voneinander verschl sselt Die Klartextmuster werden nicht verborgen Sie sind als Iterationen im ver schl sselten Text zu sehen ECB eignet sich daher nur f r die Verschl sse lung von willk rlichen Daten z B einem MD5 Hash Cipher Block Chaining CBC vermeidet dieses Problem indem jeder Block vor der Verschl sselung durch XOR mit dem vorangegangenen verkn pft wird Die Verschl sselung eines Blocks h ngt demnach von den vorherge henden Bl cken ab Derselbe 64 Bit Klartextblock kann je nach seiner Posi tion in der Nachricht zu unterschiedlich verschl sselten Bl cken f hren Da es als willk rlichen Startparameter f r XOR auch einen Initialisie rungsvektor benutzen kann ist es sehr viel sicherer als ECB Cipher Feedback CFB Modus macht es genau andersherum Der Klartext wird verschl sselt und anschlie end durch XOR mit dem vorhergehenden Klartextblock verkn pft Der Vorteil von CFB ist dass es mit Bl cken klei ner als 64 Bits arbeitet und damit auch zur Verschl sselung von Byte Str men verwendet werden kann Output Feedback OFB Modus hnelt dem CFB Modus hat jedoch einen Vorteil Bit Fehler die m glicherweise w hren
499. print lt pre gt exec Is la dir lines rc count count lines 1 for i 1 i lt count i type substr lines i 0 1 name strrehr lines i name substr name 1 dire substr lines i 0 strpos lines i name printf lt font color s gt type d blue black print dire lt font gt if type d if name or name print name lt br gt 187 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte else printf lt a href basename PHP_SELF dir s gt name lt wa gt lt br gt empty dir name dir name else printf lt a href s gt name lt a gt lt br gt _ wempty dir name dir name print lt pre gt Listing 4 3 Verzeichnisanzeige mit Sicherheitsrisiken Er best tigte zwar unsere Annahme dass das Skript in eine zuverl ssige Umgebung eingebettet werden sollte Es gibt jedoch einige Techniken die es zu einem gef hrlichen Sicherheitsleck machen w rden wenn ein unerfahre ner Benutzer das Skript in einem ffentlich zug nglichen Verzeichnis plat zierte Rufen Sie es doch einmal mit Directory_Viewer php3 dir etc auf Nett nicht wahr Sie k nnen jedes Verzeichnis auf dem System durchbl ttern f r das PHP zugelassen ist Aber das ist noch nicht alles Sie k nnen mithilfe des kleinen Skripts jeden Befehl ausf hren
500. pte mit denen Sie auf die Datenbanken und das Dateisystem mit einer hohen Fre quenz zugreifen Schreiben Sie Ihre Resultate nieder und vergleichen Sie diese Dies ist immer eine gute Methode um Datenaustauschverfahren zu tes ten Vertrauen Sie niemals auf die theoretischen Beschreibungen dessen zu was das System f hig sein soll In der Praxis funktionieren viele Dinge ganz anders Verwendung von Semaphoren Nat rlich haben Sie den Grund f r die schlechte Leistung in den beiden vor angegangenen Ans tzen schnell erkannt Was sind die Gr nde Finden Sie es heraus und schreiben Sie es nieder Suchen Sie nach den kritischen Punkten Dies ist wichtig wenn Sie das Ver fahren sp ter optimieren wollen Eine Kette ist nur so stark wie ihr schw chs tes Glied Und ein Programm ist nur so schnell wie seine langsamste innere Schleife Die Methode um diese Engp sse zu ermitteln hei t Profiling sie ist extrem wichtig Bei der Verwendung einer Datenbank ist der Engpass die Datenbank Die Zeit die Datenbank aufzurufen eine relativ kleine Anfrage auszuf hren das Ergebnis einzulesen und zu ermitteln was als N chstes zu tun ist der 148 Pearson A ADDISON WESLEY Education Schnittstelle zum Netzwerk sogenannte Overhead ist im Vergleich zu dem Ergebnis das wir erhalten sehr lang Mit anderen Worten Wir verwenden ein riesiges Softwaresystem das f r komplexe Datenspeicherung ausgelegt ist um einfache boolesche Werte aus
501. r INTERNAL_FUNCTION PARAMETERS unsigned char func_arg_types zend_function_entry Listing 9 5 Interne Deklaration von zend_function_entry Die folgende Tabelle beschreibt die Eintr ge Eintrag Beschreibung fname Gibt den Funktionsnamen an wie er in PHP gesehen wird z B fopen mysql_connect oder in unserem Beispiel first_module handler Zeiger auf die C Funktion die f r die Verwaltung von Aufrufen die ser Funktion zust ndig ist siehe z B das zuvor besprochene Stan dardmakro INTERNAL_FUNCTION PARAMETERS func_arg_ Erm glicht Ihnen bestimmte Parameter zu markieren so dass sie types per Referenz bergeben werden m ssen In der Regel sollten Sie die sen Eintrag auf NULL setzen Im obigen Beispiel sieht die Deklaration folgenderma en aus zend_function_entry firstmod_functions ZEND_FE first_module NULL NULL NULL NULL J Wie Sie sehen muss der letzte Eintrag in dieser Liste stets NULL NULL NULL sein Dieser Marker muss gesetzt werden damit Zend wei wann das Ende der Liste der exportierten Funktionen erreicht ist Hinweis Die vordefinierten Makros k nnen Sie nicht f r die Endmarkie rung verwenden da diese versuchen w rden eine Funktion namens NULL zu referenzieren 386 Pearson vy ADDISON WESLEY Education Einblick in die Quellen Das Makro ZEND_FE wird einfach zu einen Struktureintrag in zend_function_ entry expandiert Beachten Sie dass diese
502. r Gesch ftsszenarien mit hnlichen Anforderungen Dies hat sich ge ndert und wir halten es f r eine der gr ten Errungenschaften von PHP Mit der aktuel len Version k nnen Sie nicht nur COM Bedienelemente in WIN32 Systemen verwenden sondern auch Java Befehle auf beliebigen Systemen mit einer Java Virtual Machine JVM ausf hren Es gibt drei Standardarchitekturen f r solch eine firmenweite Wiederverwen dung von Objekten D COM von Microsoft JavaBeans RMI von Sun Micro systems und CORBA von der Object Management Group Aufgrund der weit verbreiteten Verwendung von Windows Systemen wird COM am h ufigsten eingesetzt Einzelheiten ber die Verwendung von PHP und COM finden Sie im n chsten Abschnitt Unternehmen mit heterogeneren Umgebungen bevor zugen allerdings Java oder CORBA da sie mehr Plattformen unterst tzen 250 Pearson A ADDISON WESLEY Education Dreistufige Anwendungen I Client U Il Anwendungsserver M Business Objekte COM Steuerelemente A Ill Datenserver Abbildung 5 5 Schichten mehrstufiger Anwendungen Fir den Zugriff auf SAP R 3 Systeme steht beispielsweise JavaBeans oder alternativ COM Objekte mit ihrer Business API BAPI Schnittstelle zur Ver fiigung tiber welche Sie das SAP Business Framework in Ihre Anwendungs serverschicht integrieren k nnen berlegen Sie welche M glichkeit dies f r ein E Commerce System er ffnen k nnte Sie k nnten einen Onl
503. r var class var var class var var var var var var var var DB_Example extends DB Sql Host localhost Database phplib User tobias Password justdoit Example CT Sql extends CT Sql database class DB Example Which database to connect database table active sessions and find our session data in this Example Session extends Session classname Example Session cookiename defaults to classname magic Hocuspocus ID seed mode cookie We propagate session IDs with cookies fallback mode get lifetime 0 0 do session cookies else minutes until the session expires that_class Example CT Sql name of data storage container gc_probability 5 Wie Sie sehen haben die Klassen eine Beziehung In der Klasse Example_ Session ist die Varibale that_class auf den Namen der Klasse Example CT Sq gesetzt und in Example_CT_Sq zeigt die Variable database_class auf die Klasse DB_Sq1 Abbildung 6 1 zeigt diese Beziehung im Detail 270 Pearson A ADDISON WESLEY Education Datenbankabstrahierung A Enth lt den Code zur Verwaltung von Session IDs Session AoA 5 P Serialisierung von Variablen und cleanup alter Sessions verwendet Enth lt die SQL Abfragen zum Laden und Speichern von Sessions Authentisierung von Benutzern u v m verwendet bernimmt die Kommunikation mit der Datenbank Fehlerbehandl
504. r Argumentenliste notwendig ist m ssen Sie Ihre Modulquel len ebenfalls ndern um kompatibel zu bleiben Makro Beschreibung ZEND_MINIT module Deklariert eine Funktion zur Modulinitialisierung Der erzeugte Name lautet zend_minit_ lt module gt z B zend_minit_first_module Zu verwenden in Verbindung mit ZEND_MINIT_FUNCTION ZEND_MSHUTDOWN module Deklariert eine Funktion zur Moduldeinitialisie rung Der erzeugte Name lautet zend_mshutdown_ lt module gt z B zend_mshutdown_first_module Zu verwenden in Verbindung mit ZEND_MSHUTDOWN_ FUNCTION ZEND_RINTT module Deklariert eine Funktion zur Anfrageinitialisierung Der erzeugte Name lautet zend_rinit_ lt module gt z B zend_rinit_first_module Zu verwenden in Verbindung mit ZEND_RINIT_FUNCTION ZEND_RSHUTDOWN module Deklariert eine Funktion zur Anfragedeinitialisie rung Der erzeugte Name lautet zend_rshutdown_ lt module gt z B zend_rshutdown_first_module Zu verwenden in Verbindung mit ZEND_RSHUTDOWN _ FUNCTION ZEND_GINIT module Deklariert eine Funktion zur globalen Initialisie rung Der erzeugte Name lautet zend_ginit_ lt mo dule gt z B zend_ginit_first_module Zu verwen den in Verbindung mit ZEND_GINIT_FUNCTION Tab 9 3 Makros zur Deklaration der Initialisierungs und Deinitialisierungsfunktionen 391 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Makro Beschreibung
505. r Informationen Ressourcen wer den innerhalb von Zend in speziellen Ressourcenlisten abgelegt Jeder Eintrag in der Liste hat eine entsprechende Typdefinition welche die Art von Res source angibt auf die sie referenziert Intern verwaltet Zend alle Referenzen auf diese Ressource Der Zugriff auf eine Ressource erfolgt niemals direkt son dern immer ber die bereitgestellte API Sobald es keine Referenzen auf eine bestimmte Ressource mehr gibt wird eine entsprechende Deinitialisierungs funktion aufgerufen 418 Pearson A ADDISON WESLEY Education Ressourcen Ressourcen werden beispielsweise verwendet um Datenbanklinks und Dateideskriptoren zu speichern Die de facto Standardimplementierung fin den Sie im MySQL Modul Aber auch andere Module wie etwa das Oracle Modul verwenden Ressourcen Um einen Handle f r Ihre spezielle Ressource zu erhalten m ssen Sie den Ressourcentyp vor der Verwendung registrieren int resource_handle register_list_destructors destructor_handler NULL Dieser Aufruf erzeugt einen Handle den Sie verwenden k nnen wenn Sie Eintr ge in die Ressourcenliste hinzuf gen Die angegebene Funktion hier destructor_handler wird stets aufgerufen wenn es keine Referenz mehr auf eine bestimmte Ressource gibt und Zend versucht diese zu l schen Diese Funktion sorgt f r die richtige Ressourcenfreigabe und Aufhebung der Zuweisungen Sie muss vom Typ void sein und als einziges Argument einen Zeiger auf
506. r Server verbunden werden entsprechend dem physikalischen Auf bau des Netzes Man k nnte es auch anders machen Frankfurt k nnte bei spielsweise eine Verbindung nach Polen haben Wenn Polen jedoch keine eigene berseeverbindung hat m sste der Datenverkehr der von Frankfurt nach Polen weitergeleitet wird einen anderen Weg finden um den Ozean zu berqueren Er w rde ber ein weiteres Land oder zwei oder drei geleitet werden bis eine berseeverbindung gefunden wird Durch dieses zus tzliche Routing wird viel Bandbreite verschwendet Daher wird stets versucht die Struktur des IRC Netzwerks so anzupassen dass es bestm glichst den zugrun deliegenden physikalischen Netzwerkaufbau unterst tzt Multiplexen gt Client 1 gt Client 2 lt ____ gt Client 3 gt lt dm gt Netzwerkverbindung Hub a lt mM gt Netzwerkverbindung m of sD Client n lt lt _ gt lt Demultiplexen Abbildung 3 3 Netzwerkstruktur aus Serversicht Diese konzeptuellen Probleme treten nur in den gr ten Netzwerken auf die Zehntausende von Benutzern versorgen Diese Netzwerke ben tigen wirklich zuverl ssige Verbindungen f r ihre Backbones Die typischen web basierten 136 Pearson A ADDISON WESLEY Education Einpassen der Anwendung in das Netzwerk Chat R ume oder Netzwerke haben meist nicht mehr als 1 000 Clients auf ein mal so
507. r auch in Betracht ziehen ob Sie Ihre eigenen Werk zeuge entwickeln die einfacher und daher leichter zu verwenden sind als kommerzielle L sungen und besser an Ihre Firmenstrategie angepasst sind Wir haben einen Startpunkt f r Sie Auf der CD ROM zu diesem Buch finden Sie den vollst ndigen Quellcode f r eine Wissensdatenbank die sich leicht in eine unterst tzende Datenbank oder ein Firmenlinkverzeichnis umwandeln l sst Das System wurde urspr nglich f r Zend Technologies entwickelt aber die Firma erlaubte uns freundlicherweise es mit diesem Buch zu verbreiten Die Anwendung verf gt ber vielf ltige Funktionen Volltext Suche eine unbegrenzte Anzahl an Kategorien und Unterkategorien einen Bericht der alle Hinweise eines bestimmten Autors oder der Autoren mit den meisten bertragungen enth lt Benutzerdaten von Eintr gen Eintr ge des Benutzers zur Weiterleitung von Daten und mehr 3 PHP Tips Netscape a5 Eile Edit View Go Communicator Help ME Bookmarks Jf Location http www phpwebdev com test index php Gal What s Related D PHP Tips Apache Specific Arbitrary Precision Mathematics Aspell Calendar e COM Database HTTP Related Image GD IMAP IMSP e LDAP MCal mcrypt mhash e Miscellaneous Network PDF PHP 4 Specific PHP Core Language PHP Options amp Informations POSIX Program Execution Regular Expression Semaphore and Shar
508. r com st ndig entscheiden wie diese Anwendungen und der Inhalt verbessert werden kann um der Konkurrenz stets einen Schritt voraus zu sein MarketPlayer com ist die einzige Website auf der Investoren Aktienkurse ber eine Zw lf Monatszeitraum verfolgen und grafisch darstellen k nnen um Ertr ge abzusch tzen Eine Technik die auch von institutionellen Finanzmanagern bevorzugt wird Market Player com hat bereits mehrere Patente eingereicht um die einzigartige Weise zu sch tzen in der die Online B rsenspiele funktionieren Au erdem verf gt MarketPlayer com ber ein Expertenteam von Produktentwicklern und Pro grammierern welche die Aufgabe haben neue und n tzliche webbasierte Finanzwerkzeuge zu entwerfen die dem einzelnen Investor helfen das not wendige Wissen und die Erfahrungen zu sammeln um in der Gemeinschaft der Investoren erfolgreich zu sein 359 Pearson vy ADDISON WESLEY Education 8 Fallstudien 8 3 3 Warum PHP MarketPlayer com verwendet PHP da dieses in der Lage ist eine schnelle Entwicklungsumgebung bereitzustellen Mithilfe von PHP kann Market Player com innerhalb von Tagen konzeptionelle Entw rfe direkt vom Reif brett in einer Beta Version umwandeln Teile der Anwendung die optimiert werden miissen in Bezug auf die Geschwindigkeit konnen dann herausge nommen in C geschrieben und in Form von Funktionen in eine benutzerspe zifische PHP Bibliothek integriert werden MarketPlayer com verwendete PH
509. r einer Funk tion durch Referenz bergeben wird wird automatisch eine zval Separation 404 Pearson A ADDISON WESLEY Education Annahme von Argumenten durchgef hrt Wenn Sie eine Funktion wie diese in PHP aufrufen stellt Zend also automatisch sicher dass parameter als isolierter Wert bergeben wird indem es ihn im schreibsicheren Status wiedergibt my_function amp parameter Dies ist jedoch nicht der Fall bei regul ren Parametern Alle anderen Parame ter die nicht durch Referenz bergeben werden befinden sich in einem Nur Lesen Status Dazu m ssen Sie jedoch sicherstellen dass Sie wirklich mit einer Referenz arbeiten ansonsten produzieren Sie m glicherweise unerw nschte Ergeb nisse Um einen Parameter zu suchen der durch Referenz bergeben wurde k nnen Sie die Function ParameterPassedByReference verwenden Diese Funktion nimmt zwei Parameter an Der erste ist der ht Wert der Funktion und der zweite ist die Argumentenanzahl die Sie testen m chten wobei die Z hlung von links nach rechts geht wie Listing 9 9 und Abbildung 9 6 zeigen den vollst ndigen Quellcode finden Sie auf der CD ROM zval parameter if ZEND_NUM_ARGS 1 zend_get_parameters_ex 1 amp parameter SUCCESS WRONG_PARAM_ COUNT check for parameter being passed by reference if ParameterPassedByReference ht 1 zend_error E_WARNING Parameter wasn t passed by reference RETU
510. r mittlerem Daten verkehr bzw in Situationen in denen eine Anwendung schnell von Grund auf erstellt werden muss bietet PHP eine exzellente Plattform Nattirlich h ngt alles vom Umfang des Projekts ab Wie bei jeder anderen Plattform hat auch PHP Beschr nkungen In sehr gro en Projekten oder auf sehr gro en Websites mit extrem vielen Aktivit ten kann PHP ein Problem darstellen ins besondere wenn die Laufzeit des Skript in Betracht gezogen wird Wenn Leis tungsfragen in Bezug auf die Belastung des Systems durch PHP auftauchen sollten Caching und die Vorverarbeitung von Programmcode eingef hrt wer den um statische Seiten zu erzeugen Ganz allgemein dies h ngt von einer Reihe von Faktoren ab empfiehlt es sich statische Seiten zu erzeugen wenn eine Website etwa 500 000 volldynamische Seitenansichten pro Monat hat bzw f nf bis zehn Abfragen gleichzeitig f r eine Seite In bestimmten Situationen verwendete Six auch Mod_Perl aber die Server konfiguration und der Bedarf an Kerneltuning r ckten bei dieser Methode immer mehr in den Vordergrund Perl ist sehr gut durchdacht und wird bereits seit einiger Zeit verwendet Daher hat es ein sehr konsistentes Sprach schema und eine einheitliche Syntax Da Mod_Perl au erdem kompiliert ist und im Speicher bleibt kann eine Website von unterschiedlichen Komponen ten erzeugt werden die ihre eigenen benannten Speicher haben und unab h ngig voneinander kompiliert werden k nnen Mit Mod_Perl
511. r semantischen Bedeu tung kennzeichnen z B mit lt emphasis gt So weit zur Auszeichnung Wo ist die Struktur XML Tags k nnen verschach telt werden und haben einen Kontextstatus d h es ist relevant wo sie in einem Dokument auftauchen Die Tagkombination lt chapter gt lt title gt wird anders behandelt als lt book gt lt title gt In der XML Spezifikation gibt es keine Beschr nkung in Bezug auf die Anzahl der verschachtelten Elemente Die ein zige Anforderung ist dass alle Elemente ihrem Ursprung im Stammelement haben XML Verwandte Der Vorl ufer von XML ist SGML Seit es 1986 zum ISO Standard wurde wird SGML Standard Generalized Markup Language von gr eren Firmen aller Industriezweige zur Erzeugung von strukturierten Dokumenten ver wendet SGML ist jedoch ein komplizierte Standard der von Anwendungen kaum unterst tzt wird Die meisten SGML Anwendungen Editoren Speicherserver Konvertierungswerkzeuge sind daher sehr teuer h ufig kosten Sie ber 10 000 HTML hat dagegen industrieweite Unterst tzung und wird auf Millionen von Websites verwendet Es definiert einen einfachen Typ von Dokument f r eine gew hnliche Klasse von kurzen Artikeln mit Kopfzeilen Abs tzen Lis ten und oder Bildern und enth lt einige Funktionen zum Einbinden von Hypertext Marken und Multimedia Anwendungen Es ist jedoch in Bezug auf die Flexibilit t und Erweiterbarkeit sehr begrenzt Die Tags und die Semantik sind festgelegt Sie k
512. ragen k nnen Wie Sie bereits wis sen k nnen Sie fopen verwenden um die Standardeingabe zu lesen in wel che das externen Programm schreibt Ein einfaches Beispiel hierf r sieht fol genderma en aus Open a writing pipe to the sort command fpout popen sort w Open stdin with PHP Streams fpin fopen php stdin r hx Output some characters to sort fputs fpout a n fputs fpout c n fputs fpout b n Close the pipe to sort sort will now process the input and write it to stdout pclose fpout Sort s stdout is stdin for us so read it until feof while c fread fpin 1 247 Pearson vy ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien print c CVS Kurzreferenz CVS hat zwar nur etwa 25 Hauptbefehle aber eine Vielzahl an Optionen und noch mehr m gliche Kombinationen In der Praxis werden Sie nur einen klei nen Teil der Befehle ben tigen Die folgende Tabelle gibt Ihnen einen kurzen berblick den Sie als Ged chtnisst tze f r die grundlegenden Befehle ver wenden k nnen Befehl Beispiel Beschreibung cvs login cvs login Dient zur Anmeldung auf dem CVS Ser ver Dieser fragt nach Ihrem Passwort cvs checkout cvs checkout phpBook Liest ein Modul aus dem CVS Zentralar chiv aus Wird in der Regel zum Auslesen eines Moduls verwendet gesamtes Ver zeichnis unterhalb der obersten Ebene cvs update c
513. ramm installieren sollten Sie eine Liste aller Funktionen erstellen die in einem Modul zusammengefasst werden k nnen und einen separaten Entwicklungsplan f r jedes Modul erarbeiten Erstellen Sie unbe dingt detaillierte Datenflussdiagramme damit die Module alle Anforderun gen des Programms handhaben k nnen Untersch tzen Sie nicht die Bedeu tung der Vorbereitung auf Papier Es w rde zu weit f hren wenn wir auf diesen Aspekt ausf hrlich eingingen Wir empfehlen Ihnen sich mit diesem Thema in einigen der hervorragenden B cher ber Design Verfahren vertraut zu machen 1 3 7 Abtrennen separater Programmteile Ganze Bl cke aus dem Programm zu entfernen sollte sowohl w hrend der Planungs als auch w hrend der Installationsphase geschehen Angenom men eine Funktion f hrt folgende Aktionen durch Datei ffnen Datenblock aus der Datei lesen Daten validieren 1 2 3 4 M gliche Datenfehler korrigieren 5 Daten wieder in die Datei zur ckschreiben 6 Datei schlie en Jeder Schritt kann in einem separaten Block programmiert werden Guter Stil ist diese Bl cke zu separieren und sie in separate Funktionen umzuwandeln Damit k nnen Sie die einzelnen Bl cke nicht nur in anderen Funktionen wie derverwenden vielleicht ben tigen Sie die Unterst tzung f r die Dateiopera tionen auch an anderer Stelle der Programmcode ist auch leichter zu lesen und Fehler sind schneller zu finden Sie k nnen die entnommenen T
514. ramme 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 Komprimierungsebenen 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 119 Pearson A ADDISO
515. rammierer von einem mittelm igen unterscheiden Das schwierigste Problem l sst sich leicht l sen wenn Sie es fr her schon einmal gel st haben Eine Datenstruktur f r die Kategorie zu generieren geschieht nach denselben Prinzipien wobei wir anf nglich nur wissen dass dieser Struktur die Eigen schaft Name zugeordnet werden soll Laut Anforderungskatalog brauchen 290 Pearson A ADDISON WESLEY Education Wissensrepr sentation wir verschachtelte Kategorien Deshalb muss diese Struktur auch einen ein deutigen Bezeichner haben zwei Kategorien in verschiedenen Zweigen k nnten denselben Namen haben Eine weitere Anforderung lautet unbe grenzte Verschachtelung Aber dies berspringen wir f r den Moment da es ein separates Problem ist Die dritte Datenstruktur ist bereits definiert da wir PHPLib verwenden Sie entspricht der PHPLib Klasse Auth Dieser Ansatz unterscheidet sich von der herk mmlichen Top Down Pro grammierung und funktionalen Zerlegung Bei der funktionalen Zerlegung werden die Funktionen eines zu erstellenden Systems gekennzeichnet in unserem Beispiel Strukturierung von Fakten in Kategorien Bereitstellung von Berichten f r die Eintr ge mit den meisten Zugriffen usw und in klei nere Unterfunktionen unterteilt bis die Funktionen atomar vorliegen und sich direkt in Programmfunktionen abbilden lassen Zu diesem Zeitpunkt unternehmen wir in dieser Richtung noch nichts da wir noch gar nicht
516. rammlogik der entsprechend reagiert wenn der Server nicht mehr erreichbar ist Au erdem k nnte die Soft ware noch eine DLL als Backend haben welche die tats chliche berwachung bernimmt Sagen wir dass ServerSpy d1 eine Funktion is_reachable ent h lt die als Argument den Servernamen akzeptiert und true zur ckgibt wenn der Server erreichbar ist ansonsten false Bisher haben wir noch nicht definiert welche Art von Server wir berwachen wollten Es k nnte ein Webserver Mailserver Nameserver oder jedes andere System sein Die Funktionsdeklaration selbst und der Backend m ssten nicht ge ndert werden Der einzige Teil der angepasst werden m sste w re die Implementierung der Funktion is_reachable Mit DLLs k nnen Sie genau einen berwachungsdienst auf Ihrem System installieren entweder einen Webserverspion oder einen Mailserverspion usw Sobald Sie eine weitere DLL installieren w rde diese die vorherige ber schreiben Der Kunde k nnte in Ihrer Anwendung nicht zwischen verschiedenen ber wachungsdiensten ausw hlen Sie k nnten auch nicht verschiedene Versio nen eines Dienstes auf dem System verwenden Wenn ein anderer Software hersteller eine bessere Version von ServerSpy dll schreiben und diese an Ihrem Kunden verkaufen w rde w rde diese wiederum Ihre DLL Version berschreiben Sofern die neue Funktion genauso wie die alte funktioniert ist alles gro artig anderenfalls wird Ihr Programm den Dienst einst
517. rator zuzuordnen Wenn dieser Operator dann auf solch ein Objekt in einem Programm angewendet w rde dann wird die Funktion mit den Parametern 422 Pearson A ADDISON WESLEY Education Duplizierung variabler Inhalte Der Copy Konstruktor lvalue und rvalue aufgerufen Mit dieser Information ausgestattet kann es die Operation ausf hren die der Operator haben soll in der Regel eine erwei terte Form des Kopierens Die gleiche Form des erweiterten Kopierens ist in PHP auch f r die zval Container erforderlich Auch hier w rde bei einem Array das erweiterte Kopieren die erneute Erstellung aller Hash Tabelleneintr ge beinhalten die sich auf diesen Array beziehen Bei Strings m sste eine korrekte Speicherzu weisung gew hrleistet werden usw Zend verf gt ber eine solche Funktion namens zend_copy_ctor das vorhe rige PHP Aquivalent hie pval_copy_constructor Eine sehr sch ne Demonstration f r die Funktionsweise ist die folgende Funktion die als Argument einen komplexen Typ hat diesen modifiziert und anschlie end das Argument zur ckgibt zval parameter if ZEND_NUM ARGSC 1 zend_get_parameters_ex 1 amp parameter SUCCESS WRONG_PARAM COUNT do modifications to the parameter here now we want to return the modified container return_value parameter zval_copy_ctor return_value Der erste Teil der Funktion betrifft nur das reine Auslesen des Arguments Nach
518. raxis ist die Zend API wo immer m g lich zu verwenden da die alte API nur aus Kompatibilit tsgr nden erhalten bleibt So sind z B die Typen zval und pval identisch zval ist die Zend Defini tion w hrend pval die PHP Definition ist genau genommen ist pval ein Alias fiir zval Da das Makro INTERNAL_FUNCTION PARAMETERS ein Zend Makro ist ent h lt die obige Deklaration zval Wenn Sie Programmcode schreiben sollten Sie stets zval verwenden um der neuen Zend API zu entsprechen Die Parameterliste dieser Deklaration ist sehr wichtig Sie sollten sich diese Parameter merken siehe Tabelle 9 1 f r die Beschreibungen Parameter Beschreibung ht Anzahl der Argumente die an die Zend Funktion bergeben werden Sie sollten ihn nicht direkt benutzen sondern statt dessen ZEND NUM ARGSC verwenden um den Wert zu erhalten return_value Diese Variable wird verwendet um die von der Funktion zu r ckgegebene Werte wieder an PHP zur ck zu bergeben Den Zugriff auf diese Variable erreichen Sie am besten ber die vor definierten Makros Eine Beschreibung der vordefinierten Ma kros finden Sie weiter unten this_ptr Mit dieser Variable k nnen Sie auf das Objekt zugreifen in dem die Funktion enthalten ist sofern sie in einem Objekt ver wendet wird Verwenden Sie die Funktion getThis um die sen Zeiger zu erhalten return_value_ Dieser Flag gibt an ob ein m glicher Ausgabewert aus dieser used Funktion tats chlich vom anrufe
519. rd der unterzeichnete und verschl sselte Text oder bei einem Fehler false mixed encrypt_conventional String what String passphrase Verschl sselt what nur mit der konventionellen Verschl sselung wobei passphrase als geheimer Schl ssel verwendet wird Zur ckgegeben wird der verschl sselte Text oder bei einem Fehler false mixed decrypt String what String my_user_id Entschl sselt what mit my_user_id als privaten Schl ssel Zur ckgegeben wird der entschl sselte Text oder bei einem Fehler false mixed decrypt_conventional String what String passphrase Entschl sselt what mit der konventionellen Entschl sselung wobei passphrase als geheimer Schl ssel verwendet wird Zur ckgegeben wird der entschl sselte Text oder bei einem Fehler false 199 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Die Mcrypt Funktionen Mit der Bibliothek MCrypt sind viele Blockalgorithmen verf gbar einschlie lich DES TripleDES Blowfish und IDEA Der Platz reicht nicht aus um all diese Algorithmen zu erklaren oder Empfehlungen auszusprechen welche Sie f r ein bestimmtes Szenario verwenden sollten Die Systeme werden aus f hrlich in vielen Fachb chern und Online Artikeln behandelt von denen einige im Abschnitt Ressources auf der CD ROM aufgef hrt sind Wie bereits in Kapitel 1 Entwicklungskonzepte erw hnt bringt eine weitere Bibliothek leider auch einen weiteren API Stil mit sich was wir nicht f r er
520. rdimplementierung der Klasse Auth verwendet haben die in der PHPLib Distribution in Example_Default_Auth mitgeliefert wird In den meisten F llen m ssen Sie jedoch eine eigene Klasse definieren indem Sie die Auth Basis klasse erweitern In der reinen Form ist Auth nicht zu gebrauchen da ihm zwei Funktionen fehlen die wir f r die Authentisierung ben tigen Auth wei weder wie Ihr Anmeldebildschirm aussehen soll noch wie Sie den Authenti sierungsprozess gestalten m chten Da Auth dies f r Sie nicht bernimmt m ssen Sie diese Funktionen in Ihren abgeleiteten Klassen selbst definieren Listing 6 5 zeigt ein Beispiel f r eine solche abgeleitete Klasse die jener hnelt die sich in local inc als Beispielklasse befindet require EasyTemplate inc php3 class My Auth extends Auth var classname My Auth var database_ class DB Example var database table auth_user function auth_loginform Create template instance tpl new EasyTemplate loginform inc html Is the username already set If yes it means that the first authentication try failed if isset this gt auth uname tpl gt assign USERNAME this gt auth uname tpl gt assign MESSAGE Either your username or your password ware invalid lt br gt Please try again else tpl gt assign USERNAME tpl gt assign MESSAGE Please identify yourself with a username and a password
521. relative Verkn pfungen in Ihrem Programm verwenden Wenn Sie absolute URL Pfade verwenden z B directory script php3 m ssen Sie diese trotzdem manuell ndern Dynamische Pfade mit PHP 4 0 Die automatische nderung des URL ist eine der wirklich phantastischen neuen Funktionen von PHP 4 0 Um sie zu aktivieren m ssen Sie PHP mit enable trans id neu konfigurieren und es erneut kompilieren Dann wird die Sitzungskennnummer in der Form lt session name gt lt session id gt automa tisch in allen relativen Verkn pfungen auf Ihren mit PHP analysierten Seiten eingef gt Nicht f r Hochleistungs Websites Auch wenn es eine nette Funktion ist sollten Sie diese nur mit Vorsicht in Hochleistungs Websites einsetzen PHP muss auf jeder einzelnen Seite nach sehen diese analysieren um festzustellen ob sie relative Links enth lt und schlie lich die ID den Links hinzuf gen Dies hat nat rlich Auswirkungen auf die Leistung Wir empfehlen statt dessen mod_rewrite oder DNS Tricks zu verwenden Auf die Verbreitung der Sitzungskennnummer in realen Anwendungen gehen wir sp ter ein Zun chst m chten wir Ihnen eine weitere Methode der Sitzungskennnummer Verbreitung vorstellen die wohl die spektakul rste ist 172 Pearson A ADDISON WESLEY Education HTTP und Sitzungen 4 1 5 DNS Tricks Die Notwendigkeit alle Links in einem Programm mit der Sitzungskenn nummer auszuzeichnen kann wirklich l stig sein Bei PHP 4 0 gibt es eine
522. ren mit den meisten Eintr gen in der Datenbank zeigen die Eintr ge mit der h chsten Bewertung und die Eintr ge auf die am h ufigsten zugegriffen wird Nur registrierte Benutzer sollen neue Eintr ge vorlegen d rfen Eingereichte Eintr ge sollen nicht sichtbar sein sondern in der Datenbank mit einem Flag versehen eingef gt werden das anzeigt dass diese Eintr ge genehmigt wer den m ssen Sobald ein neuer Eintrag eingereicht wird soll der Administra tor benachrichtigt werden 289 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Auf der Zend com Website wird PHPLib bereits verwendet Daher soll das System PHPLib f r die Session Verwaltung den Datenbankzugriff und Schablonen verwenden Zur Trennung von Code und Layout soll die PHPLib Klasse Template verwendet werden Au erdem sollte das System eine saubere API haben da es sp ter bei Zend Technologies von verschiedenen Entwick lern gepflegt wird F r gew hnlich liefert der Kunde keinen so detaillierten Anforderungskata log H ufig wissen Kunden nicht wie sich ihre gesch ftlichen Anforderungen in der Software realisieren l sst Der Kunde ist kein Experte der Softwareent wicklung sondern kennt nur das Problemfeld W hrend der ersten Bespre chungen mit dem Kunden sollte der Systemanalytiker aus dem dargelegtem Problemfeld einen Anforderungskatalog erstellen Wozu dient die Anwen dung und Was soll die Anwendung f r den Benutzer t
523. retischen Grundlage konzipieren ohne vorher eine einzige Programmzeile gesehen zu haben Hinweise Tipps und Tricks finden Sie im Kapitel 3 Programment wicklung ein Praxisbeispiel 55 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte Das Modul f r welches wir eine API generieren wollen soll einen einfachen Terminkalender steuern Wie die Funktionen des Terminkalenders tats chlich implementiert werden interessiert an dieser Stelle nicht Genaugenommen ist dies genau der Teil den der Benutzer nicht sehen soll Der Benutzer m chte lediglich eine Reihe von Zuordnungen vornehmen Die API muss sich also als genau dies darstellen n mlich als Schnittstelle ber welche Zuordnungen verwaltet werden k nnen Es ist nicht erforderlich dem Benutzer das zugrun deliegende System zu erkl ren ob Sie den Julianischen den Gregorianischen Kalender oder ein ganz eigenes Format verwenden Vielleicht m chten Sie dem Benutzer irgendwann eine Reihe zus tzlicher Funktionen zur Verf gung stellen z B zur Konvertierung des Datenformats aber dies ist vollkommen berfl ssig wenn Sie den Benutzer zun chst nur in die Lage versetzen wol len Zuordnungen vorzunehmen Andererseits bedeutet dies nicht dass Sie die zuk nftige Einbindung solcher Funktionen verhindern m ssen Die Kunst eine Schnittstelle zu entwickeln besteht darin sie so zu konzipieren dass sie Ihren Anforderungen genau ent spricht und trotzdem sp ter erw
524. rgabe und der Speicherung in elektroni schen Medien Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zul ssig Fast alle Hardware und Softwarebezeichnungen die in diesem Buch erw hnt werden sind gleichzeitig auch eingetragene Warenzeichen oder sollten als solche betrachtet werden Umwelthinweis Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt Die Einschrumpffolie zum Schutz vor Verschmutzung ist aus umweltfreundlichem und recyclingf higem PE Material Dies ist eine authorisierte bersetzung der amerikanischen Originalausgabe Web Application Development with PHP 4 0 ISBN 0 7357 0997 1 New Riders Publishing 10987654321 04 03 02 01 ISBN 3 8273 1730 4 2001 by Addison Wesley Verlag ein Imprint der Pearson Education Deutschland GmbH Martin Kollar Stra e 10 12 D 81829 M nchen Germany Alle Rechte vorbehalten bersetzung Rebecca Stiels Diplom bersetzerin amp Diplom Technikredakteurin Einbandgestaltung atelier f r gestaltung niesner amp huber Wuppertal Lektorat Sylvia Hasselbach shasselbach pearson de Herstellung Anna Plenk aplenk pearson de Satz reemers publishing services gmbh Krefeld Druck und Verarbeitung Bercker Graphische Betriebe Kevelaer Printed in Germany Pearson A ADDISON WESLEY Education Inhaltsverzeichnis Vorwort 18 Einf hrung 21 Zielgruppe 22 Voraussetzungen 22 Aufbau dieses Buches 23 In diesem Buch verwendete Konventio
525. rgumente Sie gibt true aus wenn die Sitzung erfolgreich geschlossen wurde ansonsten false mixed read String sess_id Diese wichtige Funktion wird aufgerufen wenn eine Sitzung gestartet wird Sie muss die Daten der Sitzung auslesen die mit sess_id gekenn zeichnet ist und diese als serielle Zeichenfolge zur ckgeben Wenn es keine Sitzung mit dieser Kennnummer gibt sollte eine leere Zeichenkette zur ckgegeben werden Bei einem Fehler lautet die Ausgabe false bool write String sess_id String value Wenn die Sitzung gespeichert werden muss wird diese Funktion aufgeru fen Das erste Argument ist eine Zeichenfolge welche die Sitzungskenn nummer angibt Das zweite Argument ist die serielle Darstellung der Sit zungsvariablen Bei erfolgreicher Speicherung gibt der Wert true aus bei einem Fehler der Wert false bool destroy String sess_id Wenn der Entwickler session_destroy aufruft wird diese Funktion aus gef hrt Sie l scht alle Daten die der Sitzung mit der Kennnummer sess_ id zugeordnet sind und gibt bei erfolgreicher L schung true zur ck ansonsten false bool gc Intmax_lifetime Diese Funktion wird beim Einrichten einer Sitzung mit der Wahrschein lichkeit aufgerufen die in gc_probability angegeben ist Sie wird zur Speicherbereinigung verwendet Dabei werden alle Sitzungen entfernt 180 Pearson A ADDISON WESLEY HTTP und Sitzungen Education die seit mehr als gc_maxlifetime Sekunden nicht mehr aktu
526. ri gens kommen propriet re Formate z B in ffentlichen Dokumenten gar nicht erst in Betracht Oder m chten Sie sich auf die Gnade eines einzelnen Herstellers verlassen der sein Format nach Gutd nken ndern kann oder es sogar ganz abschafft XML ist lizenzfrei herstellerneutral und plattformun abh ngig XML bietet Mittel zur Strukturierung des Inhalts unterscheidet sich aber von relationalen Datenbanksystemen Es bietet kein relationales Modell Vielmehr erm glicht es eine unbegrenzte Anzahl von Verschachtelungen was ein Datenbanksystem nicht bew ltigt Auf der anderen Seite fehlen ihm einige Funktionen die ein RDBMS bietet wie etwa stringente Feldtypen Randbe dingungen Schl ssel usw Nat rlich gibt es auch hnlichkeiten zwischen den beiden Konzepten und es gibt sogar Bem hungen eine SQL hnliche Abfragesprache f r XML Dokumente zu generieren ber den Erfolg vom XML sollten Sie jedoch nicht vergessen dass herk mmliche RDBMS durchaus n tzlich sind Sie bieten wichtige Verarbeitungsfunktionen die in XML kaum modelliert werden k nnen und sie sind von Anfang an auf Schnelligkeit aus gerichtet Der gro e und alles in den Schatten stellende Vorteil von XML ist die Tren nung der logischen Struktur vom Layout XML Dokumente k nnen in jede beliebige Darstellungsform umgewandelt werden HTML PostScript PDF 305 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie RTF Klartext Audi
527. richten von Benutzern aus der Datenbank verwerfen Auf der IRC Ebene Wir k nnten die IRC eigenen Netzwerkverwaltungs funktionen verwenden 3 6 1 Auf der Netzwerkebene Die Sicherung auf Netzwerkebene l sst uns nur zwei M glichkeiten Entwe der wir lassen eine Verbindung zu oder nicht Hierf r k nnen wir eine Fire wall verwenden oder andere M glichkeiten der IP Maskierung nutzen Diese Methode ist begrenzt kompliziert unsicher und im Allgemeinen nicht das was wir wollen 3 6 2 Auf der PHP Webserver Ebene Bei der Sicherung auf Webserver Ebene werden Verbindungen zum Server prinzipiell zugelassen aber die Anmeldung des Clients wird durch einen Passwortschutz begrenzt oder andere Berechtigungsverfahren Genauge nommen l uft es wieder darauf hinaus eine Verbindung zuzulassen oder nicht was nicht wirklich befriedigend ist Dieses Verfahren kann jedoch zur Emulierung von Benutzerverboten verwen det werden Die f r IRC blichen Verbote n mlich K Verbindungen und G Verbindungen lokale und globale Benutzerverbote k nnen bei einem 159 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel web basierten Chatsystem nicht benutzt werden da alle Verbindungen vom Webserver ausgehen Die einzige Adresse die man verbieten k nnte w re die Adresse des Webservers wodurch die komplette Schnittstelle vom Netz abgetrennt w rde Um trotzdem bestimmte Benutzer ausfiltern zu k nnen sollten di
528. ript php3 l sst sich mit dieser Umschreibungsregel ndern RewriteEngine On RewriteBase RewriteRule 0 9a z 32 1 Die erste Zeile weist mod_rewrite an zu starten Die zweite Zeile setzt explizit ein Basisverzeichnis das wir nur brauchen wenn wir mod_rewrite in einem lokalen Kontext verwenden z B in einer htaccess Datei Die dritte Zeile defi niert schlie lich den regul ren Ausdruck der f r die URL Neuschreibung verwendet wird Unser Ausdruck wirft die Sitzungskennnummer einfach aus der URL raus Um die Sitzung zu starten verwenden wir eine hnliche Funktion wie jene die wir bereits geschrieben haben Nur die anf ngliche Umleitung ist anders 171 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte function session_start_from_rewrite global HTTP_HOST REQUEST_URI ereg 0 9a z 32 REQUEST_URI regs session_id regs 1 if isset session_id empty session_id srand double microtime 1000000 session_id md5 uniqid rand destination http HTTP_HOST session id REQUEST URI header Location destination session_id session_id session start Bei allen Anfragen geht der Browser davon aus dass die Sitzungskennnum mer in der URL enthalten ist er wird daher bei jeder Anfrage die Sitzungs kennnummer automatisch senden Sie ersparen sich damit die Miihe alle Ver kn pfungen selbst zu ndern jedoch nur wenn Sie
529. rn false fputs fp file fclose fp Assign the temporary filename to file file temp_file return file 196 Pearson Education A ADDISON WESLEY Sicherheitsaspekte function _exec_pgp_command args Create a temporary filename in the path specified as class variable temp file tempnam this gt tmp_path PGP asc Execute the PGP command command this gt pgp_bin o temp_file args exec command Open the temporary file created by PGP and read it into contents fp fopen temp_ file r if fp this gt error Could not open temporary file temp file for reading in _exec_pgp_command n return false contents fread fp filesize temp_file felose fp Delete the temporary file unlink temp_file Return the encrypted contents return contents function encrypt file my_user id to user_id file this gt _check_file file ret this gt _exec_pgp_command e u my_user_id a m file to_user_id return ret function sign file my_user_id file this gt check _file file ret this gt _exec_pgp_command s a u my_user_id wsfile return ret 197 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte function encrypt_sign file my_user id to_user_id file this gt
530. rn zug nglich Dienste Dienste haben administrative Kontrolle ber Kan le aber nicht ber das Netzwerk Sie k nnen sich nicht wie regul re Benutzer verhalten Sie ben tigen eine spezielle Anmeldeprozedur diese Ebene ist nur f r bestimmte Benutzer zug nglich und ist f r automatisierte Clients gedacht Wie Sie sehen kann die Verwaltung auf IRC Ebene ber einen Client durch gef hrt werden der separat vom Hauptchat System arbeitet Ein separater Client mit IRC Operator und Kanaloperator Status erg be die ideale Kombi nation an Funktionen die wir als Verwaltungssystem haben m ssten Im Prinzip brauchen wir zun chst nur den IRC Operator Status da der Client sobald er den IRC Operator Status erlangt hat berall den Kanaloperator 160 Pearson A ADDISON WESLEY Education Implementierung Status bekommen kann indem er alle Benutzer in einem Kanal entfernt Dies ist zwar keine sehr nette Methode aber effektiver und vielseitiger als den IRC Servercode zu korrigieren um IRC Operatoren dieselben Rechte wie Kanaloperatoren zu verleihen 3 7 Implementierung Die Chat Verwaltung sollte sich hnlich wie das Hauptchat Skript installieren lassen Dazu wird ein Bot gestartet der sich mithilfe von phpIRC im IRC anmeldet und versucht sich als IRC Operator zu registrieren Danach wartet er auf weitere Befehle von der Web Schnittstelle Diese Befehle werden wie jene in einem entfernten datenbankbasierten Prozeduraufruf aus
531. rojekte organisieren und wie Sie Programme zur Versionskontrolle nutzen Auf dem Weg zum n chsten Kapitel machen wir dann einen kurzen Halt in der Marketingabteilung und er rtern die tats chlichen Vorteile eines mehr stufigen Programms 219 Pearson A ADDISON WESLEY Education 5 Grundlegende Webanwendungsstrategien 5 1 Die PHP Normal Form Wie berpr fen Sie Ihre Formulardaten Mit JavaScript Einem zweiten Skript zur Aktionsverarbeitung M glicherweise gar nicht oder nur teil weise Wie in Kapitel 4 erl utert sollten Daten die vom Benutzer in einem Formular oder einer Anfrage geschickt wurden solange als kontaminiert betrachtet werden bis sie von Ihrem Programm berpr ft wurden Deshalb sollten Sie die Eingaben besser berpr fen Aber welches Verfahren eignet sich hierf r Eine bliche Methode ist JavaScript JavaScript sollte jedoch nie die einzige berpr fungsmethode sein die Sie verwenden Der Benutzer hat es vielleicht deaktiviert um das Sicherheitsrisiko zu vermeiden das mit der Skripterstel lung auf der Clientseite verbunden ist oder der Browser unterst tzt kein JavaScript Im schlimmsten Fall m ssen Sie damit rechnen dass Ihre Website Benutzer die JavaScript Funktionen deaktiviert haben Da es auf den Brow sern auch unterschiedliche Versionen von JavaScript geben kann sind die komplizierteren berpr fungsmethoden z B die berpr fung der Muster bereinstimmung mit regul ren Ausdruck
532. rotzdem auf der Website anmelden k nnen Cookie Variablen ber schreiben Get Variablen Wenn also der Benutzer ein Lesezeichen auf eine Seite setzt berschreibt die aktuelle Sitzung jegliche Kennnummer die in dem URL im Lesezeichen angegeben ist Wenn der Benutzer die Website schlie lich verl sst und zur ckkehrt bevor die Sitzungskennnummer aus l uft bleibt er authentisiert 362 Pearson A ADDISON WESLEY Education MarketPlayer com 8 3 7 PHP Serverintegration Da die PHP Bibliothek von MarketPlayer com permanent ver ndert wird wurde der Apache Server f r ladbare Module kompiliert und eine Shared Object Implementierung f r PHP erzeugt XML wird nicht f r die Inhalte sondern nur f r interne Konfigurationsdateien verwendet Die GNU Me chanismen autoconf und configure werden auf verschiedenen Plattformen f r Entwicklungs und Produktionstools eingesetzt Nahezu der gesamte Mar ketPlayer com Quellcode ist entweder herk mmlicher propriet rer Code oder Open Source Code Die Datenbankinfrastruktur setzt sich zusammen aus MySQL die f r die Prototypenerstellung und kleinere Aufgaben verwen det wird und Velocis f r die Kernfunktionen Die Effizienz von Velocis gegen ber anderen Datenbankl sungen muss sich noch zeigen Bisher scheint sich jedoch bei dem vorhandenen Programmcode das Netzwerkmo dell gegen ber relationalen Varianten zu behaupten Dies ndert sich viel leicht wenn die Migration auf die neue Technologi
533. rser ein XML Dokument in kleinen Teilen lesen und damit den Speicherplatz f r die Analyse reduzieren was gleichzeitig die Leistungsf higkeit steigert m ssen DOM Parser eine Darstellung des gesam ten Dokuments im Speicher erzeugen Daf r wird mehr Speicherkapazit t ben tigt Bedenken Sie dies wenn Sie mit gro en Dokumenten arbeiten Die DOM Ebene 1 0 wurde im Oktober 1998 von der inzwischen wahr scheinlich bekannten W3C Organisation als Standard W3C Empfehlung definiert M glicherweise haben Sie bereits in einem anderen Kontext vom DOM Standard geh rt Dieser Begriff wird blicherweise auch verwendet um das Objektmodell von HTML Seiten zu beschreiben auf die mit Java Script zugegriffen werden kann Um beispielsweise den Wert eines Formular feldes zu lesen k nnten Sie folgende JavaScript Programmzeile verwenden fieldvalue document myform myfield value Beachten Sie die Hierarchie in dieser Anweisung document ist das Stammele ment w hrend myform ein HTML Formular kennzeichnet in welchem myfield ein Textfeld ist Genau genommen ist das HTML DOM eine Erweiterung des Kern Dokumenten Objekt Modells das vom W3C definiert wurde Der DOM Kern enth lt die Funktionen die f r XML Dokumente verwendet wer den Au erdem dient er als Grundlage f r das HTML DOM Er besteht aus einer Sammlung von Objekten die Sie f r den Zugriff und die Bearbeitung von Daten und Auszeichnungen in einem XML Dokument benutzen k nnen Er dient z
534. rt es zu zwei Klassen von XML Parsern jene f r welche die G ltigkeit eines XML Dokuments z hlt und jene f r die dies nicht wichtig ist Parser mit G ltig keits berpr fung und Parser ohne G ltigkeits berpr fung Ein Designziel der XML Spezifikation ist die einfache Anwendbarkeit f r den Programmie rer F r einen durchschnittlichen Programmierer ist es tats chlich recht ein fach einen Parser ohne G ltigkeitspr fung zu schreiben Einen Parser mit G ltigkeitspr fung zu schreiben ist dagegen eine ganz andere Sache Die Unterscheidung zwischen g ltig und wohlgeformt unterteilt XML Anwendungen au erdem in zwei Kategorien Eine Gruppe von Anwendun gen betrachtet XML als erweitertes Datenspeicherformat Wohlgeformte Dokumente werden zur Datenspeicherung und Anzeige verwendet F r diese Aufgabe ist eine DTD nicht notwendig ein wohlgeformtes Dokument reicht aus Mit diesem Ansatz k nnten Sie Programmcodes bis zu einem gewissen Grad wiederverwenden z B k nnten Sie den Code zur Analyse der Daten und zur Erzeugung der Tags in sp teren Anwendungen wiederver wenden Sobald Sie jedoch Informationen als Informationen austauschen wollen und sie nicht mehr als reine Daten behandeln m ssen Sie dem Dokument eine Bedeutung geben und es mit einer DTD verkn pfen F r Anwendungen die sich mit der Verarbeitung und dem Austausch von Infor mationen befassen sind nur g ltige Dokumente zul ssig Nachdem Sie nun die Grundlagen von XM
535. rte Projekte Tabelle 2 1 zeigt die wichtigsten Unterschiede zwischen den beiden Ans tzen Objekte Prozeduren Vollst ndige Verschachtelung von Daten Keine Verschachtelung von Daten nur 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 gu
536. rte Syntax if file_handle die Error creating file write decoded data for i 0 i lt count output i fputs file_handle output i close file fclose file_handle Listing 2 5 Beispiel f r die Verwendung 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 w
537. ruft f r alle gedruckten Texte aus Sicherheitsgr nden so dass niemand einen b swilligen HTML Code in den Chat einf gen kann htmlspecialchars auf Der Verbindungstransformator erfasst alle URLs und Email Adressen und stellt ihnen ein lt a href gt lt a gt bzw mailto voran so dass der Benutzer im Chat Fenster die Verbindung direkt anklicken kann siehe Abbildung 3 10 154 A ADDISON WESLEY Pearson Education Schnittstelle zum Netzwerk A http www phpwebdev com 1234 phpChat_demo chat_login php3 Microsoft Internet Explorer Hail to the king baby Ele Edt View Favorites Tool Help Be e 2 2 2 12422835 38 Back Fowsd Stop Refresh Home Search Favorites History Mail Print Address http www phpwebdev com 1234 phpChat_demo chat_login php3 v Go ll Links phpChat Attempting to connect to server please be patient 25 1 2000 11 22 chris Moderator tigloo C toy Welcome to the phpChat demo installation Feel free to test everything For developer contact please write to Till Gerken till phpwebdev com This server is run by Tobias Ratschiller tobias dnet it phpChat Connected Chat ready 11 59 Joins tigloo nobody wt 11 59 11 59 12 00 12 00 Jc 12 00 12 00 lt toy gt cool Message Quit Change Nick Whols B http www phpwizard net EEE 1 0 Intemet 7 Abbildung
538. rungsschicht die in der Klasse DB_Sq class organisiert ist 6 2 1 Portierbarkeit F r einen professionellen Webanwendungsprogrammierer kann die Daten bankabstrahierung n tzlich und wichtig sein Die Basis aller Anwendungen ist das Datenmodell ein Satz von Datenstrukturen f r allgemeine Zwecke die oft in Datenbanken enthalten sind PHP unterst tzt zwar eine gro e Anzahl von Datenbanken aber jede Datenbank hat eine andere Anwen dungsprogrammschnittstellte API Wenn Sie diese datenbankeigenen APIs verwenden ist eine vom Betriebssystem und der Datenbank unabh ngige Programmierung unm glich Wenn Sie eine Anwendung von MySQL auf Oracle portieren wollen m ssen Sie mit einer gro en Anzahl von Anpassun gen rechnen es sei denn Sie verwenden eine Abstrahierungsschicht wie PHPLib Tabelle 6 1 zeigt wie Datenbankschnittstellen von System zu System variieren k nnen Beschreibung MySQL Oracle 7 Verbinden mysql_connect ora_logon Abfragen mysql_query oder ora_parse dann ora_ mysql_db_query exec Tab 6 1 APIs f r den Zugriff auf MySQL und Oracle 260 Pearson vy ADDISON WESLEY Education Datenbankabstrahierung Beschreibung MySQL Oracle 7 N chste Ergebniszeile ein oder mysql_fetch_ Arbeitet mit Offsets lesen array ora_columnname ora_getcolumn Anzahl der Zeilen in einem mysq _num_rows Nicht m glich da Oracle Ergebnis bereits Zeilen zur ckgibt bevor die G
539. rwendet werden wie etwa die Auf hebung einer Speicherzuweisung Sie bildet das Ge genst ck zu module_startup_func Bei einem Fehler w hrend der Deinitialisierung soll FAILURE zur ckge geben werden ansonsten SUCCESS Um dieses Feld als nicht benutzt zu markieren verwenden Sie NULL Zur Deklaration einer Funktion verwenden Sie das Makro ZEND_MSHUTDOWN request_startup_ func Diese Funktion wird einmal bei jeder Seitenanfrage aufgerufen und kann fur einmalige Initialisierungs schritte verwendet werden die zur Verarbeitung ei ner Anfrage erforderlich sind Ein Fehlschlagen zeigen Sie durch Ausgabe von FAILURE an ansonsten soll SUCCESS zur ckgegeben werden request_shutdown_ func Diese Funktion wird einmal nach jeder Seitenanfrage aufgerufen Sie stellt das Gegenst ck zu request_ startup_func dar Um ein Fehlschlagen anzuzeigen geben Sie FAILURE zur ck ansonsten SUCCESS Hinweis Da dynamisch ladbare Module nur bei Seitenanfragen geladen werden folgt auf die Anfragebeendigungs funktion direkt ein Aufruf der Modulbeendigungsrou tine beides wird gleichzeitig deinitialisiert Um die ses Feld als nicht benutzt zu markieren verwenden Sie NULL Zur Deklaration einer Funktion verwenden Sie das Makro ZEND_RSHUTDOWN 389 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Eintrag Beschreibung info_func Wenn phpinfo in einen Skript aufgerufen wird durc
540. s der diese Konstante enth lt beendet wird Um die Flags zu verwenden kombinieren Sie diese mit einem bin ren ODER register a new constant of type long REGISTER LONG CONSTANT NEW MEANINGFUL_CONSTANT 324 CONST CS wCONST_PERSISTENT Es gibt zwei Arten von Makros REGISTER_ CONSTANT und REGISTER MAIN _ CONSTANT Der erste Typ erzeugt Konstanten die an das aktuelle Modul gebun den sind Diese Konstanten werden aus der Symboltabelle entfernt sobald das Modul das diese Konstante registriert hat aus dem Speicher gel scht wird Der zweite Typ erzeugt Konstanten die unabh ngig vom Modul in der Symboltabelle verbleiben 421 Pearson vy ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Makro Beschreibung REGISTER LONG CONSTANT Name Registriert eine neue Konstante des Typs long Wert Flags REGISTER MAIN LONG_ CONSTANT Name Wert Flags REGISTER DOUBLE CON Registriert eine neue Konstante des Typs Double STANT Name Wert Flags REGISTER MAIN DOUBLE CON STANT Name Wert Flags REGISTER _STRING_CON Registriert eine neue Konstante des Typs String STANT Name Wert Flags Der angegeben String muss sich im internen REGISTER MAIN STRING_CON Zend Speicher befinden STANT Name Wert Flags REGISTER_STRINGL_CON Registriert eine neue Konstante des Typs String STANT Name Wert Flags Die Stringl nge ist explizit auf length gesetzt REGISTER MAIN
541. s gt item_list item quantity else this gt item_list 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 Pearson vy ADDISON WESLEY Education PHP und objektorientierte 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_list 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 ruf
542. s fortsetzen siehe Abbildung 4 3 Es erfordert zwar m glicherweise einen h heren Kosten und Zeitaufwand um ein Pro gramm zu entwickeln das von einem internationalen Publikum benutzt wer den kann aber es macht sich bezahlt denn bereits im September 1999 kamen bereits 50 der Webbenutzer nicht aus den Vereinigten Staaten Ist es selbsterkl rend Ein Programm ist selbsterkl rend wenn es dem Benutzer hilft ein System zu erlernen und zu verstehen Dies ist im Web besonders wichtig da die meisten Benutzer in Hinsicht auf Ihre Website Laien sind Sie wandern von einer Web site zur n chsten und erinnern sich in der Regel nicht an die Konventionen und Regeln Ihrer Website wenn sie diese das n chste Mal besuchen Daher sollten Sie eher Zeit darauf verwenden die Dialogfenster zu vereinfachen anstatt ein ausgefeiltes Hilfesystem f r alle Formularfelder auszut fteln Bei nicht trivialen Formularen empfiehlt sich trotzdem ein kontext sensitives Hilfesystem Wir haben bei vielen Programmen festgestellt dass es hilfreich ist dem Benutzer eine Demoversion zur Verf gung zu stellen in der er experimentie ren kann oder durch die er Schritt f r Schritt durchgeleitet wird Auch Konsistenz hilft ein Programm selbsterkl rend zu machen Wenn eine Warnung stets in der gleichen Darstellung an derselben Stelle erscheint wird der Benutzer diese leichter als Systemmeldung erkennen 4 3 2 Einfache Tauglichkeitspr fung Discount Usability E
543. sche 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 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax 111111111111111111 0000000000000000 00000000000000 00000000000000 00000000000000 00000000000000 00000000000000 00000000000000 000000000000000000 111111111111111111 D ao a SS SS eS 0 00000 00 00000 00 00000 00 00000 00 00000 00 00000 00 Mit ein wenig Vorstellungskraft sehen wir ein Rechteck aus Nullen mit einem Rand aus Einsen Wenn Sie diesen in eine Datei wie vorliegend bertragen 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
544. secure_dir Das Prinzip bleibt das gleiche Vertrauen Sie niemals Variablen die von Benutzern kommen Dies gilt natiirlich fiir alle Skriptsprachen nicht nur fiir PHP Dasselbe Loch gibt es auch in ASP tiber das Objekt FileSystem oder in Pearl bei der Ausfiihrung von benutzerdefinierten Befehlen Belastete Variablen Wir k nnen es nur noch einmal betonen Alle Daten die aus dem Benutzer raum kommen miissen als belastet nicht vertrauenswtirdig kontaminiert und potenziell bel betrachtet werden In diesem Fall befindet sich das Inter net au erhalb des Programmbereichs In Bezug auf Vertrauen wird dies als Vertrauensgrenze bezeichnet Der Anwendungsraum ist eine vertraute Umgebung das Internet nicht Die bergabe der Daten von Ihrem Programm zum Client bedarf keiner besonderen Aufmerksamkeit vorausgesetzt dass das Programm seine Daten von zuverl ssigen Systemen erh lt Das Daten banksystem sollte das gleiche Vertrauen genie en wie das Programm selbst Spezielle Vorkehrungen sind erforderlich wenn Sie sicherstellen wollen dass die Daten nur von einem speziellen Client empfangen werden oder dass der Client sicher sein kann die Daten von einer speziellen Instanz Ihrem Server zu erhalten Bei einem normalen HTTP Transfer k nnen Sie dies nicht gew hrleisten In diesem Fall sollten Sie SSL oder eine gleichwertige Ver schl sselungsschicht verwenden Bei der Weiterleitung von Daten von einer niedrigeren Sicherheitsebene zu einer
545. selung Symmetrische Verschl sselung und Verschl sselung ber ffentliche Schl ssel Symmetrische Verschl sselung Die symmetrische Verschl sselung wird auch als Verschl sselung per gehei men Schl ssel bezeichnet Sie verwendet denselben Schl ssel f r die Ver schl sselung und die Entschl sselung der Daten Der Datenverschl sse lungsstandard Data Encryption Standard DES ist ein gutes Beispiel f r diese Methode Hierbei handelt es sich um einen komplexen Algorithmus der in den 70er Jahren von IBM entwickelt und 1976 vom U S Bureau of Standards genehmigt wurde Es ist zwar relativ einfach diesen 56 Bit Algorithmus zu knacken die DES Challenge III ein Knackversuch der von der RSA Data Security gesponsert wurde ben tigte nur 22 Stunden bis die verschl sselte Nachricht dechiffriert war aber er kann trotzdem f r die Verschl sselung von nicht kritischen Daten verwendet werden Einige Daten m ssen einfach nur vor den normalen Systembenutzern versteckt werden und brauchen nicht auf kryptografisch sichere Weise verschl sselt zu werden eine Abw gung von Kosten und Nutzen Bei der symmetrischen Verschl sselung m ssen Sender und Empf nger einer verschl sselten Nachricht den geheimen Schl ssel das Passwort kennen 193 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Wenn der Nachrichtenaustausch nur zwei Teilnehmer betrifft ist dies kein Problem Aber stellen Sie sich ein System mit 100
546. sf hrli cheren Beschreibung Tags und Versionszweige CVS verwendet beispielsweise das Konzept der Tags und Zweige CVS Tags sind recht einfach zu verstehen In vorigen Beispiel haben John und Jane eifrig gearbeitet bis sie die letzte Projektstufe erreicht und Version 1 0 ihrer F API freigegeben haben Zwei Tage sp ter entdeckt ein wichtiger Kunde einen Feh ler in der API Es ist im Prinzip ein leicht zu behebender Fehler aber die Ent wickler haben die Entwicklung bereits fortgesetzt und k nnen den aktuellen Quellcode nicht als stabile Version freigeben Wenn sie den Fehler beheben wollten m ssten sie zun chst herausfinden aus welchen einzelnen Dateiver sionen die freigegebene Version besteht diese Version aus CVS auslesen und eine neue freizugebende Version erstellen Mit drei Dateien wie in unserem Beispiel ist dies vielleicht noch m glich aber bei einem Projekt das eine bedeutend gr ere Anzahl von Dateien umfasst bedeutet dies schon einen deutlichen Mehraufwand Die L sung die CVS bietet besteht darin bei Erreichen eines bestimmten Meilensteins die ge nderte Version mit einem Tag zu versehen Vor der Frei gabe kennzeichnet Jane die Dateien mit dem Namen der Freigabe jane dev home jane f api gt cvs tag rel 1 0 Wenn sie diese Freigabeversion sp ter noch einmal ben tigt braucht sie nur den Befehl cvs checkout mit diesem Tag ausgeben jane dev home jane f api gt cvs checkout r rel 1_0 f api Und schon h
547. sich an Plattformkonventionen Fehlervermeidung Besser als gute Fehlermeldungen ist ein sorgf ltiges Konzept das in erster Linie verhindert dass ein Problem auftritt Erkennen statt Erinnern Gestalten Sie Objekte Aktionen und Optionen deutlich erkennbar Der Benut zer sollte sich nicht Daten von einem Teil eines Dialogs bis zum n chsten mer ken m ssen Anweisungen f r die Bedienung eines Systems sollten sichtbar oder zumindest leicht aufzurufen sein Flexible und effiziente Verwendung Beschleuniger die der Laie nicht sieht k nnen die Interaktion f r den erfahre nen Benutzer h ufig beschleunigen so dass das System erfahrene und uner fahrene Benutzer bedienen kann Erm glichen Sie dem Benutzer h ufig ver wendete Aktionen auf seine Bed rfnisse anzupassen sthetisches und minimalistisches Design Dialoge sollten keine Informationen enthalten die irrelevant sind oder selten gebraucht werden Jede zus tzliche Informationseinheit in einem Dialog lenkt die Aufmerksamkeit von den relevanten Teilen ab Hilfe f r Benutzer zum Erkennen und Beheben von Fehlern Fehlermeldungen sollten als Klartext nicht Programmcode ausgegeben wer den das Problem genau benennen und eine konstruktive L sung vorschla gen 216 Pearson A ADDISON WESLEY Education Zusammenfassung Hilfe und Dokumentation Es ist zwar besser wenn das System ohne Dokumentation genutzt werden kann aber manchmal kann es notwendig sein eine Hilfe
548. so einfacher und schneller geht und seine Ergebnisse umso besser sind je besser die Ergebnisse der physikalischen Analyse sind Die logische Analyse kann fehlende Informationen aus der physikalischen Analyse kompensieren wenn auch nur in begrenztem Ma e NehmenSiezumBeispieldiesenSatzwennSieihnlesenk nnenfunktioniertIhrlogischer Analysatorsehrgut Wahrscheinlich k nnen Sie obigen Satz lesen aber Sie brauchen l nger und m ssen sich st rker konzentrieren als bei den brigen S tzen in diesem Buch F r den ersten Schritt der Analyse fehlen wichtige Informationen die Leer zeichen und das sind Sie nicht gewohnt Wir k nnen ihn vereinfachen indem wir einige Satzzeichen hinzuf gen NehmenSiezumBeispieldiesenSatz wennSieihnlesenk nnen funktioniertIhrlogischerAnalysatorsehrgut F r den physikalischen Analysator sind die Satzzeichen n tzliche Informatio nen Beachten Sie dass sich diese Version sehr viel leichter lesen l sst und Sie einfacher eine beliebige Stelle fokussieren k nnen Zum n chsten Schritt Nehmen Sie zum Beispiel diesen Satz wenn Sie ihn lesen k nnen funktioniert Ihr logischer Analysator sehr gut Dies ist die bliche Leseweise f r einen Satz so wie Sie ihn auf nat rliche Weise wahrnehmen Wir k nnen den Satz noch weiter strukturieren Nehmen Sie zum Beispiel diesen Satz wenn Sie ihn lesen k nnen funktioniert Ihr logischer Analysator sehr gut Dies ist ein Beispiel f r die extrem
549. son A ADDISON WESLEY Education 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 handle PNGs here break case FT ZIP ARCHIVE handle ZIPs here break 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
550. spiel aus Kapitel 2 Erweiterte Syntax PHPLib verwendet dieselben Konzepte Hinweis Bei PHP 4 0 ist dieser Umweg nicht mehr erforderlich PHP 4 0 besitzt Funktionen wie get_class und get _parent_class die eine bes sere Introspektion der Klassen erm glichen serialize funktioniert inzwischen f r Objekte transparent 6 2 9 Session Beispiel F r Ihre t gliche Arbeit ist die Verwendung von PHPLib Session Objekten genau so einfach wie die Verwendung der PHP 4 0 Session Bibliothek Das Beispiel in Listing 6 3 zeigt dies sehr deutlich Es tut dasselbe wie das Beispiel in Kapitel 4 Create a new instance manually sess new Example Session Start the session sess gt start Register our session variable sess gt register counter 267 Pearson A ADDISON WESLEY Education 6 Datenbankzugriff mit PHP Init the counter if isset counter Output session ID and counter printf Our session ID is s lt br gt sess gt id print The counter value is counter counter 0 Increment the counter counter Save the session state sess gt freeze Listing 6 3 Ein einfaches Beispiel fiir die Verwendung der PHPLib Klasse Session Der einzige signifikante Unterschied zwischen diesem Beispiel und dem PHP 4 0 Beispiel besteht darin dass PHPLib einen objektorientierten Ansatz verfolgt Genau wie die PHP 4 0 Session Bibliothek verwendet PHPLib Speichermo dule
551. spiel f r eine aussagekr ftige Protokollnachricht ist folgende Fixed bug 42 implemented additional checks on user data int date see spec p25 Im Gegensatz zu anderen Versionskontrollsystemen wie RCS oder Micro soft s Visual Source Safe sperrt CVS die Dateien nicht sobald Sie diese abge meldet haben Dies bedeutet dass mehrere Entwickler dieselbe Datei gleich zeitig bearbeiten k nnen was in unseren Augen ein gro er Vorteil ist In unserem Szenario k nnten sowohl John als auch Jane die Datei config inc php3 gleichzeitig bearbeiten Sobald John eine Datei wieder im Sys tem anmelden m chte die von Jane bereits ge ndert und zur ckgeschickt wurde erh lt er eine Warnung und muss seine lokale Kopie aktualisieren bevor er die Datei zur ck bertragen kann In einfachen F llen z B wenn John eine Funktion zu Beginn und Jane eine Funktion am Ende der Datei bearbeitet haben wird CVS die beiden Versionen automatisch vermischen und John kann die kombinierte Version sofort zur ckschicken In anderen Situationen ist eine automatische Vermengung vielleicht nicht m glich Neh men wir beispielsweise folgende Originalzeile aus einer Konfigurationsdatei define FT ZIP ARCHIVE ZIP_ARC GZip Archive John ndert die Konstante und schickt die Datei zur ck define FT_ZIP ZIP_ARC GZip Archive Jane verbessert den Kommentar in derselben Zeile define FT ZIP_ARCHIVE ZIP_ARC GZip Archive not PkZip
552. sschau h lt Das Verfahren das daraus besteht periodisch anzuhalten und zu pr fen ob ankommende Daten vorhanden sind nennt sich Polling Es ist die bevorzugte Methode in phpChat phpIRC unterst tzt freie R ckrufe Diese werden immer dann aufgerufen wenn phpIRC nichts zu tun hat und einfach darauf wartet dass etwas auf dem Netzwerk passiert Wir k nnen nach einem Signal 146 Pearson vy ADDISON WESLEY Education Schnittstelle zum Netzwerk suchen indem wir diesem Ereignis eine Verarbeitungsroutine zuteilen Wie sollen wir jedoch etwas signalisieren Im Prinzip ist das sehr einfach wenn wir eine der folgenden Methoden verwenden Einen Flag in einer Datenbank setzen Eine Sperrdatei im Dateisystem erzeugen Synchronisierungsbefehle verwenden Einen Flag im Shared Memory setzen Im Prinzip sind dies die Methoden die wir in PHP einsetzen k nnen um eine Nachricht zu hinterlassen In den folgenden Abschnitten gehen wir auf die einzelnen Verfahren n her ein Pipes k nnen f r die prozess bergreifende Kommunikation nicht verwendet werden da f r eine Pipe zwei Prozesse gleichzeitig ausgef hrt werden m s sen Unsere Situation erfordert dass ein st ndig laufender Prozess von ande ren kurzfristigen Prozessen angesprochen wird Hinweis Nat rlich gibt es auch exotischere Verfahren wie etwa das Ver schicken von Emails zwischen Prozessen Wir haben dies zwar schon gese hen m chten aber hier nicht auf diese Option eing
553. st die Sitzungskennnummer ein Teil des Pfads zum Skript und f r Suchma schinen und Spider wirkt die URL wie eine statische Seite Dies funktioniert weil der Webserver wei dass page php3 ein Skript ist und in der URL nicht 169 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte nach weiteren Dateien sucht Damit ist die Sitzungskennnummer aber nicht mehr automatisch in Ihrem PHP Skript verf gbar Um auf sie zuzugreifen m ssen Sie den Pfad selbst analysieren function session_start_from_path global HTTP_HOST REQUEST URI ereg 0 9a z 32 REQUEST URI regs session_id regs 1 if lisset session_id empty session_id srand double microtime 1000000 session id md5 uniqid rand destination http HTTP_HOST REQUEST_URI session_id header Location destination session _id session_id session _start 7 Amazon com Earth s Biggest Selection Netscape E l x Eile Edit View Go Communicator Help Hi u Bookmarks A Netsite http www amazon com exec obidos subst home home html 002 6234264 9903468 M il What s Related px Ey vour account HELP at BOOKS MUSIC VIDEO TOYS amp GAMES ELECTRONICS e CARDS AUCTIONS HOWTO GIFT OUR SITE ORDER l SERVICES GUARANTEE GUIDE Lo Ey Wednesday September 29 1999 weLcomE To Al Products aa amazon com amp Hello Tobias Ratschiller If you re not Tobias Ratschiller c
554. stische Auswertung 215 Lautes Denken 214 Szenarien 214 Template Klasse Daten berpr fung 293 Text Knoten DOM 330 thread sichere Version 367 Timestamps 58 track_vars 177 Trefferzahler selbstmodifizierender Code 287 Trust Management 206 TSRM Verzeichnis 372 Typenkonvertierung Argumente 399 U Uberladen von Objekten 422 Uberpriifung von E Mail Adressen 224 von Zeichenketten 223 Upstream Kommunikation 145 URL automatisch umschreiben 172 manuell ndern 169 A ADDISON WESLEY Stichwortverzeichnis Vv variable Anzahl von Argumenten 396 variable Argumentelisten 112 variable Funktionsnamen 116 variable Parameter in Funktionen 49 variable Variablennamen 114 Variablen erzeugen 407 GET 191 globaler 47 lokale 47 POST 191 Sitzungsvariablen 177 sprechende Namen 33 47 variable Namen 114 Verschliisselung mit geheimem Schliissel 193 mit Mcrypt Funktionen 193 mit ffentlichem Schl ssel 194 mit PGP 195 symmetrische 193 Versionszweige 240 Verzeichnis dl 372 ext 372 php 4 372 TSRM 372 Ww WDDxX Web Distributed Data eXchange 287 340 WDDx Paket 341 Web Distributed Data eXchange WDDX 287 341 webbasierte Emails 349 Wild Karl Heinz Sitzungsverwaltung 258 WinCVS Utility 233 239 Wireless Markup Language WML 307 WML Wireless Markup Language 307 wohlgeformte versus giiltige Dokumente 313 x XML Extensible Markup Language 287 302 XML Dokumente 333 443 Pearson Educati
555. stlegt 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 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 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax Hinweis Seit PHP 4 0 sind f r 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 hinzuzuf gen 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_list item quantity function drop item quantity if this gt item_list item gt quantity thi
556. strebenswert halten Warum hat mcrypt_cbc ein Argument das definiert ob Daten verschl sselt oder entschl sselt werden W re es nicht logischer und konsistenter daf r zwei Funktionen mcrypt_encrypt_cbc und mcrypt_ decrypt_cbc zu verwenden Es gibt auch kein session_var mit dem Argu ment REGISTER oder UNREGISTER Genug der N rgelei Immerhin k nnten wir einfach die Quelle f r die Mcrypt Schnittstelle bearbeiten und diese zus tzlichen Funktionen definie ren Dies ist der Vorteil einer Open Source Software Zur ck zum Thema Das Beispiel in Listing 4 5 zeigt die Mcrypt Funktion in Gebrauch Das Beispiel durchl uft mehrfach ein Array das alle m glichen Mcrypt Algorithmen ent h lt und verschl sselt mit jedem Algorithmus eine Nachricht Set up an array of algorithms generally supported by Mcrypt algorithms array CRYPT BLOWFISH CRYPT _DES CRYPT _TripleDES CRYPT ThreeWAY CRYPT GOST CRYPT CRYPT CRYPT DES _COMPAT CRYPT SAFER64 CRYPT SAFER128 CRYPT _CAST128 CRYPT_TEAN CRYPT_RC2 CRYPT TWOFISH CRYPT TWOFISH128 CRYPT TWOFISH192 CRYPT TWOFISH256 CRYPT _RC6 CRYPT IDEA I message Hello PHP world Message to be encrypted 200 A Pearson vy ADDISON WESLEY Education Sicherheitsaspekte secret Secret password Secret key for i 0 i lt count algorithms i If this algorithm is available algorithms i is a
557. struktur 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 Ihr 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 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax Abbildung 2 9 zeigt wie die Baumbibliothek die Baumknoten in einem Array intern verwaltet Abbil
558. t Einen Bit l schen Sie am einfachsten indem Sie zun chst sicherstellen dass es gesetzt ist und es anschlie end umkehren Dazu ben tigen Sie zwei Bitopera toren INVERS und UND value amp value Mit folgender Zeile k nnen Sie das erste Bit des Wertes 3 l schen value 3 value amp 2 berpr fen eines Bit Um zu berpr fen ob ein Bit in einem Wert gesetzt ist verwenden Sie den logischen UND Operator Er vergleicht zwei Werte Wenn beide Bits Eins sind gibt er Eins zur ck Um beispielsweise zu berpr fen ob das erste Bit im Wert 3 gesetzt ist w rden Sie folgende Zeile verwenden if 2 amp 3 more code Bitweise Verschiebung Um Bits nach links oder rechts zu verschieben verwenden Sie die Verschiebe operatoren lt lt und gt gt Wenn Sie beispielsweise den Bin rwert 1 um bin r 1 Stelle nach links verschieben erhalten Sie den Bin rwert 10 0000001 lt 0 000001 0000010 Dies kann n tzlich sein um Bits zu setzen wie wir sp ter im Beispiel zeigen werden Operatorrangfolge Es ist gar nicht schlecht sich einmal die Rangfolge bei bitweisen Operatoren anzusehen Bedenken Sie dass arithmetrische Operatoren Vorrang vor bit weisen Operatoren haben Die Anweisung 1 2 3wird ausgewertet als 1 2 3 Sie sollten auch nicht vergessen dass die bitweisen Operatoren den Vergleichoperatoren nachgestellt sind H ten Sie sich also davor Anweisun gen wie if 2 amp 3 0 zu schreiben Ans
559. t Jedes Teammitglied geht den Programmcode Zeile f r Zeile durch und versucht zu verstehen was jede einzelne Zeile tut Alle gefundenen Fehler werden notiert 3 Der Moderator sammelt die Notizen ein und leitet sie an den urspr ngli chen Programmentwickler weiter der nicht Teil des Pr fteams sein sollte Die berarbeitung kann daraus bestehen dass der Programmcode ge n dert wird Kommentare hinzugef gt oder gel scht werden Funktionen neu strukturiert oder umgebettet werden usw Wir bezeichnen dies als die einfache Software Inspektion Discount Software Inspection Bei der traditionellen Softwareentwicklung nimmt die berpr fung einen sehr viel gr eren Raum ein Fagan Inspection das urspr nglich von Michael Fagan bei IBM 1976 l entwickelt wurde ben tigt gr ere Vorbe reitung ausf hrlichere Pr flisten und h ufigere Meetings Die Entwicklung von Webanwendungen hnelt der raschen Entwicklung von Prototypen da eine schnelle Markteinf hrung von wesentlicher Bedeutung ist Pr fverfah ren die zu zeitaufwendig und ressourcenintensiv sind haben f r die Praxis keine Bedeutung 203 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte 4 2 4 Authentisierung Sie werden bald feststellen dass Sie eine Technik immer wieder brauchen Authentisierung Wenn Ihre Benutzer beispielsweise nur dann auf einige Teile Ihrer Website zugreifen d rfen nachdem sie sich selbst im System eingetra gen haben brauchen
560. t 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 object 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 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax Funktion Beschreibung bool method_exists Pr ft ob die in method genannte Funktion object object string me tats chlich ein Mitglied von object ist thod bool class_exists Pr ft ob classname eine tats chlich definierte string classname Klasse ist bool is_subclass_of Pr ft ob object eine Unterklasse von object object string class classname ist name 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 si
561. t 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 ngt dies von Ihren Zielen und der Plattform ab auf der Sie arbeiten In unserem Fall ist die Plattform 75 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax PHP PHP unterst tzt nat rlich Objekte jedoch auf eine sehr spezielle Weise Dies h ngt damit zusammen wie der Interpreter Variablen handhabt 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 m
562. t einem Onlineshop verkn pft in welchem sich Besucher B cher zum Thema Jobhun ting bestellen konnten Der Shop wurde von einem unabh ngigen Auftrag nehmer entwickelt der bereits mehrere andere Onlinegesch fte entwickelt hatte die alle auf seinen Pearl Skripten basierten Hiervon hat er auf seiner Website ein Demo zur Verf gung gestellt einschlie lich wichtiger Teile des Quellcodes Jedes Mal wenn ein Besucher einen Artikel bestellte wurde eine reine Textdatei erstellt die alle Bestelldaten enthielt selbst Kreditkartendaten und das alles unverschl sselt Nicht genug dass die Dateien auf einem f r jedermann sichtbaren Verzeichnis auf dem Webserver abgelegt waren um es den Website Managern einfacher zu machen wie er uns erz hlte Das Ver zeichnis wurde nur dadurch gesch tzt dass es in der Apache Konfigura tion als nicht browserf hig deklariert wurde Da die Dateinamen nach einer Standardnamenskonvention der Form yyyy dd mm hh mm ss txt benannt wurden w re es f r einen Hacker kein Problem ein Skript zu schreiben um Dateien zu suchen Beispiel 2 Network Solutions die f r lange Zeit einziger Dom nenbesitzer waren beschlossen im September 1999 ihren bevorzugten Kunden einen freien Web Mailaccount zur Verf gung zu stellen Sie schufen f r jedes Konto einen Benutzernamen sowie ein Passwort und sandten es den entsprechen den Kunden zu Der Benutzername bestand aus dem Nachnamen des Kun den doe und
563. t es sich hierbei um ein Pro tokoll f r objektorientierte Prozedurfernaufrufe die f r verteilte modulba sierte Systeme n tzlich sind Auf Win32 Systemen funktioniert PHP 4 0 sowohl mit COM als auch mit DCOM Auf anderen Systemen auf denen COM verf gbar w re wie etwa Apple oder Solaris funktioniert es leider noch nicht Der Aufruf der D COM Elemente ist mit PHP 4 0 recht einfach COM ist ein reservierter Klassenname von dem Sie eine Instanz erstellen k nnen indem Sie den Namen des Steuerelements an den Konstruktor bergeben Damit erhalten Sie eine vollst ndige Instanz des COM Objekts mit dem Sie Funktio nen ausf hren oder Eigenschaften setzen bzw lesen k nnen so als ob es sich um eine PHP Klasse handelte Bei Parametern die sich nicht mit der PHP Syntax ausdr cken lassen weil sie beispielsweise einen Punkt oder ein ande res in PHP ung ltiges Zeichen enthalten k nnen Sie sich mithilfe der fol genden Funktionen behelfen bool com set class com object string property_name string property_ value Ordnet einem Parameter des COM Objekts das in com_object instantiiert wurde einen Wert zu Aliase f r diese Funktion sind com propset und com_propput Gibt bei erfolgreicher Zuordnung true zur ck ansonsten false mixed com get class com object string property_name Gibt den Wert eines Parameters des COM Objekts aus das in com object instantiiert wurde Alias f r diese Funktion ist com_propget Gibt entwe
564. t phpChat sobald es vollst ndig eingerichtet ist die Initialisierungstabelle und ruft die Initialisierungsfunktion jedes Plugin auf das sich selbst angemeldet hat Beim Verbindungsabbau durchl uft es entsprechend die Deinitialisierungstabelle Mit diesem Verfahren wird den Plugins signalisiert dass sie sich aktivieren bzw deaktivieren sollen Um im Programm n tzlich zu sein bietet phpChat eine Reihe von Ereignis sen an die sich jedes Plugin anh ngen kann W hrend der Initialisierung for dert jedes Plugin PHP auf ihm eine Reihe von gew nschten Ereignissen zu schicken Ein Ereignis kann der Leerlauf des Chats die Weiterleitung einer neuen Nachricht des Benutzers das Klicken auf einen Benutzernamen in der Liste der Benutzernamen oder eine vom Netzwerk ankommende Nachricht sein und vieles mehr Zur Laufzeit k nnen die Plugins diese Ereignisse abfangen und bestimmte Auf gaben ausf hren Das Uhrzeit Plugin meldet sich beispielsweise beim Leer lauf Ereignis an und berpr ft in bestimmten Abst nden die Systemzeit Nach einer vordefinierten Anzahl von Minuten teilt es dem Benutzer die Zeit mit F r die meisten Ereignisse sendet phpChat auch Parameter wie etwa den Nachrichtentext bei ankommenden Nachrichten Diese k nnen von den Plugins ge ndert werden Zu den in Listing 3 3 aufgef hrten Plugins geh ren beispielsweise die Plugins html specialchars und 1ink_transform Sie ndern die Ausgabe der Nachrichten htmlspecialchars
565. t zugreifen Wenn Sie eine h here Leistung ben tigen ist das Modul m eine gute Alterna tive Es speichert die Daten im Shared Memory und ist daher nicht durch das Ein Ausgabewerk der Hardware begrenzt Das letzte Modul user wird intern verwendet um R ckruffunktionen auf Benutzerebene durchf hren zu k nnen die Sie mit session_set_save_handler definieren Das wahre Potenzial liegt in der F higkeit Benutzerr ckrufe als Speichermo dule zu spezifizieren Da Sie Ihre Funktionen so schreiben k nnen dass sie Sitzungen verwalten und sich trotzdem auf die standardisierte PHP API ver lassen k nnen k nnen Sie Sitzungen speichern wo und wie Sie wollen in einer Datenbank wie MySQL in XML Dateien oder auf einem entfernten FIP Server okay letzterer macht keinen Sinn aber Sie verstehen was wir meinen Die Funktion session_set_save_handler hat sechs Argumente in Form von Zeichenfolgen Diese fungieren als Ihre R ckruffunktionen Die Funktion hat demnach folgende Syntax void session_set_save_handler string open string close string read wstring write string destroy string gc Serialisierung von Daten Serialisierung bezeichnet die Umwandlung von Variablen in eine Byte Code Darstellung Diese kann tiberall als normale Zeichenkette gespeichert wer den Ohne diese Funktion w re es beispielsweise nicht m glich PHP Arrays in einer Datenbank zu speichern Die Serialisierung von Daten ist sehr n tz lich um Daten tiber mehrer
566. tatt zu testen ob das zweite Bit im Wert drei gesetzt ist es ist berpr ft die Anweisung zun chst 3 0 und gibt true zur ck was zu 2 amp 1 f hrt Dadurch wird 0 zur ckgegeben was definitiv nicht das ist was Sie wollten 282 Pearson A ADDISON WESLEY Education Authentisierung Beispiel Kehren wir zu unserem Hobby Beispiel zur ck Angenommen der Benutzer kann zwischen vier verschiedenen Hobbys w hlen Lesen Programmieren Schreiben und Wandern Zun chst ordnen wir jedem Hobby ein Bit zu Lesen 1 Programmieren 2 Schreiben 4 Wandern 8 In der Bin rschreibweise werden die Werte folgenderma en dargestellt Lesen 0000001 Programmieren 0000010 Schreiben 0000100 Wandern 0001000 WN Im Programmcode k nnen bung definieren define HOBBY READING 1 lt lt 0 define HOBBY PROGRAMMING 1 lt lt 1 define HOBBY WRITING 1 lt lt 2 define HOBBY HIKING 1 lt lt 3 ie die Hobbys durch eine einfache Bitverschie Wenn der Benutzer nun die Hobbys Schreiben und Programmieren w hlt k nnen Sie ein Bitmuster erstellen indem Sie die beiden Werte in ODER Schreibweise miteinander verkn pfen pattern HOBBY_WRITING HOBBY PROGRAMMING Sp ter k nnen Sie berpr fen ob der Benutzer als Hobby Schreiben gew hlt hat indem Sie das zugeh rige Bit im Bitmuster berpr fen printf Writing s chosen HOBBY WRITING amp pattern is is not Um das Schreib Bit auf Null z
567. te Frames oder JavaScript Umleitungen enthalt miissen Sie auch diese andern Die Anderung der URL hat mehrere Nachteile Sie bedeutet einen betrachtlichen Mehraufwand fiir Sie als Entwickler Sie m ssen die Sitzungskennnummer f r alle Verkn pfungen manuell hinzu f gen Wenn Sie nur eine einzige Verkn pfung vergessen haben geht die Sitzung des Benutzers verloren Es zeigt dass Ihre Seiten dynamisch erstellt werden Einige Suchmaschi nen werden sich weigern die Seiten berhaupt zu indizieren Andere schneiden alles nach dem Fragezeichen von der URL ab Die Sitzungskennnummer wird in den Lesezeichen und Ausdrucken des Benutzers hinzugef gt Wir kennen sogar Artikel in technischen Fachzeit schriften in denen die Sitzungskennnummer einer Website als Teil einer Referenz angegeben wurde Vom Standpunkt der Benutzerfreundlichkeit l sst sich sagen dass es f r Benutzer schwieriger ist die URL manuell zu ndern um bestimmte Ressourcen auf einer Website zu finden Die Sitzungskennnummer wird in den Proxy Servern protokolliert und ist in der CGI Umgebungsvariablen HTTP_REFERER f r andere Websites sichtbar 4 1 4 Dynamische Pfade Lassen Sie uns sehen ob wir einige der Nachteile vermeiden k nnen die sich bei der Neuschreibung der URL ergeben Zun chst k nnen Sie die ID Ihrer URL in der Amazon com Weise hinzuf gen siehe Abbildung 4 1 Diese sehen dann so aus http server com page php3 lt session id gt Auf diese Weise i
568. te zu einer seltsamen Mischung In Ihren blichen Briefwechseln verwenden Sie vermutlich keine Mischung aus Englisch Fran z sisch Spanisch oder hnliches Warum sind Sie dann nicht auch bei der Programmierung konsequent und verwenden in PHP englische Namen Dies hilft auch anderen zu verstehen was Sie geschrieben haben 1 3 5 Generieren von klaren und konsistenten Schnittstellen Es geht Ihnen vielleicht auf die Nerven schon wieder das Wort konsequent zu h ren aber f r die Entwicklung von Schnittstellen ist Konsequenz das A und O Leider ist ein Negativbeispiel in PHP nicht greifbar Beim Auto befindet sich das Gaspedal auf der rechten und die Bremse auf der linken Seite Wenn Sie sich ein neues Auto kaufen erwarten Sie dass es genau dieselbe Anordnung hat Sie erwarten dass eine rote Ampel Stop und eine griine Ampel Freie Fahrt bedeutet Genauso ist es bei der Datenverarbei tung Angenommen Sie benutzen eine Bibliothek um auf Dateien zuzugrei fen und verwenden fiir jede Funktion eine andere Dateibearbeitungsroutine Es w re seltsam wenn die Funktion die zum Einlesen der Datei dient die Routine als ersten Parameter erwartet w hrend die Schreibfunktion sie als letzten Parameter und die dritte Funktion sie irgendwo in der Mitte der Para meterliste erwartet 50 Pearson A ADDISON WESLEY Education Kodierungskonventionen Bei der Entwicklung einer Schnittstelle sollten Sie zun chst folgende Punkte
569. ten Websites Durch die integrierte Unterst tzung f r Sitzun gen XML Java und COM sowie eine Reihe weiterer Funktionen k nnen Web Entwickler leichter als jemals zuvor noch leistungsf higere dynamische Web sites entwickeln Durch die kontinuierliche Entwicklung und Integration f hrender Technolo gien bleibt PHP stets aktuell Die neue Java und DCOM Unterst tzung die erweiterten XML Funktionen und die verbesserten OOP Funktionen erh hen die Akzeptanz von PHP in der Gesch ftswelt und machen es zu einem wert vollen Werkzeug f r die Datenverarbeitung im Unternehmen Die kommerzi ellen AddOns von Zend Technologies zum Beispiel Debugger DIE und Compiler brachte die Firma einen weiteren Schritt voran Auch das Innenle ben der PHP 4 0 Architektur wurde revolutioniert was jedoch die meisten Endbenutzer nicht bemerken werden Die Webserver Schnittstelle wurde bei spielsweise vollst ndig abstrahiert so dass auch andere Web Server als Apa che unterst tzt werden k nnen B cher wie dieses versorgen Sie mit den not wendigen Hintergrundinformationen damit Sie diese neuen Technologien erfolgreich einsetzen k nnen 18 Pearson A ADDISON WESLEY Education Vorwort von Zeev Suraski Nach meiner Ansicht sieht die Zukunft f r Open Source im Allgemeinen und PHP im Besonderen sehr gut aus 1997 mussten Sie durch Reifen springen um Ihren Gesch ftsf hrer davon zu berzeugen dass Linux mindestens so stabil ist wie Windows NT
570. ten erfolgreich aus dem Ring geworfen hat und bewies dass es in der Praxis durchaus als leistungsf higes Werkzeug taugt Angesichts der schnell wachsenden Anzahl von Servern auf denen PHP inzwischen l uft und des riesigen Schritts den PHP von der Version 3 zur Version 4 gemacht hat glauben wir dass PHP nun das erreicht hat auf was es abzielte Es ist ein hervorragendes Werkzeug zur raschen Entwicklung von stabilen und schnel len Skriptl sungen geworden 8 5 Referenzen 1 Die Umfrage finden Sie unter www netcraft com survey 364 Pearson A ADDISON WESLEY Education Teil 3 Uber die Grenzen von PHP hinaus Pearson A ADDISON WESLEY Education Pearson vy ADDISON WESLEY Education Erweiterung von PHP 4 0 Knacken wir den PHP Kern Jene die wissen reden nicht Jene die reden wissen nicht Manchmal ist PHP wie vorliegend einfach nicht genug F r den durch schnittlichen Benutzer wird dieser Fall wohl eher selten auftreten aber pro fessionelle Anwendungen bringen PHP an die Grenzen seiner Leistungsf higkeit in Bezug auf Geschwindigkeit oder Funktionalit t Aufgrund von Sprachbeschr nkungen und Unvertr glichkeiten die auftreten wenn Sie mit einer sehr gro en Bibliothek aus Standardcode arbeiten die an jedes einzelne Skript angeh ngt wird k nnen neue Funktionen nicht immer direkt imple mentiert werden Deshalb muss eine andere Methode gefunden werden um diese potentielle M ngel in PHP zu besei
571. ten 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_tree start_node node start_node print Value is node gt value lt br gt 78 Pearson vy ADDISON WESLEY Education 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
572. ter zu implementieren ben tigen Sie drei Teile den Interpreter Teil der den Eingabecode analysiert bersetzt und aus f hrt den Funktionalit ten Teil der f r die Funktionalit t der Sprache seine Funktionen usw zust ndig ist und den Schnittstellen Teil der mit dem Webserver spricht usw Webserver Software Module MySQL Oracle ODBC XML IMAP LDAP Java COM weitere d A 1 ae Zend Engine Funktionsmodul Schnittstelle EXECUTOR LAUFZEIT COMPILER Abbildung 9 1 Die interne Struktur von PHP Datenbank Webserver Platte 368 Pearson vy ADDISON WESLEY Education Erweiterungsm glichkeiten Zend bernimmt den kompletten Teill und einen Teil von Teil 2 PHP umfasst die Teile 2 und 3 Zusammen bilden sie das vollst ndige PHP Paket Zend selbst bildet nur den Sprachkern der PHP mithilfe von einigen vordefi nierten Funktionen in seiner grundlegendsten Form realisiert PHP enth lt alle Module welche die hervorragenden F higkeiten der Sprache realisiert Die folgenden Abschnitte beschreiben an welchen Stellen PHP erweitert wer den kann und wie dies geschieht 9 3 Erweiterungsmoglichkeiten Wie in Abbildung 9 1 gezeigt kann PHP haupts chlich an drei Punkten erwei tert werden an den externen Modulen den eingebauten Modulen und an der Zend Engine Diese Option werden in den folgenden Abschnitten er rtert
573. that is meant to be made available to PHP ZEND_FUNCTION first_module zval parameter if ZEND_NUM_ARGS 1 zend_get_parameters ex 1 amp parameter gt SUCCESS WRONG_PARAM_ COUNT convert_to_long_ex parameter RETURN _LONG parameter gt value 1val Listing 9 3 Eine einfache Erweiterung Dieser Code enthalt ein vollstandiges PHP Modul Wir werden auf den Quell code in K rze ausf hrlich eingehen zun chst m chten wir aber den Erstel lungsprozess erl utern Dies gibt den Ungeduldigen die Gelegenheit zu experimentieren bevor wir in die API Diskussion einsteigen 9 7 Kompilierung von Modulen Module k nnen prinzipiell auf drei Arten kompiliert werden ber den bereitgestellten make Mechanismus im Verzeichnis d1 ber den bereitgestellten make Mechanismus im Verzeichnis ext ber das auch dynamisch ladbare Module erstellt werden k nnen oder durch manuelle Kompilierung der Quellen Die zweite Methode sollte definitiv favorisiert werden da PHP 4 0 sie in einem anspruchsvollen Erstellungsprozess standardisiert hat Die Tatsache dass er so anspruchsvoll ist ist auch sein Nachteil Er ist zun chst etwas schwierig zu verstehen Eine ausf hrlichere Einf hrung erhalten Sie sp ter in diesem Kapitel zun chst arbeiten wir mit den Standarddateien 379 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern Der im Verzeichnis d enthaltene
574. the counter exceed the threshold if current_count COUNTER THRESHOLD it does flush cache and restart outputL chr current_count outputL current_byte current_counter 0 else bytes don t match do we have a cached pair if current_count gt 1 yes we do write it outputL chr current_count 107 Pearson A ADDISON WESLEY Education 2 Erweiterte Syntax output 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 output chr 1 output 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 Pearson A ADDISON WESLEY Education Assoziative Arrays indicate failure return 0 test if this is literal data if ord data_element gt COUNTER_THRESHOLD this is literal data return count
575. tialisierungsfunktionen 390 429 Internet Relay Chat IRC 132 IP Adresse Zugriff 168 IRC Internet Relay Chat 132 134 IRC Verwaltung durch Dienste 160 durch IRC Operatoren 160 durch Kanaloperatoren 160 J Java im Vergleich zu PHP 255 JavaScript Uberpriifung von Formulardaten 220 Joganic John E MarketPlayer com 359 K Kanaloperatoren IRC Verwaltung 160 Klasse CT_Dbm 269 CT_Ldap 269 CT_Shm 269 CT_Split_Sql 269 CT_Sql 268 DB_Sql 270 PHP 3 0 versus PHP 4 0 80 PHP im Vergleich zu PHP 293 Knoten Attr 330 CDATASection 330 Document 329 330 DocumentFragment 329 DocumentType 329 Entity 330 EntityReference 330 freie 91 ProcessingInstruction 330 Text 330 unterbrochene Verkn pfungen 92 Koehntopp Kristian Entwicklung von PHPLib 258 Kommentare 311 eingebettete 45 A ADDISON WESLEY Stichwortverzeichnis im Datei Header 41 im Funktions Header 44 im Modul Header 43 komplexe Typen 422 Konstanten siehe auch definierte Werte 403 421 Konstruktoren objektorientierte Programmierung 422 kontextfreies Protokoll 166 L Laufvariablen 105 Lautes Denken 214 LDAP Lightweight Directory Access Protokoll Server 269 LibXML Funktionen 287 332 Lightweight Directory Access Protokoll LDAP 269 local inc Datei PHPLib 270 logische Analyse des Textes 36 Longs Variablen 411 M Makefile in Datei 376 MarketPlayer com 359 Mcrypt Funktionen 193 200 mehrstufige Anwendungen 249 Metad
576. tierte Funktionen sowie php h enthalten 9 10 3 Deklaration exportierter Funktionen Um Funktionen zu deklarieren die exportiert werden sollen d h f r PHP als neue direkte Funktionen verf gbar machen bietet Zend eine Reihe von Makros Eine Deklaration sieht z B folgenderma en aus ZEND_FUNCTION my_ function ZEND FUNCTION deklariert eine neue C Funktion die mit der internen API von Zend bereinstimmt Das bedeutet dass die Funktion den Typ void hat und als Parameter INTERNAL_FUNCTION_PARAMETERS ein weiteres Makro akzeptiert Zus tz lich wird dem Funktionsnamen das Pr fix zend_if vorangestellt Die sofort expandierte Version der oben definierten Funktion sieht folgenderma en aus void zend_if_my_function INTERNAL_FUNCTION_PARAMETERS Die Erweiterung von INTERNAL_FUNCTION_PARAMETERS f hrt zu folgendem Ergeb nis void zend_if_my_function int ht zval return_value wzval this_ptr int return _value_used wzend executor_globals executor_globals 384 Pearson vy ADDISON WESLEY Education Einblick in die Quellen Da der Interpreter und Executor Kern von dem PHP Hauptpaket abgetrennt wurde hat sich eine zweite API entwickelt welche Makros und Funktions s tze definiert die Zend API Da die Zend API inzwischen einige der Aufga ben bernommen hat die zuvor zu PHP geh rten wurden viele PHP Funktio nen auf Makros reduziert die aus einfachen Aufrufen von Funktionen der Zend API bestehen Die empfohlenen P
577. tierter Programmierer der ein Pro gramm schreiben soll versuchen das Programm in Objekte einzupassen w hrend ein auf Prozeduren spezialisierter Programmierer dieselbe Aufgabe anders realisiert Welcher Ansatz ist besser Jeder Programmierer wird sagen dass seine Methode die beste sei aber nur jemand der mit beiden Konzepten vertraut ist objektorientierte Programmierung und prozedurale Program mierung kann es wirklich beurteilen Jede der erw hnten Sprachen verfolgt einen anderen Ansatz um Probleme auf spezifische Weise zu l sen meistens nur Probleme einer speziellen Art mit spezifischen Anforderungen Da sich diese Sprachen auf ein sehr begrenz tes Anwendungsgebiet konzentrieren ist auch der Erfolg auf diese Gebiete begrenzt Sprachen wie C und Pascal errangen wahrscheinlich deshalb soviel 29 Pearson vy ADDISON WESLEY Education 1 Entwicklungskonzepte Beliebtheit weil sie auf einem breitgef cherten Gebiet arbeiten Spezielle Funktionen f r spezifische Probleme gibt es zwar nicht aber allgemeine Pro bleme lassen sich l sen Wie passt PHP in dieses Schema Sie wird zwar als Sprache bezeichnet aber genaugenommen ist es keine eigenst ndige Sprache sondern eine Mischung mehrerer Sprachen Sie verwendet haupts chlich die Syntax welche die meis ten Programmierer aus C kennen trotzdem ist sie komplett anders weil sie interpretiert wird PHP kennt verschiedene Variablentypen nimmt aber keine strenge b
578. tigen Sobald dieser Punkt erreicht ist ist es Zeit das Herz von PHP unter die Lupe zu nehmen und sich den Kern d h den C Code anzusehen der PHP zum Laufen bringt Hinweis Dieses Kapitel behandelt nur die Erweiterung von PHP 4 0 Ein Gro teil der Informationen ist zwar auch f r PHP 3 0 relevant trotzdem sind die Beispiele nicht darauf ausgelegt zu PHP 3 0 kompatibel zu sein Wenn sich jemand die M he macht PHP zu erweitern wird er unserer Mei nung nach auf PHP 4 0 zur ckgreifen Angesichts der Vorteile der neuen PHP Version ist eine Neukompilierung von PHP 3 0 Servern nicht sinnvoll Zum Zeitpunkt der Bucherstellung waren einige Funktionen in PHP 4 0 noch nicht fertiggestellt oder funktionsunt chtig einer der Hauptaspekte ist die thread sichere Version von Zend 9 1 berblick PHP erweitern ist einfacher gesagt als getan PHP hat sich zu einem vollaus gestatteten Werkzeug entwickelt das aus ein paar Megabyte Quellcode besteht Um ein System wie dieses zu knacken m ssen Sie einiges wissen und ber ck sichtigen Bei der Strukturierung dieses Kapitels entschlossen wir uns schlie lich f r den Ansatz Lernen durch praktische Anwendung Dies ist zwar nicht der wissenschaftlichste und professionellste Ansatz aber die Methode die am meisten motiviert und die besten Endresultate erzielt In den folgenden Abschnitten erfahren Sie schnell wie Sie die einfachsten Erweiterungen erzeu gen und sofort einsetzen k nnen D
579. tion 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern To use your new extension you will have to execute the following steps cd buildconf configure your extension is automatically enabled vi ext my_module my_module c make Repeat the last two steps as often as necessary Diese Anweisung erzeugt die zuvor erw hnten Dateien Um das neue Modul in den automatischen Konfigurations und Erstellungsprozess zu integrieren m ssen Sie buildconf ausf hren Dadurch wird das Skript configure neu gene riert indem das Verzeichnis ext durchsucht und alle gefunden config m4 Dateien eingebunden werden Bei der Ausf hrung von configure werden alle Konfigurationsoptionen analy siert und basierend auf diesen Optionen und den Optionen die Sie in Make file in angegeben haben ein Makefile generiert Listing 9 1 zeigt die zuvor generierte Datei Makefile in Id Extending _Zend xml v 1 22 2000 05 22 20 02 58 till Exp LTLIBRARY_NAME libmy_module la LTLIBRARY SOURCES my_module c LTLIBRARY SHARED NAME my_module la include top_srcdir build dynlib mk Listing 9 1 Die Standard Makefile in Viel ist ber sie nicht zu erz hlen Sie enth lt die Namen der Eingabe und Ausgabedateien Sie konnten auch Erstellungsanweisungen fiir andere Da teien angeben wenn sich Ihr Modul aus mehreren Quelldateien zusammen setzt Die Standard config m4 Datei die Sie in Listing 9 2 sehen ist etwas komplexer dn
580. tml gt Ga What s Related i Service Guide Download Customer Service mp ag A am an Ina C a LOGIN gt TO MY UPS COM TRACK SHIP oe TRANSIT TIME PICKUP DROP OFF SUPPLIES J UPS Calculate shipping ar to compare UPS services and published N rates for shipments from the U S and Puerto Rico to destinations in Quick Cost more than 200 countries and territories around the world Required fields are shown in bold Rate calculations are based on the detail of Calculator information you provide ORIGIN Country United States United States Postal Code DESTINATI Country ltaly Bj City Postal Code Residential Address Yes C No E ge T Ste es PEs Se AStart SpPosteing FALauick MCXMetal amp Eneypii B Explorin Adobe P oo Aae 15 00 Abbildung 4 3 Das TEET akzeptiert als Ursprungsland f r ein Paket nur die USA und Puerto Rico auch wenn UPS aus ber 50 L ndern Pakete ver schickt 212 Pearson vy ADDISON WESLEY Education Die Bedeutung der Tauglichkeit Als europ ischer Internetbenutzer sehen wir h ufig das Vorurteil best tigt dass Amerikaner dazu tendieren eine amerika bezogene Sicht der Welt ein zunehmen Benutzernamen die sich an deutschen Umlauten verschlucken und Ablaufsteuerungsprogramme in denen Sie keine Zeitzonendaten einge ben k nnen Informationssysteme die auf amerikanischen ZIP Codes basie ren die Liste lie e sich endlo
581. ts left child ted bs function tree_get_right amp tree_array handle retrieve node from array node tree_array 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_array 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_array handle node 98 Pearson A ADDISON WESLEY Education Assoziative Arrays return success return 1 function tree_retrieve_node_contents amp tree_array handle retrieve node from array node tree_array 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 Baumbibliothek 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
582. tsbewertungssystem Es ersetzt zunehmend die Dublin Core Metadata f r den Resource Discovery Standard ein anderes Verfahren zur Klassifizierung von Metadaten RDF hat sich rasch als Standardmethode f r den globalen Austausch von Metadaten im Internet durchgesetzt 7 2 5 XML Dokumente XML Dokumente bestehen aus der Auszeichnung und dem Inhalt den soge nannten Zeichendaten in der XML Sprache im Unicode Zeichensatz Es gibt verschiedene Arten der Auszeichnung auf die wir in den folgenden Abschnit ten ausf hrlich eingehen 308 Pearson A ADDISON WESLEY PHP und XML Education Elemente Jeder der bereits mit HTML gearbeitet hat wird mit Elementen vertraut sein Sie kennzeichnen die Bedeutung eines bestimmten inhaltlichen Abschnitts F r jedes Element wird in XML ein schlie endes Tag ben tigt z B f r das HTML Tag lt img gt Es gibt jedoch eine gesonderte Schreibweise zur Kenn zeichnung von leeren Tags lt xref linkend end gt Bedenken Sie dass die Verschachtelung von Tags signifikant ist Falsch ver schachtelte Tags f hren zu schlecht geformten Dokumenten Attribute Jedes Element kann Attribute haben Attribute sind Namen Wert Paare die in den Tags hinter dem Elementnamen auftauchen und die Eigenschaft eines Elements angeben Attributwerte m ssen in Anf hrungsstrichen angegeben werden Jeder Attributname darf in einem Tag nur einmal vorkommen XML Dokumente k nnen optional und ungeachtet der Doku
583. tzen indem Sie die Variable mode ndern Die Variable mode definiert welches Verfahren prim r zur Verteilung der Ses sion ID eingesetzt werden soll Es kann entweder cookie oder get sein wobei der Standardwert cookie ist PHPLib bietet zur Laufzeit einen automatischen R ckfallmodus Wenn die Variable fallback_mode auf get gesetzt ist wird der GET POST Modus ver wendet sofern der bevorzugte Modus der in der Variablen mode angegeben ist in der Regel cookie vom Client nicht unterst tzt wird Die sinnvollste Konstellation ist mode auf cookie zu setzen und fallback_mode auf get Dem entsprechend wird PHPLib versuchen Cookies zu verwenden wenn diese nicht unterst tzt werden f llt es zur ck auf den GET POST Modus Im Detail berpr ft PHPLib die Cookie Unterst tzung folgenderma en 1 Bei der ersten Abfrage einer von PHPLib gespeisten Seite versucht PHPLib den Namen des Session Cookies zu setzen der nach der Klassen instanz Session benannt ist 2 Anschlie end leitet es den Benutzer auf die Seite mit der Session ID die als Abfragestring angeh ngt ist wobei es den folgenden Programmcode verwendet header Location PROTOCOL HTTP_HOST this gt self_url 3 PHPLib pr ft ob sich die Session ID im Array HTTP_COOKIE_VARS befindet Wenn ja bleibt die Sitzung im Modus cookie Wird die Session ID nicht gefunden unterst tzt der Client keine Cookies und die Sitzung wird in den GET Modus umgeschaltet
584. tzerfunktionen aus Ihren eigenen Modulen heraus aufrufen Dies ist sehr praktisch wenn Sie R ckrufe realisieren wollen z B zum Durch laufen eines Arrays zur Textsuche oder einfach f r ereignisbasierte Pro gramme Benutzerfunktionen k nnen mit der Funktion call_user_function_ex aufge rufen werden Sie ben tigt einen Hash Wert f r die Funktionstabelle auf die Sie zugreifen m chten einen Zeiger auf ein Objekt wenn Sie eine Methode aufrufen m chten den Funktionsnamen den R ckgabewert die Anzahl von Argumenten das Argumentenarray und einen Flag der angibt ob Sie eine zval Separation durchf hren m chten ZEND_API call_user_function_ex HashTable function_table zval object zva function_name zval retval_ptr_ptr int param count zval params int no_separation Beachten Sie dass Sie nicht beides function_table und object angeben m s sen eines von beiden ist ausreichend Wenn Sie eine Methode aufrufen m ch ten m ssen Sie das Objekt bereitstellen welches die Methode enth lt In die sem Fall setzt call_user_function die Funktionstabelle automatisch auf die Funktionstabelle des Objekts Ansonsten brauchen Sie nur function_table anzugeben und k nnen object auf NULL setzen 430 Pearson A ADDISON WESLEY Education Aufruf von Benutzerfunktionen Normalerweise ist die Standardfunktionstabelle die Stamm funktionsta belle die alle Funktionseintr ge enth lt Diese Funktionstabelle ist Bestand
585. tzhalter wird durch eine weitere separate Schablonendatei ersetzt die als table referenziert wird Diese Vorgehensweise funktioniert weil die Klasse Template Ihnen erm glicht die Ergebnisse einer Analyse an einen Platz halter anzuh ngen Das Skript analysiert zun chst die Schablonendatei die mit table referenziert wird und h ngt sie anschlie end an die Hauptschab lonen an Wenn wir uns eine andere Schablonendatei der Anwendung n mlich entry_ summary inc html ansehen k nnen wir eine weitere h here Funktion der Klasse Template sehen Bl cke Dynamische Bl cke werden f r Teile einer Scha blone verwendet die iterativ durch sich selbst ersetzt werden In unserem Fall wird diese Funktion verwendet um die letzten f nf Eintr ge der Wissensda tenbank anzuzeigen Die Schablone entry_summary inc htm enth lt einen Block der wiederholt wird um f nf zusammen gefasste Eintr ge zu erzeugen Ein Block wird in der Schablone mithilfe einer Kommentarsyntax definiert lt BEGIN blockname gt block lt END blockname gt Im Programmcode wird auf den Block mithilfe der Funktion set_block zugegriffen Das erste Argument dieser Funktion gibt die Elternreferenz an in der Regel ein Verweis auf die Schablonendatei Das zweite Argument ent 296 Pearson A ADDISON WESLEY Education Wissensrepr sentation h lt den Namen des Blocks Im optionalen dritten Argument kann der Name einer neuen Referenz angegeben werden
586. u bestimmen und sie gekonnt zu verarbeiten Viele der folgenden Abschnitte er rtern auch Themen die mehr eine Ansichtsfrage sind als allgemein aner kannte Regeln Vertrauen Sie uns als professionellen Entwicklern und verlas sen Sie sich auf unserer Erfahrung bevor Sie den Inhalt verwerfen es wird sich sp ter auszahlen Bevor wir in PHP spezifische Themen eintauchen lassen Sie uns auf einer breiteren Basis beginnen Einige Themen beziehen sich auf die Programmie rung von Anwendungen im Allgemeinen ungeachtet der Sprache die Sie einsetzen oder der Plattform auf der Sie sich befinden 30 Pearson vy ADDISON WESLEY Education Die Bedeutung der Planung Wenn Sie an einem professionellen Projekt arbeiten ist es sehr wichtig dass Sie sich berlegen was Sie tun Informieren Sie sich ber Ihre Feinde und untersch tzen Sie diese niemals Nat rlich ist ein Projekt kein Feind aber die Aussage gilt trotzdem Machen Sie sich mit allen Spezifikationen Ihres Pro jekts vertraut der n Zielplattform en und seinen Benutzern und untersch t zen Sie niemals die Bedeutung der kleinen Problemchen die Sie nicht voll st ndig abgesch tzt haben bevor Sie sich anderen Themen zuwenden Nach unserer Erfahrung beansprucht die Planung mindestens 50 der Ent wicklungszeit Je gr er ein Projekt ist umso gr ndlicher sollten Sie sich dar auf vorbereiten Dieses Prinzip gilt sowohl wenn Sie Ihren Kunden kontakten und mit ihm zusamme
587. u setzten verwenden Sie folgende Zeile pattern amp HOBBY WRITING Die berpr fung der erforderlichen Berechtigungsebene erfolgt ber die Funktion auth gt have_perm Die Berechtigungsebene die Sie berpr fen m chten bergeben Sie als Argument In unserem Beispiel verwenden wir auth gt have_perm admin um zu kontrollieren ob der Benutzer das Privileg admin hat Wenn der Benutzer die erforderliche Berechtigungen hat gibt die Funktion true zur ck ansonsten false Jedem Benutzer werden Privilegien zugeordnet Bei Verwendung der Funk tion Example Auth werden die Privilegien in der MySQL Tabelle auth_user gespeichert Sie kennen das Feld bereits perms varchar 255 283 Pearson A ADDISON WESLEY Education 6 Datenbankzugriff mit PHP Eine Liste g ltiger Berechtigungen wird in der Klasse definiert die von Perm angeleitet wurde und zwar in der Klassenvariablen permissions Die Klasse Example_Perm hat folgende Berechtigungen var permissions array user gt author gt 2 editor gt 4 supervisor gt 8 admin gt 16 J Berechtigungen werden intern in Bitmaps umgewandelt und mit logischen UND und ODER berechnet Die Werte in diesem assoziativen Array definie ren f r jede Berechtigungsebene ein Bitmuster Das mag zwar ein wenig kom pliziert klingen aber die Verwendung von Bitmustern bringt fiir Szenarien wie Berechtigungsebenen einige Vorteile Zum Beispiel werden automatisc
588. uble zval array F gt eine Flie kommazahl hinzu char key double d add_assoc_string zval array F gt im Array einen String hinzu Der Flag du char key char str plicate gibt an ob der Stringinhalt in den in int duplicate ternen Zendspeicher kopiert werden muss add_assoc_stringl zval ar F gt einen String der gew nschten L nge ray char key char str length im Array hinzu ansonsten verh lt sich uint length int duplicate diese Funktion wie add_assoc_string Tab 9 8 Zends API fiir assoziative Arrays 414 Pearson vy ADDISON WESLEY Education Erzeugen von Variablen Hinweis Die Funktionen aus Tabelle 9 9 arbeiten mit dem Array array mit dem Index idx Der Index ist stets ein Integer Funktion Beschreibung add_index_long zval array F gt ein Element des Typs long hinzu uint idx long n add_index_unset zval array F gt ein nicht gesetztes Element hinzu uint idx add_index_bool zval array F gt ein boolesches Element hinzu uint idx int b add_index_resource zval F gt im Array eine Ressource hinzu array uint idx int r n 1 add i dex_double zval array F gt eine Flie kommazahl hinzu idx double d add_index_string zval array F gt im Array einen String hinzu Der Flag du uint idx char str int dup plicate gibt an ob der Stringinhalt in den in uint licate ternen Zend Speicher kopiert werden muss add_index_stringl zv
589. uccess user_status user_name user_online Alternative 2 function get_online_status user_name amp status retrieve status and return in status success get_online_status user_name user_online 49 Pearson A ADDISON WESLEY Education 1 Entwicklungskonzepte user_status ist zwar keine schlechte Wahl f r einen Namen mit diesem Zweck aber get_online_status passt besser Das Wort get verdeutlicht dass die Funktion den Online Status einliest und ihn irgendwo speichert entwe der in einer globalen Variablen oder in einem variablen Funktionsargument Verwenden Sie f r Funktionen die nur Daten verarbeiten anstelle von passi ven Namen nur aktive Namen Benutzen Sie keine Hauptw rter wie huffman_ encoder oder database_checker nennen Sie die Funktionen huffman_ encode und check_database oder kehren Sie die Reihenfolge der W rter um wenn dies f r Ihr Modulpr fix besser passt Ist Ihr Programmcode zweisprachig Dreisprachig Eine der h ufigsten Kritiken an Programmcodes betrifft die Verstaatli chung die Durchsetzung der Programmiersprache die normalerweise einen englischsprachigen Ursprung hat mit einer anderen Sprache In unse rem Fall Tobias ist Italiener Till ist Deutscher haben wir bei der Durchsicht von Projekten lokaler Programmierer festgestellt dass diese gerne deutsche bzw italienische Variablen und Funktionsnamen anstatt englischer Namen verwendeten Dies f hr
590. umbasteln das sie nicht selbst entwickelt haben F r die Chat Programme bedeutet dies dass wir einen festen Programmkern entwickeln m ssen den Teil der Anwendung den niemand jemals ndern muss oder soll der Schnittstellen zu einer Reihe von Plugins besitzt dem Teil der Anwendung den die meisten irgendwie ndern m chten Damit errei chen wir eine Unabh ngigkeit von Programmcode und Schnittstellenlayout indem wir eine Schnittstelle f r HTML Entwickler bereitstellen sowie eine Unabh ngigkeit der einzelnen datenverarbeitenden Stufen voneinander 151 Pearson vy ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel Denken Sie noch einmal ber die Wichtigkeit dieser Forderung nach M ch ten Sie dass ein Programm so konzipiert ist Brauchen Sie dies berhaupt berlegen Sie sich wie Sie dies realisieren k nnen 3 5 6 Schnittstelle zum HTML Entwickler Im Falle der HTML Schnittstelle wird die Trennung von Programmcode und Layout ber Schablonen erreicht Dies ist nicht nur der einfachste Weg um ein Programm an Ihre Bed rfnisse anzupassen sondern auch der leistungsf higste Innerhalb von Sekunden k nnen Sie die Struktur und das Aussehen ver ndern ohne eine einzige Programmzeile ndern zu m ssen Jeder Benut zer der ber grundlegende HTML Kenntnissen verf gt kann die Art und Weise ndern wie sich ein Programm einem Benutzer pr sentiert Da wir die ses Verfahren an anderer Stelle im Bu
591. ument einen klar defi nierten Typ geben Durch die extrem dynamische Art von PHP m ssen Sie auch hier auf einige Eigenarten achten Da PHP niemals den Typ berpr ft kann ein Anrufer jede Art von Daten an Ihre Funktionen bergeben unab h ngig davon ob Sie dies wollen oder nicht Wenn Sie beispielsweise einen Integer erwarten k nnte der Anrufer einen Array bergeben oder umge kehrt PHP wird es nicht bemerken 398 Pearson vy ADDISON WESLEY Education Annahme von Argumenten Um dies zu umgehen stehen Ihnen einige API Funktionen zur Verf gung bei denen Sie bei jedem Argument das bergeben wurde eine Typenkonver tierung erzwingen k nnen siehe Tabelle 9 4 Hinweis Alle Konvertierungsfunktionen erwarten als Parameter ein zval Funktion Beschreibung convert_to_boolean_ex Wert Erzwingt die Konvertierung in einen booleschen Wert Boolesche Werte bleiben unber hrt Longs Doubles und Strings die 0 enthalten sowie NULL Werte ergeben den booleschen Wert 0 FALSE Arrays und Objekte werden je nach der Anzahl der Eintr ge oder Parameter konvertiert die sie haben Leere Arrays und Objekte werden in FALSE umgewandelt ansonsten in TRUE Alle anderen Werte f hren zum booleschen Wert 1 TRUE convert_to_long_ex Wert Erzwingt die Konvertierung in einen Long den Standard Integertyp NULL Werte boolesche Werte Ressourcen und nat rlich Longs bleiben unver ndert Doubles werden gekappt Strings die e
592. umente Das abstrakte XML Dokument wird in einem Dokumentenobjekt dargestellt Solch ein Objekt wird ber die Funktionen xmldoc xmldocfile und new_xml doc erzeugt Die Funktion xmldoc besitzt nur ein Argument welches das XML Dokument als Zeichenkette angibt Die Funktion xmldocfile verh lt sich hnlich gibt aber im Argument einen Dateinamen an Um ein neues leeres XML Doku ment zu erzeugen k nnen Sie die Funktion new_xmldoc verwenden Alle drei Funktionen geben ein Dokumentenobjekt zur ck dem vier Metho den und eine Klassenvariable zugeordnet sind root add_root dtd dumpmem version Die Funktion root gibt ein Knotenobjekt zurtick welches das Stammele ment des Dokuments enth lt Bei leeren Dokumenten die Sie mit new_ xml doc erzeugt haben k nnen Sie mit add_root ein Stammelement hinzuf gen Auch hier wird ein Knotenobjekt zur ckgegeben Beim Aufruf als Klassenme thode erwartet die Funktion add_root als erstes Argument den Namen des 333 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie Elements Sie k nnen sie auch als globale Funktion aufrufen In diesem Fall m ssen Sie jedoch als ersten Argument die Instanz der Dokumentenklasse bergeben und als zweites Element den Namen des Stammelements Die Funktion dtd gibt ein DTD Objekt ohne Methoden aber mit den Klas senvariablen name sysid und extid zur ck Der Name der DTD ist stets iden tisch mit
593. un sind typische Fragen f r diese Phase Es ist die Aufgabe des Analytikers dem Kunden zu helfen die Probleme so zu formulieren dass sie sich in Softwarel sungen umsetzen lassen W hrend der Analysephase lernt der Analytiker das Pro blem genauer kennen und kann es in konkrete und dokumentierbare Begriffe fassen 7 1 2 Spezifikation Der Anforderungskatalog vermittelt Ihnen ein allgemeines Verst ndnis ber das Problem Sobald Sie dieses haben sollten Sie Richtlinien f r das tats ch lich zu entwickelnde Programm aufstellen d h eine Spezifikation schreiben Dazu m ssen Sie zun chst herausfinden welche Datenstukturen Sie ben tigen Versuchen Sie das komplexe Problem in kleinere Einheiten zu teilen Wenn Sie den Anforderungskatalog und das Problemfeld analysieren stellen Sie fest dass es drei wichtige Datenstrukturen gibt und der Rest der Anwendung auf diesen aufbaut Die wichtigste Struktur bildet ein Eintrag in der Wissens datenbank Was ist ein Eintrag Aus dem Anforderungskatalog wissen wir dass einem Eintrag Eigenschaften zugeordnet sind Titel Hauptteil Autor Kategorie Beurteilung und Protokolle Da wir bereits hnliche Probleme gel st haben sehen wir ein klares Muster in dieser Datenstruktur Es handelt sich um einen einfachen Beh lter Wir wissen aber auch dass wir eine Methode brauchen um auf diesen Beh lter zu referenzieren Unserer Erfah rung nach ist dies sehr wichtig und kann einen wirklich guten Prog
594. un Sie ben tigen keine zval Zuordnung Sie brauchen lediglich einen Variablennamen und einen Wert Hinweis Alle Makros aus Tabelle 9 12 erzeugen eine globale Variable des Namens name mit dem Wert value 420 Pearson A ADDISON WESLEY Education Makros zur automatischen Erstellung von globalen Variablen Makro Beschreibung SET_VAR_STRING name value Erzeugt einen neuen String SET_VAR_STRINGL name value Erzeugt einen neuen String der angegebenen length L nge Dieses Makro ist schneller als SET_VAR_ STRING und au erdem bin rsicher SET_VAR_LONG name value Erzeugt einen neuen Long SET_VAR_DOUBLE name value Erzeugt einen neuen Double Tab 9 12 Makros zur Erstellung globaler Variablen 9 15 1 Erstellen von Konstanten Zend unterst tzt die Erstellung von echten Konstanten im Gegensatz zu regul ren Variablen Der Zugriff auf Konstanten erfolgt ohne das typische Dollarzeichen Pr fix Konstanten sind sowohl lokal als auch global ver f gbar Zwei Beispiele f r Konstanten sind TRUE und FALSE Mit den Makros aus Tabelle 9 13 k nnen Sie eigene Konstanten erzeugen Diese Makros generieren eine Konstante mit dem angegebenen Namen und Wert F r jede Konstante k nnen Sie auch Flags angeben CONST_CS Bei dem Namen dieser Konstante wird Gro und Kleinschrei bung unterschieden CONST_PERSISTENT Diese Konstante ist best ndig und wird nicht verges sen wenn der aktuelle Prozes
595. und Dokumentation bereitzustellen Diese Informationen sollten leicht zu finden sein auf die Auf gabe des Benutzers ausgerichtet sein die konkreten auszuf hrenden Schritte beschreiben und nicht zu lang sein 4 3 3 Tauglichkeit Tun Sie es einfach Gem Nielsen lauten zwei der wichtigsten Spr che der reduzierten Taug lichkeitspr fung Alle Daten sind Daten und irgendetwas ist besser als gar nichts was die Tauglichkeit betrifft Wir m chten Sie ermutigen die einfache Tauglichkeitspr fung einmal auszuprobieren und sie bei Ihrer Entwicklung so h ufig und regelm ig wie m glich anzuwenden Sie kostet nicht viel und f rdert die Kenntnisse des Benutzers 4 4 Zusammenfassung In diesem Kapitel haben Sie die Grundlagen der Sitzungsverwaltung kennen gelernt Sie haben erfahren wie Sie Daten von einer Seite zur n chsten weiter leiten und wie Sie Ihre Benutzer erkennen Sie k nnen Sitzungen mit PHP 3 0 und 4 0 erstellen wenn Sie verschiedene Speicherverfahren verwenden und wissen wann Sie welches unter welchen Umst nden verwenden m ssen Dar ber hinaus haben wir Ihnen gezeigt wie Sie die Daten sichern die Ihnen Ihr Benutzer anvertraut hat und wie Sie Ihre Website vor Missbrauch sch t zen Sie kennen die Grundlagen der verschiedenen Verschl sselungsmetho den und ihre Anwendungsgebiete Tauglichkeit ist f r Sie jetzt kein Fremdwort mehr und wir hoffen dass Ihnen jetzt bewusst ist wie wichtig es ist dass sich Ihre Webs
596. und die Verwendung von Open Source in gro en Unternehmen wurde noch nicht einmal in Betracht gezogen Die Welt hat sich ge ndert Firmen die es sich zur Aufgabe gemacht haben Linux basierte L sungen wie etwa RedHat SuSE und VA Linux zu unterst tzen wurden nicht nur Wirtschaftsgiganten sondern schafften es auch Linux und Open Source als akzeptable L sung in Firmen einzuf hren Zum Gl ck waren diese Firmen klug genug dabei den Geist von Open Source und den Kontakt zu der Benutzer Gemeinde aufrecht zu erhalten Das Open Source Entwicklungs konzept auf der einen Seite und die starke kommerzielle Vermarktung auf der anderen verschafften Linux einen unvorhergesehenen Aufschwung Ich bin sicher dass kommerzielle Betriebe wie Zend Technologies die sich der Unterst tzung von PHP verschrieben haben dazu beitragen dass die Ver wendung von PHP noch weitere Verbreitung findet insbesondere auf High End Websites Ich m chte die Gelegenheit ergreifen Herrn Prof Michael Rodeh von IBM Haifa und des Technion Institute of Technology zu danken der Andi und mich ermunterte Rasmus Lerdorf zu kontaktieren den Autor von PHP FI 1 0 und 2 0 Rasmus Lerdorf freute sich sehr mit uns zusammen PHP 3 0 zu ent wickeln den offiziellen Nachfolger von PHP FI 2 0 Des weiteren bedanke ich mich bei der PHP Gruppe dem gesamten PHP Entwicklerteam ohne das PHP nicht das hervorragende Werkzeug w re das es heute ist und schlie lich der PHP Gemeinde die
597. und eigenst ndigen Skripten Es zeigte Verfahren mit denen sich das grundlegendste Problem beheben l sst die Sit zungsverwaltung Dieses Kapitel erl utert Strategien um andere bliche Pro bleme die beim Arbeiten an gr eren Projekten auftreten in den Griff zu bekommen Wir stellen Ihnen einige L sungen vor die unserer Meinung nach zeitsparend effektiv und einfach zu installieren sind Trotzdem sollten Sie pr fen ob sie wirklich Ihren Anforderungen gen gen Dieses Kapitel nennt sich daher auch Webanwendungsstrategien und nicht etwa Webanwen dungsl sungen f r einen Zweck Es zahlt sich immer aus mehr Zeit auf die Auswertung zu verwenden als ein Projekt neu organisieren zu m ssen Wie in Kapitel 1 PHP Konzepte erw hnt ist Zeit die wertvollste Resource von der wir niemals genug haben Am Anfang war das HTML Formular Fast jede Webanwendung erfragt Informationen vom Benutzer Deshalb sollte ein besonderes Augenmerk auf berpr fungsroutinen fallen Sie brauchen eine generische Bearbeitungsrou tine wenn Sie das Rad nicht immer wieder neu erfinden m chten Der erste Teil dieses Kapitels beschreibt das PHP Standardformular und zeigt wie Sie die Klasse EasyTemplate einsetzen um Code und Layout voneinander zu trennen ber Schablonen wird die Zusammenarbeit in fach bergreifenden Entwick lungsteams verbessert Dies ist jedoch nur ein kleiner Aspekt bei der Teamar beit Wir zeigen Ihnen deshalb auch wie Sie Ihre P
598. und sicherzu stellen dass das Programm lauft Da das Programm nicht nur vom Computer sondern auch von anderen Programmierern wie Ihnen gelesen wird sollte der Quellcode klar und pr zise sein Ein gut geschriebenes Programm ist ein fach zu lesen ausf hrlich kommentiert und verwendet keine exotischen Aus dr cke APls sollten eine klare und konsistente Schnittstelle zur Verf gung stellen in logische Einheiten unterteilt sein und den Backend abstrahieren Da gr ere Projekte selbst mit dem klarsten Programmcode nicht selbsterkl rend sind sollte hierf r unbedingt eine technische Dokumentation erstellt werden Die in diesem Kapitel vorgestellten Konventionen zur Kodierung basieren nicht auf bindenden Regeln sondern entstammen dem Erfahrungsschatz vie ler routinierter Programmierer Sie sind nicht schwer zu befolgen und sie machen Ihnen und Ihren Kollegen das Leben ein gutes St ck leichter N here Dich ihm und es gibt keinen Anfang folge ihm und es gibt kein Ende Du kannst es nicht wissen aber sein frei in Deinem eigenen Leben 61 Pearson A ADDISON WESLEY Education Pearson A ADDISON WESLEY Education 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 n
599. ung Eine komplette Protokollroutine einzuhacken die eine Schnittstelle zum IRC bereitstellt w re ein wenig zu kompliziert Wir haben IRC aber auch deshalb einer datenbankbasierten L sung vorgezogen weil es bereits eine API gibt die diese Aufgabe f r uns bernimmt Informieren Sie sich ber den Markt F r jedes Programmierprojekt ist es immens wichtig welche Teile bereits von anderen entwickelt wurden und welche es noch nicht gibt Erfinden Sie das Rad nicht neu Besonders bei kom merziellen Projekten kann es sich durchaus auszahlen fremde absturzsichere L sungen f r bestimmte Aufgaben zu kaufen und sie nicht selbst zu konzi pieren und zu entwickeln Letzteres ist manchmal teurer und zeitaufwendi ger Au erdem werden externe L sungen in der Regel st ndig verbessert Dieser Vorgang ist absolut unabh ngig von der Entwicklung Ihres eigenen Projekts Wenn Sie ein Upgrade von einer externe Firma erhalten m ssen Sie nur noch den entsprechenden Teil Ihrer Anwendung ersetzen Auf diese Weise k nnen Sie einige Teile Ihres Programms aktualisieren ohne in die nderungen selbst Arbeit zu stecken Wenn Sie zudem bereits bestehende Bibliotheken verwenden st tzen Sie Ihr Projekt automatisch auf allgemein blichen standardisierten APIs dies ist immer von gro em Vorteil ist Auf der anderen Seite kann sich die Bindung an fremde Produkte nat rlich auch als Nachteil erweisen wenn der Hersteller sein Produkt nicht auf dem neuesten Stand h
600. ung Sequenzen Sperren u a Abbildung 6 1 Beziehungsmodell der Klassen DB_Sql CT_Sql und Session Unser Beispiel verwendete keine Basisklassen sondern Erweiterungen davon und zwar so wie sie in local inc definiert sind Abbildung 6 2 zeigt die Abh ngigkeiten erweitert verwendet Session_Example verwendet erweitert CT_Example verwendet verwendet erweitert DB_Example Abbildung 6 2 Im Beispiel vorhandene Abh ngigkeiten und Beziehungen 6 2 10 Abk rzungen I page_open Angenommen Sie wollten eine gr ere Anwendung entwickeln und dabei Session Verwaltung Datenbankabstrahierung und PHPLib Funktionen f r die Authentisierung und Verwaltung von Zugriffsrechten verwenden Daf r m ssen Sie Instanzen der Session Authentisierungs und Berechtigungsob jekte erzeugen Ihre Datei local inc sieht in etwa folgenderma en aus sess new Session Example sess gt start auth new Auth_Example auth gt start 271 Pearson A ADDISON WESLEY Education 6 Datenbankzugriff mit PHP perm new Perm Example user new User Example user gt start Da die Klassen voneinander abh ngen m ssen Sie diese in der richtigen Rei henfolge initialisieren Sie k nnen keine Instanz von User_Example erzeugen bevor Sie nicht eine Instanz der Session und der Authentisierungsinstanz generiert haben Das ist aber noch nicht alles Wie das Ende Ihres Programms aussie
601. ungen von assoziativen Arrays eine Gruppe benannter Felder mit der gleichen Anzahl an Datenzeilen recordset Bin re Objekte die z Z mit Base64 kodiert sind binary Alle WDDX Pakete haben dasselbe XML Format Das Stammelement lautet wddxPacket Dies hat ein optionales Versionsattribut das die Version der WDDX DTD angibt Die Versionsnummer derzeit 1 0 ist gebunden an und 343 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie definiert in der DTD Dies bedeutet dass ein WDDX Paket mit der Version 1 0 nur dann g ltig ist wenn es mit der WDDX DTD 1 0 verwendet wird und nicht mit 2 0 oder 0 9 Direkt unter dem Element wddxPacket muss das Element header folgen Der Kopf kann nur ein Kommentarelement enthalten und sonst nichts Das n chste erforderliche Element ist data das den Hauptteil des Pakets kennzeichnet Innerhalb dieses Elements muss genau ein Element des Typs null boolean number dateTime string array struct recordset oder binary auf tauchen Listing 7 6 zeigt ein Beispiel f r ein WDDX Paket lt wddxPacket version 1 0 gt lt header gt lt data gt lt struct gt lt var name string gt lt string gt This is a string lt string gt lt var gt lt var name int gt lt number gt 42 lt number gt lt var gt lt var name float gt lt number gt 42 5 lt number gt lt var gt lt var name bool gt lt boolean value true gt lt var gt lt var n
602. ungsfunktionen nicht ohne die Datenbank Abstraktionsschicht der Bibliothek verwenden Wenn Sie nur eine Sitzungsverwaltung ben tigen empfiehlt es sich m gli cherweise eher die Sessionfunktion von PHP 4 0 oder unseren PHP 3 0 Back port zu verwenden Sie sollten trotzdem weiterlesen PHPLib verf gt ber einige Funktionen die Ihnen das Leben definitiv einfacher machen k nnen 6 1 3 Wichtige Dateien In der PHPLib Distribution gibt es zwei Dateien die Sie wahrscheinlicher weise ndern m ssen local inc und prepend php3 Die Datei prepend php3 l dt die Dateien die auf allen Seiten verf gbar sein sol len die PHPLib verwenden Standardm ig l dt es den Datenbank Backend f r MySQL und verwendet zur Sitzungsverwaltung des SQL Speicherbeh l ters Um beispielsweise von MySQL auf Postgres zu wechseln m ssten Sie folgende Zeile ver ndern require PHPLIBL libdir db _mysql inc Change this to match your database und anstelle von db_mysql inc f gen Sie db_pgsq inc ein Wenn Sie andere Klassen aus PHPLib verwenden m chten beispielsweise die Klasse Template sollten Sie diese besser in prepend php3 einf gen Die Datei local inc befindet sich in dem Verzeichnis in welchem die Anpas sung von PHPLib stattfindet 6 1 4 Anpassung von PHPLib In den meisten F llen werden die Basisklassen von PHPLib nicht direkt ver wendet Statt dessen verwenden Sie Ihre eigenen abgewandelten Klassen welche auf Ihre
603. unktion false zur ck bool com set Int com identifier String property_name String property_ value Weist einem Parameter des COM Objekts das in com object instantiiert wurde einen Wert zu Aliase f r diese Funktion sind com propset und com_propput Gibt bei erfolgreicher Zuweisung true zur ck bei einem Fehler false mixed com get Int com identifier String property_name Gibt den Wert eines Parameters des COM Objekts zur ck das in com_object instantiiert wurde Alias fiir diese Funktion ist com propget Gibt den Wert der Eigenschaft zurtick oder bei einem Fehler false 5 4 4 PHP und Java Java das in vielen Firmen fiir Softwareentwickler die Sprache des Tages ist wird zunehmend in allen Entwicklungsbereichen eingesetzt Seit der Version 4 0 kann PHP so kompiliert werden dass es den Aufruf reiner Java Funktionen unterst tzt so dass Sie die Java Komponenten der Firma in einer mehrstufigen Umgebung verwenden k nnen Die Realisierung der Java Unterst tzung ist nicht schwierig Folgende Punkte sollten Sie bedenken Zun chst m ssen Sie eine Java Virtual Machine JVM auf Ihrem System installieren Wir haben hierf r das frei verf gbare Open Source Kaffe 1 0 5 verwendet PHP muss mit APXS als DSO kompiliert werden wodurch es als gemein sam genutztes Modul auf dem Apache Server geladen wird Die Befehle hierf r finden Sie in der Datei INSTALL DSO der PHP Distribution Weitere Anweisungen k nnen Sie in der D
604. unpraktisch wenn mehr als zwei Dateien und mehr als eine Variable gespeichert werden m ssen Ein etwas besserer Ansatz ist die Ver wendung von Cookies mit denen alle Daten auf der Client Seite gespeichert werden k nnen Es gibt jedoch verschiedene Gr nde warum die Daten nicht auf der Client Seite gespeichert werden sollten Sie verlieren die Kontrolle ber die Daten Solange der Benutzer nicht auf Ihre Website zur ckkehrt haben Sie keinen Zugriff auf die Daten Viel schlimmer ist dass die Daten m glicherweise manipuliert sind wenn Sie sie zur ckerhalten Neunzig Prozent aller Website Abst rze sind durch Programme verursacht die verf lschte Daten von der Client Seite akzep tieren und diesen Daten vertrauen Bewahren Sie keine Daten auf dem Cli ent auf Vertrauen Sie keinen Daten vom Client Wenn Sie GET POST verwenden bleiben die Daten nicht bis zur n chsten Sit zung erhalten Wenn Sie sich ausschlie lich auf Cookies verlassen haben Sie das Pro blem dass nicht alle Benutzer Cookies akzeptieren Sie deaktivieren die Cookies einfach auf ihrem Browser Der Datenerhalt ist sehr schwierig weil Sie alle Daten auf jeder Seite spei chern m ssen Jede Variable muss URL kodiert als verstecktes Feld in einem Formular hinzugef gt an die URL angeh ngt oder als Cookie 166 Pearson A ADDISON WESLEY Education HTTP und Sitzungen gespeichert werden Dies ist bereits bei einer einzelnen Variablen wie etwa der Sitzungsk
605. unter schiedlichen Berechtigungsebenen die mit den einzelnen Benutzern ver kn pft sind k nnen Sie eine weitere PHPLib Klasse namens Perm verwenden 6 3 4 Verwaltung von Berechtigungsebenen In einer typischen Anwendung haben Sie in der Regel zwei Berechtigungs ebenen Benutzer und Administratoren Bei einigen Anwendungen brauchen Sie jedoch eine detailliertere Zugriffskontrolle Ein Content Management Sys tem braucht beispielsweise viele Berechtigungsebenen Einen Superuser der alles im System ndern kann um das Benutzersys tem zu ver ndern usw Editoren die Artikel und Inhalte bearbeiten sowie den Inhalt genehmigen k nnen der von den Autoren kommt Autoren die Inhalte erzeugen k nnen und sie zur Genehmigung an die Editoren weiterleiten aber keine Inhalte genehmigen k nnen Benutzer mit Nur Lese Zugriff Da Sie die derzeit angemeldeten Benutzer kennen und den Benutzer anhand seiner eindeutigen Kennnummer uid identifizieren k nnen w re es nicht sehr schwer Funktionen zu schreiben mit denen Sie dem Benutzer einer Gruppe zuordnen k nnen und ihm entsprechend dieser Gruppe Daten anzeigen PHPLib bietet hierf r eingebaute Funktionen Um die Klasse Perm zu verwenden m ssen Sie im page_open Aufruf ein wei teres Element hinzuf gen PHPLib bietet eine Standardimplementierung der Klasse Perm namens Example_Perm Doch hier gilt dasselbe Prinzip wie zuvor Um alle verf gbaren Funktionen nutzen zu k nnen und an Ihre
606. ur 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 nachgedacht was PHP tut wenn es ihre Skripte interpretiert 1 Es analysiert die eingegebenen Quelldaten 2 Es erzeugt eine analysierte Darstellung 120 Pearson A ADDISON WESLEY Education Polymorphisierung und selbstmodifizierender Code 3 Es l sst einen Prozessor ber die analysierte Darstellung laufen 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 wer
607. ur Definition folgender Punkte einer Reihe von Objekten zur Darstellung der kompletten Struktur eines XML Dokuments eines Modells f r die Kombinationsm glichkeiten dieser Objekte einer Schnittstelle f r den Zugriff und die berarbeitung dieser Objekte Durch Abstrahierung des Dokuments erzeugt das DOM eine Baumstruktur welche die Beziehung von Eltern und Tochterknoten aufzeigt sowie Metho den wie getAttribute f r die Knoten Kurzum DOM stellt eine standardob jektorientierte und verzeichnisstruktur hnliche Schnittstelle f r XML Doku mente zur Verf gung Die DOM Spezifikation ist unabh ngig von einer Programmiersprache Sie empfiehlt die Entwicklung einer objektorientierten Anwendung wozu eine Sprache mit zumindest einfachen objektorientierten Funktionen erforderlich ist Sie definiert eine Reihe von Knotentypen Schnittstellen die zusammen genommen das vollst ndige Dokument bilden Einige Knotentypen haben m glicherweise Tochterknoten andere Blattknoten unter denen keine weite ren Knoten folgen Auf diese Knotentypen werden wir im Folgenden ausf hr lich eingehen da sie in der urspr nglichen W3C Spezifikation hervorgeho 328 Pearson A ADDISON WESLEY Education PHP und XML ben wurden Eine ausf hrliche Beschreibung aller Methoden und Attribute der einzelnen Instanzen finden Sie in der Spezifikation Document Die Schnittstelle Document ist der Stammknoten des Strukturbaums Diese Schnittstelle kann n
608. ur 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 typischen 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 Pear
609. ur ein Element enthalten und zwar das Stammelement des XML Dokuments Dar ber hinaus kann es die mit diesem Dokument ver kn pfte Dokumententypdeklaration enthalten organisiert in der Schnittstelle DocumentType und sofern verf gbar Verarbeitungsbefehle und Kommentare au erhalb des Stammelements Da sich alle anderen Knoten unterhalb des Knotens Document befinden besitzt die Schnittstelle Document eine Reihe von Verfahren um Unterknoten zu erzeu gen Mithilfe dieser Funktionen k nnen Sie ein vollst ndiges XML Dokument mittels eines Programms erstellen In der Spezifikation ist auch eine Methode namens getElementsByTagName definiert Diese dient dazu alle Elemente mit einem bestimmten Tag Namen im Dokument auszulesen DocumentFragment Der Knoten DocumentFragment stellt einen Teil eines komplexen XML Doku ments dar H ufig ist es notwendig Teile eines Dokuments neu anzuordnen oder einen Teil zu extrahieren Daf r ben tigen Sie ein leichtes Objekt um das entnommene Fragment zu speichern Stellen Sie sich vor Sie wollten eine ein zelne Buchdatei aus vielen verschiedenen Kapiteldateien erstellen Jedes Kapitel k nnte in einem DocumentFragment Objekt abgelegt sein und in die Dokumentenstruktur des Buches eingef gt werden Wenn Sie keine M glich keit haben Fragmente eines Dokuments zu organisieren m ssten Sie alle Ele mente aller Kapitel nacheinander in dem Buchdokument hinzuf gen Die Spezifikation macht es sogar noch ein
610. us zu speichern Deshalb spricht man bei HTTP von einem kontextfreien oder zustandslosen Protokoll Die einzelnen Anfragen werden nicht zueinander in Beziehung gesetzt Der Webserver und damit auch PHP kann einzelne Benutzer nicht einfach von einander unterscheiden und kennt keine Benutzersitzungen Deshalb m ssen wir einen eigenen Weg finden um einen Benutzer zu kennzeichnen und ihm Sitzungsdaten zuzuordnen d h alle Daten die Sie f r einen Benutzer spei chern m chten Wir benutzen den Begriff Sitzung f r eine Instanz eines Benutzers der eine Website und eine oder mehrere Seiten anzeigt Eine typi sche Online Einkaufssitzung k nnte beispielsweise daraus bestehen einen Artikel in den Einkaufswagen zu legen auf die Abmeldeseite zu gehen die Adresse und die Kreditkartendaten einzugeben den Auftrag abzuschicken und das Fenster zu schlie en Die gute Nachricht ist dass es mehr als eine M glichkeit gibt Sitzungen zu verwalten Die schlechte Nachricht ist dass keine von ihnen perfekt ist Las sen Sie uns zun chst jene aussortieren die nicht funktionieren selbst wenn sie auf den ersten Blick als gute Alternativen erscheinen Der typische PHP Programmierer wird zun chst versuchen das Problem zu ignorieren und einen Umweg zu finden Die offensichtlichste Methode ist alle Daten anstatt auf dem Server auf dem Client zu speichern Dies f hrt zu Formularen mit sehr vielen versteckten Feldern oder sehr langen URLs Dies wird schnell
611. uth_validatelogin und die Implementierung obliegt Ihnen Die Authentisierung ist nicht auf das Verzeichnis beschr nkt sondern kann f r einzelne Dateien der Anwendung unterschiedlich sein Sie k n nen sogar in einem Skript verschiedene Authentisierungsebenen realisie ren Sie k nnen Teile des Skripts vor Benutzern verbergen die nicht berechtigt sind auf diese Teile zuzugreifen Benutzer die dem System nicht bekannt sind k nnen sich vor der Anmel dung registrieren lassen Ein Registrierungsformular wird eingeblendet und PHPLib erzeugt automatisch einen Standardeintrag in der Benutzer datenbank Die Authentisierung ber PHPLib funtioniert sogar mit die CGI Version von PHP Sie k nnen Benutzer sauber abmelden Dies bedeutet der Benutzer erh lt die M glichkeit die aktuelle Session zu beenden ber die entsprechende Schaltfl che Benutzer k nnen nach einer gewissen Leerlaufzeit automatisch abgemel det werden Damit bekommt Ihre Anwendung eine zus tzliche Sicherheit da diese Funktion das Kapern von Nutzungen nach l ngerer Leerlaufzeit verhindert 6 3 2 Auth Beispiel Beginnen wir mit einen einfachen Beispiel Das Beispiel in Listing 6 4 zeigt den Standardanmeldebildschirm von PHPLib wenn Sie diesen das erste Mal aufrufen Die Anmeldung erfolgt ber ein Standardbenutzername Passwort Paar von kris test Sobald Sie authentisiert wurden sehen Sie Ihre Session ID Ihren Benutzernamen und Ihre Zugriffsberechtigung
612. utzer Authentisierung die HTTP Basic Authentication Auf Seiten die eine Authentisierung vorschreiben antwortet der Webserver dem Client mit einem bestimmten Kopf HTTP 1 1 401 Authorization Required WWW Authenticate Basic realm Protected Area Daraufhin erscheint im Browser ein modaler Dialog der den Benutzernamen das Passwort verlangt Dieser Berechtigungstyp ist jedoch wirklich nur als grundlegend zu bezeichnen denn es beinhaltet eine Reihe von Nachteilen Um Benutzer abzumelden miissen Sie Tricks anwenden Um Benutzer nach einer definierten Leerlaufzeit abzumelden mtissen Sie noch mehr Tricks anwenden 206 Pearson A ADDISON WESLEY Education Die Bedeutung der Tauglichkeit Wenn Sie Benutzergruppen ben tigen die wir zuvor als Genehmigungs ebenen bezeichneten brauchen Sie eine eigene Programmlogik um Ein zelbenutzer zu Gruppen zusammenzufassen Sie k nnen den Anmeldeprozess nicht ver ndern Der Popup Dialog bleibt immer derselbe egal welche Website Sie verwenden Unerfahrene Benutzer haben in der Regel Angst vor diesen Dialogen Sie k nnen keine Hilfe bieten da Sie den Dialog nicht ver ndern k nnen HTTP Authentisierung ber PHP ist nur mit der Modulversion m glich Die Berechtigung beschr nkt sich auf Verzeichnisse Was ist wenn Sie nur eine einzige Seite sch tzen m chten Mit den Apache Anweisungen ist dies unm glich Sie m ssten eine HTTP Authentisierung ber PHP durch f hren
613. von PHP abh ngen Ein Gro teil der Texte wurde von den Firmen selbst bereitgestellt Diese Texte geben daher einen konkreten Ein blick in die Entwicklungsprozesse und technischen Daten Die Fallstudien belegen dass PHP eine zuverl ssige hochentwickelte L sung f r Entwick lungen von serverseitigen Webanwendungen darstellt Wir hoffen dass sie Ihnen helfen die Gesch ftsleitung und Kollegen von PHPs Vorteilen zu ber zeugen 8 1 BizChek com Vielleicht wussten Sie dass HotMail eine Microsoft Firma auf ihren Servern FreeBSD verwendet Es w re zwar sch n wenn wir eine Fallstudie h tten die zeigt dass Microsoft PHP f r seine webbasierten Mails verwendet aber wir haben etwas zumindest Gleichwertiges BizChek com www bizchek com Der f hrende Anbieter webbasierter Emails f r Firmen verwendet PHP Mit Kun den wie Budweiser und Micro Warehouse sowie ber zwei Millionen regist rierten Benutzern ist BizChek com einer der wichtigsten Akteure im kommer ziellen Bereich Nicht genug damit Mark Musone CTO bei Chek Inc der Mutterfirma von BizChek com ist ein aktiver PHP Entwickler Er hat solch n tzliche Module wie IMAP und MCAL geschrieben oder mitgeschrieben die inzwischen zur Standarddistribution von PHP geh ren 8 1 1 Web Mail Mit mehr als 70 Angestellten von denen acht Programmierer sind ist Biz Chek ein wichtiger Anbieter im Bereich der webbasierten E Commerce Intra net Marktes Zusammen mit dem Rest von Ch
614. von Psychologen oder Tauglichkeitsexperten durchge f hrt welche die Tester auf Video aufnahmen und anschlie end die Aufzeich nungen ausf hrlich analysierten Auch diese anspruchsvolle Methode ist kos tenintensiv und wirkt m glicherweise auf einige Entwickler einsch chternd Es ist jedoch auch m glich einen Test ohne die anspruchsvolle Testumgebung 214 Pearson A ADDISON WESLEY Education Die Bedeutung der Tauglichkeit durchzuf hren Dazu brauchen Sie nur einige reale Benutzer denen Sie typi sche Testaufgaben geben und die Sie bitten w hrend der Durchf hrung der Testaufgabe laut zu denken Bei den vereinfachten Tests brauchen Sie idealer weise drei bis f nf Benutzer w hrend herk mmliche Verfahren 10 oder mehr Benutzer erfordern um zuverl ssige Ergebnisse zu erhalten Das Hauptaugenmerk der einfachen Tauglichkeitspr fung besteht jedoch nicht im Sammeln von statistisch g lti gen Daten sondern ist darauf ausgerichtet Probleme in Bezug auf die Taug lichkeit so schnell wie m glich zu finden Tats chlich zeigen Studien dass die meisten Tauglichkeitsprobleme innerhalb der ersten Tests aufgesp rt werden k nnen Anstatt die Testperson per Video aufzuzeichnen halten die Versuchsbeobach ter das Verhalten der Benutzer auf Papier fest Das Aufzeichnen Ansehen und Analysieren von Videob ndern ist teuer und erfordert mindestens eine zus tzliche Person welche die Kamera bedient Die Analyse der Papiernoti zen geht
615. von ausgegangen dass Sie zur Implementierung eines Chatservers auch einen Netzwerk Server implementieren m ssen Dies ist zwar die Rich tung in die wir Sie tats chlich f hren wollten aber Sie m ssen ihn nicht selbst entwickeln Es gibt bereits gut geschriebene Serversoftware f r alle Systeme Warum verwenden Sie also nicht einen der bestehenden Server und melden Ihren Server im Netzwerk als Client an Alles was Sie tun m ssen ist im Netzwerk eine weitere Abstraktionsebene hinzuzuf gen wie Abbildung 3 4 demonstriert Der PHP Chatserver wird vom Webserver betrieben F r jede Client Verbin dung die er akzeptiert erzeugt er eine Client Verbindung zum IRC Server Auf diese Weise k nnen wir sicherstellen dass alle Daten die f r diesen Cli ent ankommen auch f r diesen Client gedacht sind und f r niemanden sonst 137 Pearson A ADDISON WESLEY Education 3 Programmentwicklung ein Praxisbeispiel Jeder Chat Vorgang hat nur einen einzigen Benutzer und muss sich nicht um die anderen Benutzer k mmern Die Benutzerkoordinierung die Kontrolle des Datenverkehrs usw wird vom IRC Server bernommen f r den wir ein fach einen der frei verf gbaren Server verwenden Ww Client I e gt R Client 2 b gt C lt gt Netzwerkverbindung Client amp ER S S 7 7 lt M gt Netzwerkverbindung y v e e Cieetn _ gt Abbildung 3 4 phpChat als Abstraktionseb
616. vs update TOC xml Aktualisiert Ihre lokale Kopie einer Datei oder eines Verzeichnisses cvs commit cvs commit TOC xm Sendet Ihre lokale Version der Dateien oder Verzeichnisse an den CVS Server cvs add cvs add TOC xml F gt eine neue Datei oder Verzeichnis auf dem CVS Server hinzu Die Aktion wird bei der n chsten bertragung durchgef hrt cvs remove cvs remove TOC xm L scht einen Datei oder ein Verzeichnis auf dem CVS Server Die Aktion wird bei der n chsten bertragung durchge f hrt Beachten Sie dass dieser Befehl eine Datei nicht tats chlich l scht Sie k nnen immer noch auf ltere Versionen zugreifen cvs status cvs status TOC xml Zeigt den Anderungsstatus Ihrer lokalen Version an cvs diff cvs diff TOC xm Zeigt die Unterschiede zwischen zwei Versionen einer Datei StandardmaBig werden die Unterschiede zwischen der lokalen Kopie und der Version im Zen tralarchiv angezeigt cvs log cvs log TOC xml Zeigt die CVS Protokollmeldung f r alle Versionen einer Datei an 248 Pearson vy ADDISON WESLEY Education Dreistufige Anwendungen 5 4 Dreistufige Anwendungen Bei gr eren Entwicklungsteams sind effektive Mittel zur Organisierung eines Projekts lebenswichtig Bisher haben wir Ihnen Verfahren gezeigt wie Sie Layout und Code trennen Verzeichnisstrukturen organisieren und ein Versionskontrollsystem zur Verwaltung des Quellcodes einsetzen Sobald die Sprache auf verteilte Entwic
617. webdev com lt VirtualHost gt Unser Trick funktioniert auch wenn der Apache Hauptserver dieser Adresse zugeordnet ist Das Geheimnis besteht darin die Sitzungskennnummer im Hostnamen selbst zu verschliisseln Bei der ersten Anfrage an das Programm wird die Sitzungs kennnummer erstellt und der Client wird an die neue URL umgeleitet die den gekennzeichneten Hostnamen enth lt Dies sieht folgenderma en aus 355elbce8828d4fb5c83cle35ad02caa phpwebdev com Der Vorteil liegt klar auf der Hand Solange Sie in Ihrem Programm relative Links verwenden brauchen Sie sich nicht l nger mit der manuellen Ande rung von URLs herumzuschlagen 173 Pearson A ADDISON WESLEY Education 4 Webanwendungskonzepte Wir haben die bereits erw hnte Funktion zum Sitzungsstart so modifiziert dass sie die Sitzungskennnummer aus dem Hostnamen extrahiert function session_start_from_host host global HTTP_HOST PHP_SELF ereg 0 9a z 32 HTTP_HOST regs session_id regs 1 if lisset session_id empty session_id srand double microtime 1000000 session_id md5 uniqid rand destination http session_id host PHP_ SELF header Location destination session _id session id session _start 4 1 6 Ein Kompromiss f r die Praxis Sie haben mehrere Methoden zur Verbreitung der Sitzungskennnummer ken nen gelernt die mehr oder minder effektiv alle auch in realen Szenarien funk ti
618. wird die Konstante SID definiert 5 Wenn in der Client Anfrage ein externer HTTP Referer von einem nicht lokalen Standort angegeben und extern_referer_check beachten Sie das einzelne r in der PHP Konfiguration aktiviert ist wird die Sitzungs kennnummer abgelehnt und als ung ltig markiert Mit dieser Mafsnahme wird eine zus tzliche Sicherheit erreicht da es verhindert dass Benutzer von anderen PHP Websites eine Sitzung bernehmen was jedoch auf grund des Algorithmus der f r die Generierung der Sitzungskennnum mer verwendet wird recht unwahrscheinlich ist Im Allgemeinen wird die Konstante SID immer dann definiert wenn die Sit zungsbibliothek nicht sicher wei ob der Client Cookies unterst tzt in ande ren Worten solange keine Sitzungskennnummer im Array HTTP_COOKIE_VARS gefunden wird Wenn bei all diesen berpr fungen keine Sitzungskennnummer gefunden oder diese abgelehnt wurde sollten Sie eine neue Sitzung starten in der eine neue Sitzungskennnummer vergeben wird Wenn eine g ltige Sitzungskennnummer vorhanden ist werden die eingefro renen Variablen der Sitzung aktiviert und in den globalen Namensraum wie der eingefiihrt Sitzungsvariablen lassen sich genauso leicht handhaben wie GET POST Variablen Wenn Sie eine Variable namens foo registrieren wird foo nach dem Aufruf von session_start automatisch als globale Variable zur Verf gung gestellt Au erdem wird sie dem globalen Array HTTP_SESSION_ VARS h
619. wurde das Web erheblich verbessert Pl tzlich k nnen Anwendungen miteinander reden sie haben sich von geschlossenen propriet ren Websites zu einer neuen Generation von verdrahteten Gesch ftsanwendungen entwickelt Webanwendungen k nnen eine API zur Verf gung stellen oder Datenstruk turen verf gbar machen Damit wird der Datenaustausch zwischen verteilten Servern m glich WDDX bietet eine m gliche L sung zum Austausch von strukturierten Daten WDDxX besteht aus zwei Teilen ein Teil befasst sich mit der Abstrahierung von Daten in eine XML Darstellung den sogenannten WDDX Paketen der andere Teil bersetzt Datenstrukturen in und aus einer Skriptumgebung sowie WDDX Pakete WDDX dient nicht zum Fernaufruf von Prozeduren Es gibt im reinen WDDX keine M glichkeit auf dem Server eine Funktion aufzurufen die ein WDDX Paket zur ckgibt Wie Sie Pakete bertragen bleibt Ihnen berlassen WDDX verf gt daher auch ber keine Sicherheitsfunktionen Es ist Ihre Aufgabe einen Kommunikationskanal auszuw hlen der ber die entsprechende Sicherheit verf gt und nur berechtigten Personen Zugriff auf den WDDX Teil Ihres Systems gew hrt 341 Pearson A ADDISON WESLEY Education 7 Anwendungen der Spitzentechnologie 7 3 3 M gliche Szenarien Ob zur Synchronisierung von Daten zur Zentralisierung von Datendiensten oder zur Durchf hrung von Gesch ftskommunikationen der strukturierte Datenaustausch er ffnet eine neue Dimension d
620. y value each my_array print Key key Value value lt br gt XY Netscape Iof x File Edit View Go Communicator Help Looping without resetQ First loop Key Landon Value 1 Key Graeme Value 2 Second loop Key Tobias Value 3 Key Til Value 4 Document Done 36 325 AP EJ Z Abbildung 2 5 Verwendung von each in Verbindung mit reset 72 Pearson A ADDISON WESLEY Education Array Funktionen XY Netscape Mi Ei 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 W3 AD Fal 4 Z 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 Schltissel 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 geb
621. y 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 Pearson A ADDISON WESLEY Education Array Funktionen XY Netscape olx File 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 3 S25 AP Zu 7 Abbildung 2 2 R ckgabewerte 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 konnten auch folgendes Array haben Schl ssel Index Wert 0 Landon 3 Graeme 4 Tobias 10 Till Bei diesem Array sind nur die Indizes 0 3 4 und 10 in Gebrauch der Rest ist einfach nicht zugeordnet Mithilfe der Funktion cou
622. zess nachsehen kann Da das Shared Memory nur im RAM agiert ist er extrem schnell und ben tigt fast keine zus tzlichen Kapazit ten Bei dieser Option sucht jeder Chat Prozess seine eigene Variable im Shared Memory und gibt nur dann eine Anfrage an die Datenbank aus wenn er die Variable findet die vom Benutzereingabefeld gesetzt wurde Warum basiert der Datenaustausch letztendlich doch auf einer Datenbank Finden Sie einige Antworten Die Datenbank wird haupts chlich aus einem Grund verwendet Das Shared Memory wird standardm ig nicht von PHP unterst tzt Sie m ssten in PHP daf r extra eine Unterst tzung programmieren Viele Leute die auf einen PHP f higen Server zugreifen haben jedoch nicht die M glichkeit PHP neu zu programmieren da sie nur Speicher auf dem Server gemietet und so nicht die entsprechenden Rechte haben M glicherweise ben tigen aber auch andere genau diese vorhandene PHP Einstellung Wenn wir die Datenbank als endg ltigen Datenaustauschpfad beibehalten k nnen wir das Shared Memory als optionale Optimierung verwenden Diejenigen die ihn nicht nut zen k nnen deaktivieren ihn einfach und haben trotzdem noch eine funktio nierende Version des Chatservers auch wenn sie sich mit einer sub optimalen L sung zufrieden geben m ssen Wenn Sie ein Programm erstellen das f r eine weite Verbreitung gedacht ist bedenken Sie dass nicht jeder dieselbe Einstellung hat wie Sie und m glicher weise nicht in der Lage
623. zess verwendet werden k nnen Die n tzlichsten hiervon sind in Tabelle 9 18 beschrieben Makro Beschreibung AC_MSG_CHECKING Nachricht Gibt w hrend der Ausf hrung von configure einen berpr fenden lt Nachricht gt Text aus AC_MSG_RESULT Wert Gibt das Ergebnis von AC_MSG_ CHECKING aus als Wert sollte entweder yes oder no angegeben sein AC_MSG_ERROR Nachricht Gibt die Nachricht w hrend der Ausf hrung von configure als Fehlermeldung aus und bricht das Skript ab AC_DEFINE Name Wert F gt define in php_config h mit dem Wert Beschreibung value und einem Kommentar hinzu der aus der Beschreibung besteht dies ist sinnvoll bei be dingter Kompilierung Ihres Moduls Tab 9 18 M4 Makros f r config m4 436 Pearson vy ADDISON WESLEY Education Referenz Einige Konfigurationsmakros Makro Beschreibung AC_ADD_INCLUDE Pfad F gt einen Include Pfad f r einen Compiler hinzu wird beispielsweise verwendet wenn das Modul Suchpfade f r Headerdateien hinzu f gen muss AC_ADD LIBRARY WITH PATH Bi Gibt eine zus tzliche zu verkn pfende Biblio bliotheksname Bibliothekspfad thek an AC_ARG_WITH Modulname Ein recht machtiges Makro welches das Modul Beschreibung nicht bedingter mit der Beschreibung in der Ausgabe configure Test bedingter Test help hinzuf gt PHP berpr ft ob die Option with lt modulename gt an das Configure Skript bergeben wurde Wenn
624. zu m ssen Sie lediglich ber den PHP Interpreter ww server com cgi bin php secret directory file html aufrufen HTML erm glicht Ihnen sogar file html anzusehen wenn secret directory durch eine htaccess Datei gesch tzt ist Auf dem Apache Server k nnen Sie dieses Problem vermeiden indem Sie bei der Kompilierung von PHP enable force cgi redirect aktivie ren Ausf hrliche Information zu diesem Thema finden Sie im PHP Hand buch im Installationsabschnitt Die Wahl einer sicheren Installation ist allerdings nur der erste Schritt Ein guter Programmierer beh lt die Sicherheit w hrend des gesamten Entwick lungsprozesses im Auge Es gibt so viele potenzielle Risiken dass wir nicht alle in diesem Kapitel behandeln k nnen Wir k nnen lediglich versuchen Ihnen ein paar allgemeing ltige Tipps zu geben 4 2 1 Vertrauen Sie dem Web nicht Alle Daten die vom Web kommen sind unsicher und sollten von Ihrem Pro gramm berpr ft werden Es gibt beispielsweise keine Garantie dass Ihr Skript ber die passende Formular Schnittstelle aufgerufen wurde Benutzer k nnten das HTML Formular einfach umgehen und das Skript direkt aufru fen indem sie m glicherweise ber ihr eigenes GET oder POST Parameter spezi fizieren 186 Pearson A ADDISON WESLEY Education Sicherheitsaspekte Die berpr fung von Formulardaten ist eine der erm dendsten Aufgaben die ein Webanwendungs Entwickler bei seiner t glichen Arbeit erledigen muss Di
625. zu sagen Eingebaute Module sind hnlich aufgebaut wie dynami sche Module Mit den hier pr sentierten Informationen sollten Sie in der Lage sein Probleme zu bew ltigen die in den Quelldateien der PHP Module auf treten In den folgenden Abschnitten gehen wir darauf ein wie Sie die PHP Interna verwenden um leistungsf hige Erweiterungen zu generieren 9 11 Annahme von Argumenten Einer der wichtigsten Aspekte bei Spracherweiterungen betrifft die Annahme und Handhabung von Daten die durch Argumente bergeben werden Die meisten Erweiterungen dienen zur Verarbeitung spezieller Eingabedaten oder ben tigen Parameter zur Durchf hrung ihrer spezifischen Aktionen Funktionsargumente sind eigentlich die einzig wahre M glichkeit um Daten zwischen der PHP und der C Ebene auszutauschen Nat rlich gibt es auch 393 Pearson A ADDISON WESLEY Education 9 Erweiterung von PHP 4 0 Knacken wir den PHP Kern noch die M glichkeit Daten ber vordefinierte globale Variablen auszutau schen hierauf gehen wir sp ter ein dies sollten Sie jedoch unter allen Umst nden vermeiden da es von schlechter Programmierpraxis zeugt Ein zelheiten finden Sie in Kapitel 1 Entwicklungskonzepte PHP verwendet keine formalen Funktionsdeklarationen daher ist die Auf rufsyntax stets vollst ndig dynamisch und wird nicht auf Fehler berpr ft Die berpr fung der Aufrufsyntax bleibt dem Benutzer berlassen Zum Beispiel kann eine Funktion ein
626. zusammenzufassen sollten Sie berlegen ob Sie ein anderes Datenformat verwenden k nnen Zur Kodierung von Datum und Zeit k nnen Sie beispielsweise den bin ren Dezi malcode BCD Binary Coded Digits oder das Timestamp Format f r UNIX verwenden In beiden F llen werden die erforderlichen Variablen in eine ein zige gepackt BCD ist zum Teil immer noch weit verbreitet aber im Falle von PHP das urspr nglich auf einer UNIX hnlichen Plattform entwickelt wurde dominiert ganz klar die Timestamp Methode siehe Listing 1 13 Sollte Ihnen dieses Verfahren nicht gel ufig sein Timestamps z hlen die Sekunden die seit Mitternacht des 1 Januar 1970 UTC vergangen sind Sie werden als Dezi malzahl in 32 Bit Schreibweise ausgedr ckt Dies f hrt zu einem berlauf im Jahr 2106 Da PHP nicht auf die 32 Bit Schreibweise f r die Erfassung der Timestamps festgelegt ist k nnte es die Gr e der Timestamps auf 64 Bit ndern und w re damit Jahr 2106 fest Ihr Programm wird es nicht bemerken Ein weiterer Vorteil von Timestamps besteht darin dass ein Gro teil der PHP Funktionen diese wieder in f r den Menschen lesbare Daten zur ckverwan delt Damit k nnen Sie mit Timestamps leichter Berechnungen anstellen Um beispielsweise die Zeitdifferenz zwischen zwei Ereignissen festzustellen brauchen Sie nur ein Timestamp vom anderen abzuziehen void calendar_add_event int timestamp string description void calendar _delete_event int timestamp int s
627. zutauschen Wenn eine Datenbank f r irgendetwas nicht konzipiert wurde dann daf r Kein Wunder also dass sie keine optimale Leistung erbrachte Der Engpass ist der Overhead d h die Zeit die f r den st ndigen Verbindungsauf und abbau ben tigt wird Das Dateisystem erbrachte eine schlechte Leistung weil es nicht f r diese Ver wendung konzipiert wurde Dar ber hinaus gab es weitere Begrenzungen PHP hat keine optimalen Methoden f r den Dateisystemzugriff Um die Exis tenz einer Datei zu berpr fen muss st ndig der Cache Speicher gelesen und gel scht werden und wieder entsteht ein gro er Overhead f r eine einfache Aufgabe Warum verwenden wir also nicht etwas vollkommen anderes Wir sind sicher nicht die Ersten die eine prozess bergreifende Kommunikation verwalten m ssen Hierf r m ssen andere schon gute L sungen entwickelt haben Damit kommen wir zur n chsten M glichkeit Semaphore Semaphore machen genau das was wir wollen Sie funktionieren als Signale Es handelt sich hierbei um Z hler die im gemeinsam genutzten Speicher dem sog Shared Memory abgelegt werden Sie k nnen ein Semaphor erfassen und damit seinen Z hler hochsetzen oder ihn freigeben womit sein Z hler herabgesetzt wird Au erdem k nnen Sie darauf warten dass ein Semaphor frei wird d h dass sein Z hler zur ck auf Null f llt Dieses Verfahren hat jedoch einen Nachteil Semaphore dienten urspr nglich dazu Ressourcen zu sperren um

Download Pdf Manuals

image

Related Search

Related Contents

Bertazzoni PM36 5 00 X hob  Install Sheet - Xtreme Diesel Performance  Toshiba Satellite P30 P35 Series Notebook  FortiOS v4.0 MR3 Patch Release 10 Release Notes  Fiche PDF expo - Le Clan des Songes  2004 WW PS Owners Manual  Toastmaster TECC 4224 User's Manual  ONKYO SERVICE MANUAL  Philips 196V4LSB2/78  Accounting Software For Horse Owners  

Copyright © All rights reserved.
Failed to retrieve file