Tải bản đầy đủ (.pdf) (30 trang)

PHP – Endlich objektorientiert- P9

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (476.6 KB, 30 trang )

3 – Vorgehensweise bei der Softwareentwicklung
210
Herr Müller erhält abschließend eine Bestätigung, dass die Buchung erfolgreich vorge-
nommen wurde.
Was haben Sie gelernt und wie geht es weiter?
In diesem Kapitel wurden zu Beginn verschiedene Vorgehensweisen dargestellt, wie Sie
bei der Abwicklung eines Projekts vorgehen können. Es existiert keine ultimativ sinn-
volle Vorgehensweise. Vielmehr ist die gewählte Vorgehensweise von der Größe der Pro-
jekte abhängig.
Die Objektorientierung eignet sich insbesondere für größere Projekte, da sonst ein
„Over-Design“ droht. Dazu existieren der Rational Unified Process als schwergewichti-
ges Modell sowie die agilen Methoden als dynamische, kommunikationsintensive Vari-
ante.
Im Anschluss daran wurden die Idee und die Grundbegriffe der Objektorientierung vor-
gestellt, die eine neue Denkweise bei der technischen Lösung von fachlichen Problemen
implizieren.
Im letzten Teil dieses Kapitels wurden die wichtigsten Diagramme der UML vorgestellt,
mit deren Hilfe Sie die Aspekte der objektorientierten Softwareentwicklung beschreiben
können. Die UML-Diagramme bieten dabei eine Diskussionsgrundlage für die iterativ-
inkrementelle Entwicklung und dienen zusätzlich zur Dokumentation der Entstehung
einer Lösung. Die einzelnen Diagramme bieten verschiedene Sichtweisen auf das Prob-
lem und auf die Lösung. Sie geben zusätzlich durch die Reihenfolge ihrer Anwendung
eine Anleitung, damit Sie sich der Problemlösung nähern können.
Alle in diesem Kapitel skizzierten Beispiele können Sie als Aufträge für die Implementie-
rung von PHP-Anwendungen sehen, die Sie mit den neuen Möglichkeiten von PHP 5
umsetzen können.
Im nächsten Kapitel werden Sie erfahren, wie Sie die vorgestellten Konzepte der Objekt-
orientierung und der Spezifikation der einzelnen UML-Diagramme in PHP implemen-
tieren können.
Meinung
Die eher am technischen Design orientierten Sequenzdiagramme können sehr gut


mit den eher an der fachlichen Analyse ausgerichteten Aktivitätsdiagrammen abge-
glichen werden. Dies gibt einen guten Anhaltspunkt, ob die fachlichen Vorgaben
sinnvoll technisch umgesetzt wurden oder nicht.
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
PHP – Endlich objektorientiert 211
PHP objektorientiert
Im zweiten Kapitel dieses Buches wurde die grundlegende Syntax der Sprache PHP vor-
gestellt. Diese Syntax und alle vorgestellten Befehle können natürlich auch im Rahmen
der Objektorientierung verwendet werden. Verzweigungen, Schleifen, Session-Hand-
ling, der Versand von E-Mails und auch die Befehle zur Datenbankanbindung stehen
nach wie vor zur Verfügung. In großen Projekten sollte der gesamte Zugriff auf solche
Ressourcen jedoch nur einmalig implementiert und in Objekte gekapselt werden.
Das dritte Kapitel präsentierte Vorgehensweisen bei der Abwicklung von Projekten
unterschiedlicher Größe und stellte im Anschluss die grundlegenden Begriffe objektori-
entierter Denkweise vor. Mit der UML 2 wurde eine Sprache vorgestellt, die als Diskus-
sionsgrundlage und zur Dokumentation von allen Beteiligten über das gesamte Projekt
hinweg angewendet werden kann. Bis zu diesem Punkt ist es noch unerheblich, welche
objektorientierte Sprache zur Implementierung eingesetzt wird. Anstelle von PHP kön-
nen ebenso ASP.NET oder JSP/Servlets zum Einsatz kommen.
In diesem Kapitel wird nun vorgestellt, wie man die bislang theoretisch beschriebenen
Konzepte der Objektorientierung mit PHP 5 umsetzen kann.
4.1 Umsetzung objektorientierter Grundlagen
Damit Sie die Umsetzung der objektorientierten Grundlagen, die in Kapitel 3.2.2 vorge-
stellt wurden, in PHP leicht nachvollziehen können, wird in diesem Kapitel eine Vielzahl
von kleinen Beispielen vorgestellt, die jeweils einzelne Aspekte der objektorientierten
Programmierung beschreiben. Im fünften Kapitel dieses Buches werden dann komple-
xere zusammenhängende Beispiele skizziert.
4.1.1 Die erste PHP-Klasse
Am Sinnvollsten ist es, direkt mit der Programmierung einer vollständigen Klasse zu
beginnen und diese Klasse dann in einer anderen PHP-Datei mit Objekterzeugung und

