OOP mit PHP 5
PHP Usergroup Köln/Bonn @ Com Center Köln 15. November 2003 "Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Wer ich bin • Informatikstudent in Bonn. • Mitglied des PHP Development Teams. • Autor von OpenSource- Projekten wie phpOpenTracker, PHPUnit oder XML Transformer. • Autor für verschiedene Fachmagazine. "Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Sprachmerkmale von PHP • Dynamische Typisierung. • Erlaubt prozedurale, aber auch klassenbasierte, objektorientierte Programmierung. • Eine objektorientiertes PHP Anwendung besteht aus einer Menge von PHP-Klassen, die in Quelltextdateien, die den Regeln der PHP Programmiersprache genügen, deklariert werden. • Diese Quelltextdateien werden vom PHP-Interpiler übersetzt und ausgeführt.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Sprachmerkmale von PHP • PHP funktioniert anders als Java, C# oder “richtige Compilersprachen” wie C/C++. • Seit PHP 4 wird zwar intern Bytecode erzeugt, dieser wird aber nach jedem Request “weggeworfen”. • Optimierungen des Bytecodes machen daher, zumindest ohne Verwendung eines Bytecode Caches, wenig Sinn. • Nicht nur die Kompilierung kostet Zeit, sondern vor allem die Initialisierung des Objektmodells.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Objektorientiertes PHP • Objektorientierte PHP-Anwendungen sind in der Regel langsamer als solche, die prozedural entwickelt wurden. • Im Web-Bereich gilt das Motto “Ein gutes Design ist wichtiger als Performance” nicht unbedingt so kategorisch, wie in der Offline-Welt. • Macht OOP mit PHP daher überhaupt Sinn? • Ja! Aber ...
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Objektorientiertes PHP • Erkenne OO{A|D|P} als Werkzeug, verkenne es nicht als Religion. • Kenne nicht nur den Nutzen, sondern auch die Kosten von OOP. • Abweichungen von der “reinen Lehre” (vergleichbar mit der “Denormalisierung” beim relationalen Datenbankentwurf) sind möglich, und können der Performance zuträglich sein.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Geschichte von OOP in PHP • PHP/FI (“PHP 1” und “PHP 2”): Keine objektorientierten Sprachmerkmale. • PHP 3: Erster Versuch, objektorientierte Programmierung in PHP zu ermöglichen. • PHP 4, Zend Engine 1: Verbesserte Unterstützung für objektorientierte Programmierung, aber stark limitiertes Objektmodell. • PHP 5, Zend Engine 2: Java-ähnliches, von Grund auf überarbeitetes Objektmodell.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
PHP 5 • ... bietet ein neues Objektmodell mit vielen neuen Sprachmerkmalen für OOP. • ... bringt eine verbesserte Unterstützung für XMLTechnologien auf der Basis der libxml2 und libxslt Bibliotheken des GNOME-Projektes. • ... verfügt mit SQLite über eine eingebettete Datenbanklösung. • ... ist fertig, wenn es fertig ist ;-)
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Warum OOP? • Modularisierung: Zerlegung des SoftwareSystems in autonome Einheiten. • Wiederverwendung: Bereits implementierte Einheiten sollen zu einem neuen Ganzen zusammengesetzt werden können. • Erweiterbarkeit: Bestehende Einheiten sollen um neue Funktionalität erweitert werden können. • Abstraktion und Kapselung: Der Verwender einer solchen Einheit nutzt deren öffentliche Schnittstelle, Implementierungsdetails werden versteckt. "Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Warum OOP?
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Klassen und Objekte • Klasse: Bauplan für die Erzeugung von Objekten. • Klasse kapselt Daten (Attribute) und Operationen (Methoden) in einer Einheit. • Jedem Objekt lässt sich eine Klasse zuordnen. • Den Objekten einer Klasse ist ihre Funktion gemeinsam, da sie über die selben Methoden verfügen. • Die Objekte einer Klasse unterscheiden sich nur in ihrem Zustand von einander.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Geheimnisprinzip • Trennung von Nutzungs- und Implementierungsschicht, von Realisierung und Nutzung. • Zu diesem Zweck wird den Attributen und Methoden einer Klasse bei ihrer Deklaration eine von drei möglichen Sichtbarkeiten zugewiesen.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Geheimnisprinzip • private kennzeichnet die lokale Sichtbarkeit. Das Element ist nur in der umgebenden Klasse sichtbar. • protected kennzeichnet die eingeschränkte Sichtbarkeit. Das Element ist nur in der umgebenden Klasse und deren Kindklassen sichtbar. • public kennzeichnet die öffentliche Sichtbarkeit. • Wird keines der drei Schlüsselwörter bei der Deklaration angegeben, so wird implizit public angenommen. "Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Klassen und Objekte
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Klassen und Objekte
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Klassen und Objekte
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
instanceof
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Class Type Hints
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Referenzen
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Klonen von Objekten
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Klassenkontext • Bislang: Attribute und Methoden im Objektkontext. • Jetzt: Attribute, Konstanten und Methoden ausserhalb des Objektkontextes.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Klassenkontext
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Klassenkontext
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Exkurs: Singleton-Pattern • Die Anzahl der Objekte einer Klasse soll beschränkt werden. • Oft ist nur ein Objekt, oder ein Pool mit einer festen Anzahl von Objekten, einer Klasse sinnvoll. • Deklaration des Konstruktors einer Klasse als protected oder private unterbindet die Verwendung des new-Operators. • An dessen Stelle tritt die Verwendung einer statischen Methode, die die Objekterzeugung kontrolliert.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Exkurs: Singleton-Pattern
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Abstrakte Klassen • Abstrakte Klassen überlassen die Implementierung einer oder mehrerer Methoden ihren Kindklassen. • Klassen mit abstrakten Methoden können nicht instanziert werden.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Exkurs: Template Method
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Exkurs: Template Method
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Schnittstellen • Schnittstellen helfen bei der Code-Strukturierung durch Zuweisung einer oder mehrere Rollen an eine Klasse. • Eine Klasse in PHP kann eine oder mehrere Schnittstellen (interface) implementieren. • Eine Klasse, die eine Schnittstelle implementiert (implements), muss deren vereinbarte Funktionalität bereitstellen.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Schnittstellen
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Konstruktor
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Destruktor
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Konstruktor und Destruktor
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Vererbung
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Vererbung
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Behandlung von Ausnahmen • Fehler werden als Ausnahmen vom Standardprogrammablauf verstanden. • Code, von dem man solche Ausnahmen erwartet, wird in einen try-Block gelegt. • Im Anschluss an diesen Block stehen ein oder mehrere catch-Handler, die die erwarteten Fehler behandeln.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Behandlung von Ausnahmen
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Interzeptoren • PHP 5 führt mehrere so genannter Interzeptormethoden ein, die bei bestimmten Ereignissen automatisch aufgerufen werden. • __autoload($className) • __get($memberName) • __set($memberName, $value) • __call($methodName, $parameters) • __toString()
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Migration von PHP 4 zu PHP 5 • • • • •
Kopie versus Referenz. Konstruktor. Klassendeklaration vor Objekterzeugung. Neue Schlüsselwörter. Besondere Methoden.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Iteratoren • Objekte können mit foreach() traversiert werden. • Im Standardfall iteriert foreach() über die Attribute des Objektes.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Iteratoren Interface [ interface Iterator implements Traversable ] { - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [5] { Method [ abstract public method current ] { } Method [ abstract public method next ] { } Method [ abstract public method key ] { } Method [ abstract public method hasMore ] { } Method [ abstract public method rewind ] { } } }
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Reflection API • PHP 5 bietet eine API für die strukturelle Reflektion (Introspektion) von Klassen, Schnittstellen, Methoden, und Funktionen. • Die Klassen dieser Reflection API implementieren eine __toString()-Methode, mit deren Hilfe man sich schnell einen Blick in "das Innere" des reflektierten Objektes verschaffen kann.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Reflection API
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/
Schleichwerbung ;-) • • • • • •
Objektorientierung. Entwurfsmuster. Application Server. Softwareintegration. dpunkt.verlag 2004. ISBN 3-89864-229-1.
"Objektorientierte Programmierung mit PHP 5" Sebastian Bergmann http://www.sebastian-bergmann.de/