PHP OOP, Design Patterns und UML Marco Skulschus Page Controller ataTwo-Step-View Transfer Object Row Data Mapper Transaction Script Application Controller Data Gateway Table Module Transform View Front Controller bietet dem Programmierer die Moeglichkeit, PHP obje eCase Interface tiert und unter Einsatz von gaengigen objektorientie Klasse entkoppelun Entwurfstechniken zu verwenden. Dieses Buch will An Abstraktion Design Patterns ngern in der OOP, die aber gleichzeitig fortgeschritten Programmierer sind, UML die OOP anhand eflection Vererbung Syntax erlaeutern. Nach einerPrinzipien Darstellung der der neu bietet dem Programmierer die Moeglichkeit, PHP objekttiert und unter Einsatz von gaengigen objektorientierntwurfstechniken zu verwenden. Dieses Buch will Angern in der OOP, die aber gleichzeitig fortgeschrittene Programmierer sind, die OOP Prinzipien anhand der PHP OOP, Design Patterns und UML Marco Skulschus Webseite zum Buch: www.comelio-medien.com/buch-katalog/php/php_und_oop © Comelio Medien 2012 Alle Rechte vorbehalten. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jeder Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Das gilt insbesondere für die Vervielfältigung, Übersetzung, Mikroverfilmung und die Einspeicherung und Verbreitung in elektronischen Systemen. © Comelio GmbH Comelio GmbH Goethestr. 34 D-13086 Berlin Fon:+49 (0) 30-8 14 56 22-00 Fax:+49 (0) 30-8 14 56 22-10 www.comelio-medien.com [email protected] Umschlaggestaltung, Comelio-Grafiken, Layout & Satz: Nadine Kilian ISBN 978-3-939701-66-8 Inhaltsverzeichnis Inhaltsverzeichnis 1. Einfache Klassen 17 1. 1. Aufbau einer Klasse 18 1. 1. 1. Eigenschaften und Methoden 18 1. 1. 2. Konstruktoren und Destruktoren 27 1. 1. 3. Zugriffsschutz und Zugriffsmethoden 31 1. 2. Erweiterte Klassenstrukturen 39 1. 2. 1. Statische Methoden und Eigenschaften 39 1. 2. 2. Konstanten 45 1. 3. Klassenverbünde 49 1. 3. 1. Klassen kombinieren 49 1. 3. 2. Referenzen verstehen und beherrschen 56 1. 3. 3. Algorithmen auslagern 60 2. Erweiterte Klassen 66 2. 1. Vererbung 66 2. 1. 1. Einfache Vererbung 67 2. 1. 2. Programmierung auf eine Schnittstelle hin 74 2. 1. 3. Dynamische Bindung und Polymorphismus 88 2. 2. Abstraktion 92 2. 2. 1. Vererbungshierarchie und Prinzip 93 2. 2. 2. Klienten 99 2. 2. 3. Beziehungen zwischen Klassen 104 2. 3. Schnittstellen 108 2. 3. 1. Einfache Verwendung 108 2. 3. 2. Mehrfache Implementierung 116 3. Das UML-Klassendiagramm 119 3. 1. Grundlagen 119 3. 1. 1. Definition 119 3. 1. 2. Einsatz der UML in PHP 123 3. 1. 3. UML als Modellierungswerkzeug 126 5 Inhaltsverzeichnis 3. 2. Einfache Klassen und Verbünde 126 3. 2. 1. Einfaches Klassendiagramm 126 3. 2. 2. Statische Mitglieder und Konstanten 128 3. 2. 3. Beziehungen zwischen Klassen 129 3. 3. Klassenhierarchien 132 3. 3. 1. Vererbung 132 3. 3. 2. Abstraktion 136 3. 3. 3. Schnittstellen 138 3. 4. Beziehungen zwischen Klassen 139 3. 4. 1. Assoziation 139 3. 4. 2. Aggregation 140 3. 4. 3. Komposition 141 4. PHP-Spezialitäten 143 4. 1. Magische Methoden 143 4. 1. 1. Überladung von Eigenschaften 144 4. 1. 2. Überladung von Methoden 147 4. 1. 3. Zustand überprüfen 150 4. 1. 4. Zeichenkette-Ausgabe 154 4. 1. 5. Serialisierung 156 4. 1. 6. Klassen exportieren 161 4. 1. 7. Klassen automatisch laden 162 4. 2. Ausnahmen 163 4. 2. 1. Standard-Ausnahmen 165 4. 2. 2. Abgeleitete Ausnahmen 169 4. 3. Reflection 172 4. 3. 1. Einfache Reflection 173 4. 3. 2. PHP5-Reflection 183 4. 3. 3. Dynamische Instanziierung 192 5. Entwurfsmuster des Standardkatalogs (GoF) 197 5. 1. Erzeugung 197 5. 1. 1. Singleton 200 5. 1. 2. Einfache Fabrik und Fabrikmethode 204 5. 2. Struktur 211 5. 2. 1. Dekorierer 211 5. 2. 2. Kompositum 217 5. 2. 3. Adapter 222 5. 2. 4. Fassade 227 6 Inhaltsverzeichnis 5. 3. Verhalten 232 5. 3. 1. Befehl 232 5. 3. 2. Schablonenmethode 241 5. 3. 3. Besucher 246 5. 3. 4. Strategie 249 6. Mehrschichtigkeit 253 6. 1. Architekturvarianten 253 6. 1. 1. Einführung 254 6. 1. 2. Zwei Schichten 260 6. 1. 3. Drei Schichten 261 6. 1. 4. Vier und mehr Schichten 262 6. 1. 5. Übersicht 265 6. 2. Umsetzung in PHP 266 6. 2. 1. Prozedurale Lösung mit Arrays 268 6. 2. 2. Objektorientierte Variante 278 6. 2. 3. XML 290 6. 2. 4. WebServices 302 7. Enterprise Application Muster 319 7. 1. Basis-Muster 319 7. 1. 1. Registry 320 7. 1. 2. Weitere Basis-Muster 323 7. 2. Datenzugriffsschicht 324 7. 2. 1. Active Record 324 7. 2. 2. Data Mapper 332 7. 2. 3. Row Data Gateway 339 7. 2. 4. Table Data Gateway 346 7. 2. 5. Beziehungen 351 7. 2. 6. Sonstige Muster 356 7. 3. Domänenlogik 360 7. 3. 1. Allgemeine Überlegungen 360 7. 3. 2. Transaction Script 363 7. 3. 3. Domain Model 366 7. 3. 4. Table Module 370 7. 3. 5. Service Layer 372 7. 4. Präsentationsschicht 374 7. 4. 1. Page Controller 374 7. 4. 2. Front Controller 376 7 Inhaltsverzeichnis 7. 4. 3. Transform View 377 7. 4. 4. Two Step View 380 8. Planung mit Use Cases 383 8. 1. Darstellung der Use Case-Technik 383 8. 1. 1. Einführung 384 8. 1. 2. Basismethodik 385 8. 1. 3. Format der Anwendungsfälle 395 8. 2. Anwendungsfälle in Text und UML 396 8. 2. 1. Anwendungserzählungen 397 8. 2. 2. Tabellarische Anwendungsfälle 399 8. 2. 3. Use Case-Diagramm der UML 402 8. 2. 4. Aktivitätsdiagramm der UML 410 8 Vorwort Vorwort Vorwort Herzlich willkommen zu einem Fachbuch von Comelio Medien, ein Bereich der Comelio GmbH. In diesem Buch finden Sie als PHP-Programmierer eine eingehende Darstellung, wie Sie in Zukunft PHP objektorientiert programmieren können, und übersichtliche Abhandlungen über zusätzliche Techniken der OOP-Verwendung. Zu dieser Reihe Diese Buchreihe konzentriert sich auf verschiedene Aspekte der Programmierung mit Hilfe von PHP. Dabei stehen eher spezialisierte Themen wie PHP und XML, Objektorientierung und Muster sowie spezielle Datenbanksysteme wie Oracle im Vordergrund. Autor Marco Skulschus (Jahrgang 1978) studierte Ökonomie in Wuppertal und Paris. Während des Studiums arbeitete er als Programmierer bei einem Internet-Startup und dann als Trainer/Berater für verschiedene IT-Unternehmen, bis er zu seinem heutigen Arbeitgeber kam. Bei der Comelio GmbH ist er im Bereich Softwareentwicklung tätig und plant betriebswirtschaftliche Software im Bereich Auswertungen und Reporting. Er interessiert sich besonders für XML und Datenmodellierung, wobei er hier auch fortgeschrittene Techniken wie Ontologien verwendet. Er hat bereits eine ganze Reihe von Büchern herausgebracht und blickt auf vier Bücher zum Thema XML (darunter XML Schema, XSLT und XSL-FO) sowie auch vier Bücher zur Software-Entwicklung mit Oracle, in denen die Themen SQL, PL/SQL und XML-Integration behandelt werden. Im Bereich PHP begann er seine AutorenTätigkeit mit einem Grundlagen-Buch zu PHP und MySQL sowie einem Werk zu Standard-SQL. Zurzeit sind von ihm zusammen mit diesem Buch drei Bücher zur PHP-Programmierung bei Comelio Medien erhältlich. 10 Vorwort Aufbau des Buchs Die einzelnen Kapitel begleiten den Leser dabei, zunächst die objektorientierte Syntax in PHP 5 sowie die allgemeinen Prinzipien und Techniken bei der Erstellung von Klassen, Schnittstellen, Vererbungshierarchien sowie die speziellen PHPTechniken zu erlernen. Dann folgt ein großer Teil mit mehreren Kapiteln, in dem diese neuen Fähigkeiten dann um zusätzliche Techniken des objektorientierten Entwurfs mit Entwurfsmustern, dem Konzept der Mehrschichtigkeit sowie der Planung mit Anwendungsfällen und der Dokumentation mit der UML (Unified Modeling Language) erweitert werden. 1. Das erste Kapitel zeigt, wie man überhaupt in PHP eine Klasse mit Eigenschaften und Methoden erstellt, wie diese Klassen-Mitglieder zusammenarbeiten und wie man auf Basis einer solchen Klasse Objekte erstellt und verwendet. Es zeigt die Nützlichkeit von Zugriffsmethoden (Getter-/Setter-Methoden), den Einsatz von Konstruktoren und Destruktoren sowie statische Eigenschaften und Methoden und die Verwendung von Konstanten. Neben der allgemeinen Programierung in PHP enthält es auch einfache Überlegungen zum Aufbau solcher einfachen Klassen. 2. Das zweite Kapitel beschäftigt sich mit den erweiterten Techniken des Klassenaufbaus. Hier findet man solche Themen wie Vererbung von gewöhnlichen und abstrakten Eltern-Klassen, den Einsatzbereich von Abstraktion sowie die Entwicklung und Implementierung von Schnittstellen (Interfaces). Es zeigt sehr ausführlich, wie die verschiedenen Techniken miteinander kombiniert werden können. Dabei beschäftigt man sich als Leser beispielhaft mit den Themen Polymorphismus (Vielgestaltigkeit), dynamische Bindung, Substitutionsprinzip der OOP und verschiedenen allgemeinen objektorientierten Entwurfstechniken. 3. Auf Basis der in den ersten beiden Kapiteln erarbeiteten Syntax-Techniken hilft das dritte Kapitel, den Überblick im geplanten oder schon programmierten Klassensystem zu behalten. Dabei stellt es das Klassendiagramm der UML vor. Nach einer kurzen Einführung in die Unified Modeling Language folgen die Beispiele aus dem ersten beiden Kapiteln in einer grafischen Aufbereitung, sodass man einen Vergleich zwischen Syntax und modellhafter Abbildung im Klassendiagramm hat. 11 Vorwort 4. PHP bietet immer noch nicht alle Syntax-Möglichkeiten, die bspw. in Java oder .NET genutzt werden können, aber es sind einige Besonderheiten vorhanden, die einen Teil der fehlenden Techniken ausgleichen. Das vierte Kapitel konzentriert sich daher genau auf diese Techniken wie bspw. die magischen Methoden für Überladung. In einem zweiten Teil zeigt es dann die neuen Techniken für die Entwicklung und Nutzung von Ausnahmen zur besseren Fehlerbehandlung, die Serialisierung/Deserialisierung sowie die umfangreichen Reflection API, mit der man zur Laufzeit sämtliche objektorientierten Konstrukte (Klassen, Schnittstellen, Objekte) untersuchen und verwenden kann. 5. Da man nach dem vierten Kapitel eine umfassende Basis über alle objektorientierten Techniken von PHP gewonnen hat, zeigt das fünfte Kapitel dem Leser, wie man wiederkehrende Probleme beim objektorientierten Entwurf mit Entwurfsmustern (Design Patterns) lösen kann. Dabei konzentriert sich dieses Kapitel auf den GoF-Katalog (Gang of Four) an Entwurfsmustern. Es enthält eine Auswahl an in PHP sinnvoll einsetzbaren Mustern wie u.a. Schablonenmethode, Adapter, Besucher, Kompositium, Befehl. 6. Das sechste Kapitel führt mit einer Reihe von Beispielen und einem ausführlichen theoretischen Fundament den Begriff und das Konzept der Mehrschichtigkeit ein. Es bildet dabei eine Überleitung zu den Entwurfsmustern für Unternehmensanwendungen des siebten Kapitels und stellt so eine Brücke zur erfolgreichen Anwendung der Objektorientierung in PHP-Anwendungen dar. Als Beispiel wird gezeigt, wie eine mehrschichtige Software mit Arrays, Objekten, XML und auch mit Web Services erstellt wird. Der Bereich Web Services wird durch eine ausführliche theoretische Erläuterung abgerundet. 7. Das siebte Kapitel setzt den Gedanken der Mehrschichtigkeit fort und liefert eine teilweise beispielhafte Einführung in die Entwurfsmuster für Unternehmensanwendungen. Dabei enthält es auch mit PHP sinnvoll und gut umsetzbare Muster für die Datenzugriffs-, Geschäftslogik- und Präsentationsschichten. 8. Im achten Kapitel wird schließlich mit Hilfe der Anwendungsfallanalyse (Use Cases) eine Technik vorgestellt, mit der Software geplant und sowohl in Textform (Use Cases, Anwendungserzählungen) als auch mit Hilfe der UML (Use Case- und Aktivitätsdiagramm) dargestellt werden kann. 12 Vorwort Persönliches Vorwort Einige Leser wissen möglicherweise, dass ich meistens alles indirekt und ohne persönliche Ansprache formuliere, sodass ich hier extra ein persönliches Vorwort einfügen muss, um einmal kurz aus diesem Formulieren ausbrechen zu können. Ich beschäftige mich mit PHP professionell seit Veröffentlichung der Version 4 und habe in den vergangenen Jahren immer wieder in Büchern und Magazinen Techniken der PHP-Programmierung vorgestellt. Sogar mein allererstes Buch war ein klassisches Einsteigerbuch für PHP und MySQL. Laut aktuellem Plan werde ich ein solches Buch wohl erst zur nächsten Version schreiben, denn auch dieses ist ein Buch, das ich wie dieses OOP-Buch immer einmal bzw. noch einmal schreiben wollte. Wesentlich sind natürlich auch die vielen Seminare, die ich zur PHP-Programmierung und angrenzenden Themen wie Entwurfsmustern oder SoftwarePlanung seit Jahren durchführe. Als die Version 5 herauskam, gab es einen beeindruckenden Boom an Seminarund Beratungsanfragen zum Thema Objektorientierung, Planung und Programmierung im Team. Es ist nicht häufig, dass man ein Seminar erst dann konzipiert, wenn man es schon mehrfach durchgeführt hat oder man es erst dann als Standard-Thema anbietet, wenn eine Reihe von Kunden sich mehr mit der richtigen Themenauswahl und Präsentationsform beschäftigt haben als der Dozent - aber genau in diesem Bereich verhielt es sich so. Dass ich erst zwei Jahre später dazu kam, endlich die erste Auflage dieses Buch zu schreiben, war ein wenig ärgerlich, aber andererseits vielleicht auch ein besonderer Vorteil. Denn nur so konnte ich das, was ich PHP-Programmierern vermitteln wollte, auch am besten auswählen. Aus den vielen Seminarterminen zu diesem Thema sowie den vielen Besuchen bei PHP-Teams und Firmen, die ausschließlich PHP-Software erstellen, konnte ich den Inhalt so destillieren, dass ich meine, behaupten zu könnten, dass Sie eine sehr gute Quelle in der Hand halten, mit der Sie sich bedenkenlos in die Welt der Objektorientierung begeben können. Wenn man wie ich zwischen der Java/.NET- und PHP-Welt wandelt, dann kennt man nicht nur die vielen Diskussionen rund um Open oder Closed Source-Software, sondern natürlich auch die Vorbehalte oder Vergötterungen von prozeduralen oder objektorientierten Techniken. Im Buch finden Sie noch an verschiedenen Stellen persönliche Anmerkungen, sodass ich diese hier auf die beiden Allerweltssprüche „Es kommt darauf an“ und „Die Mischung macht´s“ reduzieren kann. Hätte ich das Buch unmittelbar nach Veröffentlichung der PHP 5-Version geschrieben, 13 Vorwort hätte ich vermutlich ausschließlich die neue Syntax beschrieben und Ihnen nebenbei auch noch versucht, ausführlich zu erklären, dass ein Gästebuch mit 200 Zeilen nur objektorientiert funktionieren kann. Mittlerweile sehe ich das durchaus differenzierter. Dass objektorientiertes Vorgehen die beste Technik darstellt, die man zurzeit bei der Anwendungsentwicklung nutzen kann, steht für mich ebenso wie ein Fels in der Brandung wie auch die Erkenntnis, dass man den Charakter von PHP weiterhin bei der Wahl der Werkzeuge berücksichtigen muss. Nicht jede OOP-Technik ist in PHP sinnvoll nutzbar, nicht jeder komplizierte Entwurf ist die beste Wahl, aber sobald eine Software ernsthaft und mit langem Lebenszyklus und einiger Komplexität entwickelt werden soll, sollte man allen alten Techniken den Rücken zukehren. Dabei kommt es aber nicht nur darauf an, überhaupt irgendeine Klasse zu formulieren und quasi ein prozedurales Programm in einer einzigen Methode zu formulieren und diese dann aufzurufen. Vielmehr finden Sie in diesem Buch nach der Darstellung der verfügbaren Syntax zum größten Teil ganz andere Themen, die direkt mit PHP nichts zu tun haben, sondern die ein Rüstzeug für die objektorientierte Arbeit auch in anderen Sprachen bieten, aber hier speziell für PHP-Programmierer von mir zusammen gestellt wurden. Themen wie die UML, Entwurfsmuster sowie Software-Planung lassen sich schlecht vollständig in einem einzigen Buch abhandeln, denn zu jedem dieser Themen könnte man sich ein eigenes Werk vorstellen. Ich habe allerdings versucht, die wesentlichen Inhalte beispielhaft und mit erklärenden Abbildungen so aufzubereiten, dass man sofort nach der Lektüre gute Werkzeuge in der Hand hält, mit denen man in jedem Fall bessere Software als in der Vergangenheit erstellen kann. Hat man dann mit dem Wissen, welches ich in diesem Buch vermittele, wiederum einen gewissen Weg hinter sich gebracht und neue – hoffentlich positive – Erfahrungen gesammelt, dann ist es Zeit für Literatur, welche die Themen, die ich bspw. in den Kapiteln zu Entwurfsmustern oder UML vermittele, deutlich umfangreicher darstellen. Online-Materialien Die Webseite zum Buch lautet: http://www.comelio-medien.com/buch-katalog/php/php_und_oop 14