Ausgabe zu testen.
Eine private Eigenschaft
Die erste Klasse erzeugt einen Stift, der nur eine einzelne Eigenschaft besitzt. Er hat eine
Farbe, die als Zeichenkette festgehalten wird und nicht außerhalb des Objekts zugäng-
lich ist (private). Diese Datenkapselung unterscheidet die Objektorientierung von proze-
duralen Ansätzen und erhöht die Wartbarkeit und Modularität.
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
4 – PHP objektorientiert
212
In der Realität würde man auch eine Farbe als Objekt repräsentieren, das seinerseits drei
Eigenschaften hat. Dies könnten beispielsweise die Rot-, Grün- und Blauanteile der
Farbe sein. So würde man sicherstellen, dass man stets eine gültige Farbe erhält. In einer
Zeichenkette könnte die Farbe auch „Frank“ lauten, was jedoch keinen Sinn macht.
Konstruktor und Destruktor
Die Klasse besitzt außerdem einen Konstruktor, der zwingend einen Parameter erhält.
Dieser Parameter gibt eine Farbe von außen vor, die intern im Objekt abgelegt wird. Ein
Default-Konstruktor ist in diesem Beispiel nicht vorgesehen. Sie müssen bei der
Objekterzeugung also den Farbparameter angeben. In PHP 5 lauten alle Methoden, die
Konstruktoren für ein Objekt sind, __construct. Sie können diese Methode mehrmals mit
einer unterschiedlichen Anzahl an Parametern verwenden, sodass Sie mehrere mögliche
Konstruktoren für ein Objekt definieren können.
Zusätzlich besitzt die Klasse einen Destruktor, der beim Entfernen des Objekts aus dem
Arbeitsspeicher des Servers automatisch aufgerufen wird. Ein Destruktor wird über den
Aufruf __destruct definiert und ist stets parameterlos.
Get- und Set-Methoden
Zusätzlich erhält ein Stift zwei Methoden, die als Dienste von anderen Klassen aus ange-
sprochen werden können (public). Die erste Methode kann dem Stift eine neue Farbe
geben; es handelt sich um einen so genannten „Setter“, der eine Eigenschaft neu setzt.
Ob das Setzen des übergebenen Parameters erlaubt ist, kann die Klasse selbst in der Pro-
grammierung der Set-Methode entscheiden. Damit wird die Datenkapselung der Objek-

torientierung gewährleistet. Die zweite Methode gibt den Wert der Eigenschaft zurück.
Es handelt sich also um eine Get-Methode.
Abbildung 4.1 skizziert zunächst auf der linken Seite ein Stiftobjekt und auf der rechten
Seite das UML Klassendiagramm der Designphase.
Abbildung 4.1: Das erste zu erstellende Objekt und das passende Klassendiagramm
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Umsetzung objektorientierter Grundlagen
PHP – Endlich objektorientiert 213
Dieses Klassendiagramm wird nun direkt in PHP-Code umgesetzt. Die UML-Klassen-
diagramme in der Designphase sollten so präzise sein, dass Sie keine Möglichkeit zur
Interpretation mehr zulassen.
Da es keinen Sinn macht, eine Klassendefinition direkt zu verwenden und diese stets von
anderen PHP-Dateien eingebunden wird, sollte die Datei stift.inc.php genannt werden.
Was ist $this?
Bei allen Methoden fällt eine Variable $this auf, die in dieser Klasse nie definiert wird. Die
so genannte $this-Referenz existiert bei jedem Objekt und ist ein Zeiger auf sich selbst. Da
wir uns in der Klasse Stift befinden, können Sie über den Befehl $this->setFarbe($farbe) im
Meinung
Aus Erfahrung und zur Vergleichbarkeit mit anderen objektorientierten Sprachen
sollte jede Klasse in eine separate Datei geschrieben werden. Diese Datei sollte
genauso heißen wie der Name der Klasse.
<?php
class Stift{
private $farbe; // Eigenschaft des Stiftes

// Konstruktor
public function __construct($farbe){
echo('Ein Stift der Farbe '.$farbe.' wird erzeugt...<br>');
$this->setFarbe($farbe);
}


// Destruktor
public function __destruct(){
echo('Der Stift der Farbe '.$this->farbe.' ist jetzt zerstört.<br>');
}

public function getFarbe(){
return $this->farbe;
}

public function setFarbe($farbe){
$this->farbe=$farbe;
}
}
?>
Listing 4.1: Die erste Klasse stift.inc.php
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
4 – PHP objektorientiert
214
Konstruktor auf dem Objekt selbst einen Methodenaufruf tätigen. Dieser Selbstaufruf
wurde in den Sequenzdiagrammen (Kap. 3.2.6; Abläufe im technischen Modell:
Sequenzdiagramme) beschrieben.
Im zweiten Kapitel haben Sie bereits erfahren, dass Sie Variablen in PHP nicht vor der
Verwendung deklarieren müssen. Bei der prozeduralen Programmierung ist dies ein
angenehmes Verhalten, das Codezeilen einspart.
Bei der Methode setFarbe führt sie jedoch zu einem Problem. Sie müssen hier die Eigen-
schaft des Objekts, die privat deklariert ist, mit einem von außen übergebenen Parameter
$farbe überschreiben. PHP kann aber eine in der Methode lokal definierte Variable erst
einmal nicht von dem Zugriff auf eine deklarierte Eigenschaft des Objekts unterschei-
den. Wenn Sie auf die Eigenschaft zugreifen wollen, müssen Sie daher auch die $this-

Referenz verwenden, indem Sie mit dem Befehl $this->farbe=$farbe der Eigenschaft des
Objekts den von außen übergebenen Wert zuweisen. Der Zugriff auf die private Eigen-
schaft ist an dieser Stelle möglich, da Sie sich ja in der Klasse selbst befinden.
Die Objekterzeugung
Nachdem die Klasse als Bauplan für Objekte erstellt wurde, können Sie nun versuchen,
ein erstes Objekt dieser Klasse anzulegen. Dies funktioniert sehr leicht, indem Sie im ers-
ten Schritt eine zusätzliche PHP-Datei erstellen und die Klassendatei über require_once
einbinden. Eine mögliche mehrfache Einbindung würde zu einer mehrfachen Klassende-
klaration mit demselben Namen und damit zu einem Fehler führen.
Im HTML-Rumpf der PHP-Datei kann nun das erste Objekt angelegt werden. Für die
Erzeugung von neuen Objekten bietet PHP, wie auch die meisten anderen objektorien-
tierten Sprachen, das Schlüsselwort new an. Hinter diesem Schlüsselwort müssen Sie den
Namen der Klasse angeben, von der Sie ein neues Objekt anlegen wollen. Wenn Sie keine
Parameter angeben, wird der parameterlose Default-Konstruktor der Klasse aufgerufen.
Dieser existiert jedoch bei unserer Klasse nicht. Stattdessen müssen Sie eine Zeichenkette
als Parameter übergeben, der die Farbe des zu erstellenden Stiftes darstellt. In diesem
Fall wird ein schwarzer Stift erzeugt.
Der new-Operator gibt als Ergebnis eine Referenz auf das gerade erzeugte Objekt zurück,
die man wiederum in einer Variablen abspeichern kann. Diese Variable heißt hier $ein-
Stift.
<?php require_once("stift.inc.php"); ?>
<html><body>
<?php
// kein Default-Konstruktor erlaubt
// $einStift=new Stift();
$einStift=new Stift('schwarz');
echo('Farbe: '.$einStift->getFarbe().'<br>');
$einStift->setFarbe('blau');
echo('Farbe: '.$einStift->getFarbe().'<br>');
Listing 4.2: Die erste Objekterzeugung – ein Stift wird geboren

Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Umsetzung objektorientierter Grundlagen
PHP – Endlich objektorientiert 215
Das gerade erzeugte Objekt hat also seinen Konstruktoraufruf erfolgreich abgeschossen
und besitzt nun eine Farbe. Da die PHP-Datei aus Listing 4.2 eine Referenz auf dieses
Objekt besitzt, kann man von hier aus auf alle öffentlich zugänglichen Methoden zugrei-
fen. Sie können das Objekt mit dem Befehl $einStift->getFarbe() fragen, welche Farbe es
besitzt. Das Ergebnis wird dann ausgegeben.
In der nächsten Zeile bekommt der Stift dann über $einStift->setFarbe('blau') eine neue
Farbe zugewiesen. Auch diese neue Farbe können Sie wieder abfragen.
Interessant ist auch, wenn Sie mithilfe des aus dem zweiten Kapitel bekannten Befehls
var_dump das Objekt ausgeben. Sie erhalten dann eine detaillierte Ausgabe der internen
Eigenschaften und deren aktueller Ausprägung. Dies entspricht genau den Daten eines
Objektdiagramms. Die erste Zeile ist die Ausgabe des Konstruktors; in der letzten Zeile
wird der Stift durch den Destruktor-Aufruf zerstört. Das Objekt „lebt“ also nur während
des Aufrufs der PHP-Datei aus Listing 4.2. Die Ausgabe des Listings lautet
Ein Stift der Farbe schwarz wird erzeugt...
Farbe: schwarz
Farbe: blau
object(Stift)#1 (1) { ["farbe:private"]=> string(4) "blau" }
Der Stift der Farbe blau ist jetzt zerstört.
4.1.2 Objekte in einer Session übergeben
Die ganze Theorie der Objektorientierung und der Aufwand der Implementierung wür-
den sich nicht lohnen, wenn die Objekte und deren Beziehungen nur während eines
PHP-Aufrufs bestehen würden. Sie müssen also dafür sorgen, dass die Objekte über
einen längeren Zeitraum bestehen können. Das erste Ziel besteht darin, Objekte in einer
Session abzulegen, um die Referenzen im nächsten Aufruf einer PHP-Seite weiterver-
wenden zu können.
Um das Speichern eines Objekts in einer Session zu testen, muss der Anwender zunächst
in einem Eingabeformular die Farbe eines Stifts in einem Textfeld eingeben. In diesem

Formular wird auch die Session gestartet. Der Quellcode des Formulars ist in Listing 4.3
dargestellt.
var_dump($einStift);echo('<br>');
?>
</body></html>
<?php session_start(); ?>
<html><body>
<h1>Willkommen in der Stift-Herstellung</h1>
Listing 4.3: Quellcode des Eingabeformulars
Listing 4.2: Die erste Objekterzeugung – ein Stift wird geboren (Forts.)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
4 – PHP objektorientiert
216
In der Datei, die über HTTP-Post aufgerufen wird, wird nun der Stift erzeugt und in die
Session übergeben. Der Quellcode der Datei ist in Listing 4.4 aufgeführt.
Die Ausgabe des Listings lautet überraschenderweise
Ein Stift der Farbe rot wird erzeugt...
Ein Stift der Farbe rot wurde erzeugt.
Weiter gehts...
Der Stift der Farbe rot ist jetzt zerstört.
Es stellt sich die Frage, warum der Destruktor des Stifts aufgerufen wird, obwohl das
Stiftobjekt doch in der Session persistent gehalten werden soll? Ist das Stiftobjekt in der
Session jetzt verloren?
Die Antwort lautet: Nein, das Stiftobjekt in der Session ist noch vorhanden! Die Session-
datei befindet sich auf dem Dateisystem des PHP-Servers. In diese Datei wurde das
Objekt „hineinserialisiert“ – siehe dazu auch das nächste Kapitel zur Serialisierung.
Lediglich das Stiftobjekt aus dem Arbeitsspeicher des PHP-Servers wurde wieder freige-
geben.
Die Daten der Session können Sie sich übrigens ansehen. Wenn Sie das XAMPP-Paket
installiert haben, wurde in dessen Unterverzeichnis tmp mit dem ersten Start der Session

eine Datei angelegt. Falls die Session mit der ID 3217d032e41dfe5fa52a481b35391302 ange-
legt wurde, so heißt die Datei sess_3217d032e41dfe5fa52a481b35391302. Diese Datei kön-
<form action="stifterzeugung.php" method="post"><pre>
Farbe: <input name="frmFarbe" type="text"><br>
<input value="Herstellen..." type="submit"><br>
Sie haben die Session-ID <?php echo session_id()?> vom Server erhalten.
</pre></form>
</body></html>
<?php
session_start();
require_once("stift.inc.php");
$frmFarbe=$_POST[frmFarbe];
$einStift=new Stift($frmFarbe);
$_SESSION[StiftContainer]=$einStift;
?>
<html><body>
Ein Stift der Farbe <?php echo $einStift->getFarbe()?> wurde erzeugt.<br>
<a href="weiter.php">Weiter gehts...</a><br>
</body></html>
Listing 4.4: Objekterzeugung und Speicherung in der Session
Listing 4.3: Quellcode des Eingabeformulars (Forts.)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Umsetzung objektorientierter Grundlagen
PHP – Endlich objektorientiert 217
nen Sie mit einem Texteditor öffnen und finden das serialisierte Objekt mit seiner Eigen-
schaft: StiftContainer|O:5:"Stift":1:{s:12:" Stift farbe";s:3:"rot";}
Das O bedeutet, dass im Folgenden ein Objekt abgespeichert ist. Dann kommt die
Anzahl der Zeichen für den Klassennamen. Die 1 ist die erste Eigenschaft, die aus einer
Zeichenkette (s für String) besteht. Dem folgt der Name der Eigenschaft in 12 Zeichen,
wobei der Name aus dem Namen der Klasse und dem Namen der eigentlichen Eigen-

schaft zusammengesetzt ist. Der Wert der Eigenschaft folgt dann hinter dem Semikolon.
Es ist eine Zeichenkette mit drei Zeichen und der Wert lautet rot.
Mit einem Klick auf den Link der weiter.php sehen Sie nun, dass man immer noch auf das
entstandene Objekt zugreifen kann. Listing 4.5 zeigt den Quellcode dieser Datei.
In dieser Datei wird zunächst wieder die Klassendefinition eingebunden. Im Anschluss
daran wird die Session wieder gestartet und das Stiftobjekt aus der Session heraus in den
Arbeitsspeicher kopiert. Man spricht in diesem Zusammenhang von einer Deserialisie-
rung. Im Folgenden sehen Sie die Ausgabe der PHP-Datei:
Sie besitzen einen Stift der Farbe rot.
Der Stift der Farbe rot ist jetzt zerstört.
Da der Stift bereits existierte und nur noch vom Dateisystem in den Arbeitsspeicher gela-
den wird, erfolgt kein erneuter Aufruf des Konstruktors. Die zweite Ausgabe zeigt wie-
derum den Aufruf des Destruktors des Objekts im Arbeitsspeicher des Servers. Die seri-
alisierte Kopie existiert jedoch solange, wie die Session existiert. Beim Löschen der
Session wird jedoch der Destruktor nicht aufgerufen, da das Objekt im Dateisystem
lediglich in Textform vorliegt und nicht aktiv ist.
<?php
session_start();
require_once("stift.inc.php");
$einContainerStift=$_SESSION[StiftContainer];
?>
<html><body>
Sie besitzen einen Stift der Farbe
<?php echo $einContainerStift->getFarbe()?>.<br>
</body></html>
Listing 4.5: Objekterzeugung und Speicherung in der Session
Hinweis
In der Realität werden natürlich keine Stifte gespeichert, sondern Warenkörbe oder
Objekte in einer Datenbank. Die Erzeugung von einfachen Objekten ist aber für das
Erlernen der Objektorientierung sehr hilfreich, um deren Prinzipien kennen zu ler-

nen.
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
4 – PHP objektorientiert
218
4.1.3 Objekte speichern und laden: (De-)Serialisierung
Die im vorherigen Kapitel besprochene Serialisierung in einer Session kann auch manu-
ell durch den Befehl serialize angestoßen werden. Sie erhalten dadurch ein serialisiertes
Objekt in einer Zeichenkette. Dieses Objekt können Sie dann in einem versteckten Text-
feld über mehrere Formulare übertragen oder auch in einer Datei ablegen.
Der Quellcode aus Listing 4.6 zeigt in einer veränderten stifterzeugung.php das Serialisie-
ren des Stiftobjekts und das Festhalten der serialisierten Daten in der Variable $ser. Die
serialisierte Zeichenkette des Objekts wird dann in die Datei objekt.txt abgelegt.
Diese Datei wird in Listing 4.7 in der veränderten weiter.php wieder ausgelesen, das
Objekt mit dem Befehl unserialize wieder hergestellt und eine Methode des Objekts auf-
gerufen.
Die Daten des Objekts werden in der objekt.txt in der gleichen Form gespeichert wie in
der Session. Beim Speichern in eine Session und dem Laden aus einer Session wird also
automatisch eine Serialisierung bzw. Deserialisierung durchgeführt.
<?php
require_once("stift.inc.php");
$frmFarbe=$_POST[frmFarbe];
$einStift=new Stift($frmFarbe);
$ser=serialize($einStift);
$datei=@fopen("objekt.txt","w");
@fwrite($datei, $ser);
@fclose($datei);
?>
<html><body>
Ein Stift der Farbe <?php echo $einStift->getFarbe()?> wurde erzeugt.<br>
<a href="weiter.php">Weiter gehts...</a><br>

</body></html>
Listing 4.6: Speicherung eines serialisierten Objekts in einer Datei
<?php
require_once("stift.inc.php");
$datei=@fopen("objekt.txt","r");
$deser = unserialize(@fgets($datei));
@fclose($datei);
?>
<html><body>
Sie besitzen einen Stift der Farbe <?php echo $deser->getFarbe()?>.<br>
</body></html>
Listing 4.7: Laden und Deserialisieren des Objekts aus der Datei
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Umsetzung objektorientierter Grundlagen
PHP – Endlich objektorientiert 219
4.1.4 PHP-eigene Methoden der Objektorientierung
Auf Grund der historischen Entwicklung der Sprache PHP von den „Personal Home-
page Tools“ hin zu einer objektorientierten Programmiersprache sind einige besondere
Funktionen entstanden, die für andere objektorientierte Programmiersprachen eher
unüblich sind.
Diese Funktionen werden verstärkt in diesem Kapitel behandelt und ihre Bedeutung für
die Umsetzung der Konzepte der Objektorientierung wird herausgestellt.
Automatisches Nachladen von Klassen
Wenn Sie ein Objekt einer Klasse erzeugen wollen, muss der PHP-Datei, in der das
Objekt erzeugt werden soll, die Definition der Klasse bekannt sein. Nach diesem Bau-
plan wird das Objekt dann angelegt. So sehen Sie unter anderem in Listing 4.7 des letzten
Kapitels die Einbindung der Klassenbeschreibung für Stifte durch den Befehl require_
once("stift.inc.php").
Da die Objektorientierung sich gerade für große Projekte mit komplexen Objektgeflech-
ten eignet, ist diese Deklaration jeder einzelnen Klasse zu Beginn jeder PHP-Datei sehr

wartungsaufwändig.
Um diesen Aufwand zu minimieren, bietet PHP die __autoload-Methode. Wie der Konst-
ruktor und der Destruktor sind die Spezialmethoden der Objektorientierung bei PHP
durch den Beginn mit zwei Unterstrichen gekennzeichnet.
Die __autoload-Methode wird dann aufgerufen, wenn ein Objekt einer Klasse erzeugt
werden soll, die Definition der Klasse aber noch nicht bekannt ist. Wenn Sie diese
Methode einmalig programmieren, können Sie das Einbinden von Klassendefinitionen
durch den Aufruf von require_once automatisieren. Dabei können Sie auch Ihren Stan-
dardpfad angeben, in dem Sie alle Klassendefinitionen verwalten.
So zeigt Listing 4.8 einen einfachen Klassenlader, der beim Fehlen der im Eingabepara-
meter übergebenen Klasse $klasse automatisch die entsprechende .inc.php-Datei nach-
lädt, die sich in diesem Fall im selben Verzeichnis befinden muss.
Diesen kleinen Klassenlader können Sie nun in jede PHP-Datei einbauen, die Objekte
Ihrer eigenen Klassen anlegt. Listing 4.9 zeigt die Anwendung des Klassenladers auf das
bereits beschriebene Listing 4.6, bei dem ein Stiftobjekt angelegt wird.
Wenn Sie statt eines Objekts 50 Objekte unterschiedlicher Klassen anlegen wollen, wer-
den Sie das automatische Laden der Klassen zu schätzen wissen und 49 Zeilen PHP-
Code einsparen.
<?php
function __autoload($klasse){
require_once($klasse.".inc.php");
}
?>
Listing 4.8: Ein einfacher Klassenlader classloader.inc.php
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
4 – PHP objektorientiert
220
Zentrale Verwaltung von Get- und Set-Methoden
In der Definition der Stiftklasse haben Sie bereits gesehen, dass die einzige Eigenschaft
$farbe eine Get- und eine Set-Methode zur Verwaltung des Zugriffs auf diese Eigenschaft

besitzt.
Eine ähnliche Eigenschaft besitzt die Klassendefinition Laender, bei der intern ein Daten-
feld $laender mit Namen und Kürzel von zwei Ländern verwaltet wird. Die Notation =>
legt dabei ein assoziatives Feld an (Listing 2.13).
PHP bietet Ihnen im Gegensatz zu Java die Möglichkeit an, die Get- und Set-Methoden
zentral zu verwalten. So erlaubt die __get-Methode in Listing 4.10 den Aufruf von
$land1=$x->Deutschland bei einem Objekt $x der Laender-Klasse. Da die Eigenschaft pri-
vat deklariert ist, ist dieser Zugriff zunächst verboten. Über die __get-Methode können
Sie einen solchen Zugriff jedoch innerhalb der Klasse definieren. So gibt die __get-
Methode das entsprechende Länderkürzel aus dem assoziativen Datenfeld zurück.
Wie bei der herkömmlichen Set-Methode der Stiftklasse kann die allgemeine __set-
Methode Elemente aus dem existierenden Datenfeld verändern, indem beim ersten Ein-
gabeparameter das Land und im zweiten Eingabeparameter das neue Länderkürzel
übergeben wird.
<?php
require_once("classloader.inc.php");
$frmFarbe=$_POST[frmFarbe];
$einStift=new Stift($frmFarbe);
$ser=serialize($einStift);
$datei=@fopen("objekt.txt","w");
@fwrite($datei, $ser);
@fclose($datei);
?>
<html><body>
Ein Stift der Farbe <?php echo $einStift->getFarbe()?> wurde erzeugt.<br>
<a href="weiter.php">Weiter gehts...</a><br>
</body></html>
Listing 4.9: Anwendung des Klassenladers
<?php
class Laender{

private $laender=array("Deutschland"=>"D","England"=>"EN");

public function __get($var){
return $this->laender[$var];
}

Listing 4.10: Länderkürzel und Get-/Set-Verwaltung
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.
Umsetzung objektorientierter Grundlagen
PHP – Endlich objektorientiert 221
In Listing 4.11 wird nun ein neues Länderobjekt angelegt. Es sieht so aus, als könnten Sie
im Aufruf $x->Deutschland="DE" den Wert einer öffentlich zugänglichen Eigenschaft
mit dem Namen Deutschland direkt überschreiben. Dies würde der Datenkapselung der
Objektorientierung widersprechen. In Wirklichkeit wird innerhalb der Klasse jedoch die
__set-Methode aufgerufen. Dort können durchaus Überprüfungen der Eingabe, in die-
sem Fall der Eingabe DE stattfinden. Die Klasse behält also die Hoheit darüber, wie ihre
internen Eigenschaften gesetzt werden. Dies entspricht der objektorientierten Denk-
weise. Ein Anwender der Klasse merkt nicht einmal, dass die Länderkürzel innerhalb
der Klasse in einem assoziativen Feld verwaltet werden.
In der gleichen Weise wird durch den Befehl $land1=$x->Deutschland in Wirklichkeit die
__get-Methode aufgerufen, die auf das assoziative Feld zugreift und den neuen, im
Objekt hinterlegten Ländercode für Deutschland ausliest.
Interessant ist auch der Aufruf $x->Frankreich="FR", denn die Eigenschaft Frankreich
existiert noch nicht einmal im internen Datenfeld $laender der Klasse. Mit der __set-
Methode sind Sie also in der Lage, eine Klasse zur Laufzeit nach außen hin dynamisch
um neue Eigenschaften zu erweitern. In Wirklichkeit wird dem assoziativen Feld ledig-
lich ein neuer Eintrag hinzugefügt. Bei einer Serialisierung des Objekts wird das Feld mit
serialisiert und die neue „Eigenschaft“ gespeichert. Das Feld kann natürlich auch bei
einer Speicherung in einer Datenbank mit seinem gesamten Inhalt persistent, also dauer-
haft, gespeichert werden.

public function __set($var,$wert){
$this->laender[$var]=$wert;
}
}
?>
<?php
require_once("classloader.inc.php");
$x=new Laender();
$x->Deutschland="DE";
$land1=$x->Deutschland;
$x->Frankreich="FR";
$land2=$x->Frankreich;
?>
<html><body>
<?php echo $land1?><br> <?php echo $land2?><br>
</body></html>
Listing 4.11: Anwendung der Länderklasse
Listing 4.10: Länderkürzel und Get-/Set-Verwaltung (Forts.)
Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark.

×