1. Trang chủ
  2. » Công Nghệ Thông Tin

PHP – Endlich objektorientiert- P9

30 234 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề PHP – Endlich objektorientiert- P9
Trường học University of Example
Chuyên ngành Computer Science
Thể loại Lecture Note
Định dạng
Số trang 30
Dung lượng 476,6 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Eine private Eigenschaft Die erste Klasse erzeugt einen Stift, der nur eine einzelne Eigenschaft besitzt.. In einerZeichenkette könnte die Farbe auch „ Frank“ lauten, was jedoch keinen S

Trang 1

Herr Müller erhält abschließend eine Bestätigung, dass die Buchung erfolgreich nommen wurde.

vorge-Was haben Sie gelernt und wie geht es weiter?

In diesem Kapitel wurden zu Beginn verschiedene Vorgehensweisen dargestellt, wie Siebei 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 ges Modell sowie die agilen Methoden als dynamische, kommunikationsintensive Vari-ante

schwergewichti-Im Anschluss daran wurden die Idee und die Grundbegriffe der Objektorientierung gestellt, die eine neue Denkweise bei der technischen Lösung von fachlichen Problemenimplizieren

vor-Im letzten Teil dieses Kapitels wurden die wichtigsten Diagramme der UML vorgestellt,mit deren Hilfe Sie die Aspekte der objektorientierten Softwareentwicklung beschreibenkönnen Die UML-Diagramme bieten dabei eine Diskussionsgrundlage für die iterativ-inkrementelle Entwicklung und dienen zusätzlich zur Dokumentation der Entstehungeiner 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 Anwendungeine 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 rung von PHP-Anwendungen sehen, die Sie mit den neuen Möglichkeiten von PHP 5umsetzen können

Implementie-Im nächsten Kapitel werden Sie erfahren, wie Sie die vorgestellten Konzepte der orientierung und der Spezifikation der einzelnen UML-Diagramme in PHP implemen-tieren können

Objekt-Meinung

Die eher am technischen Design orientierten Sequenzdiagramme können sehr gutmit den eher an der fachlichen Analyse ausgerichteten Aktivitätsdiagrammen abge-glichen werden Dies gibt einen guten Anhaltspunkt, ob die fachlichen Vorgabensinnvoll technisch umgesetzt wurden oder nicht

Trang 2

Im zweiten Kapitel dieses Buches wurde die grundlegende Syntax der Sprache PHP gestellt Diese Syntax und alle vorgestellten Befehle können natürlich auch im Rahmender Objektorientierung verwendet werden Verzweigungen, Schleifen, Session-Hand-ling, der Versand von E-Mails und auch die Befehle zur Datenbankanbindung stehennach wie vor zur Verfügung In großen Projekten sollte der gesamte Zugriff auf solcheRessourcen jedoch nur einmalig implementiert und in Objekte gekapselt werden.Das dritte Kapitel präsentierte Vorgehensweisen bei der Abwicklung von Projektenunterschiedlicher 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 Projekthinweg angewendet werden kann Bis zu diesem Punkt ist es noch unerheblich, welcheobjektorientierte Sprache zur Implementierung eingesetzt wird Anstelle von PHP kön-nen ebenso ASP.NET oder JSP/Servlets zum Einsatz kommen.

vor-In diesem Kapitel wird nun vorgestellt, wie man die bislang theoretisch beschriebenenKonzepte der Objektorientierung mit PHP 5 umsetzen kann

Damit Sie die Umsetzung der objektorientierten Grundlagen, die in Kapitel 3.2.2 stellt wurden, in PHP leicht nachvollziehen können, wird in diesem Kapitel eine Vielzahlvon kleinen Beispielen vorgestellt, die jeweils einzelne Aspekte der objektorientiertenProgrammierung beschreiben Im fünften Kapitel dieses Buches werden dann komple-xere zusammenhängende Beispiele skizziert

vorge-4.1.1 Die erste PHP-Klasse

Am Sinnvollsten ist es, direkt mit der Programmierung einer vollständigen Klasse zubeginnen und diese Klasse dann in einer anderen PHP-Datei mit Objekterzeugung undAusgabe zu testen

Eine private Eigenschaft

Die erste Klasse erzeugt einen Stift, der nur eine einzelne Eigenschaft besitzt Er hat eineFarbe, 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

Trang 3

In der Realität würde man auch eine Farbe als Objekt repräsentieren, das seinerseits dreiEigenschaften hat Dies könnten beispielsweise die Rot-, Grün- und Blauanteile derFarbe sein So würde man sicherstellen, dass man stets eine gültige Farbe erhält In einerZeichenkette 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 EinDefault-Konstruktor ist in diesem Beispiel nicht vorgesehen Sie müssen bei derObjekterzeugung 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öglicheKonstruktoren für ein Objekt definieren können

Zusätzlich besitzt die Klasse einen Destruktor, der beim Entfernen des Objekts aus demArbeitsspeicher 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 grammierung der Set-Methode entscheiden Damit wird die Datenkapselung der Objek-torientierung gewährleistet Die zweite Methode gibt den Wert der Eigenschaft zurück

Pro-Es handelt sich also um eine Get-Methode

Abbildung 4.1 skizziert zunächst auf der linken Seite ein Stiftobjekt und auf der rechtenSeite das UML Klassendiagramm der Designphase

Abbildung 4.1: Das erste zu erstellende Objekt und das passende Klassendiagramm

Trang 4

Dieses Klassendiagramm wird nun direkt in PHP-Code umgesetzt Die diagramme in der Designphase sollten so präzise sein, dass Sie keine Möglichkeit zurInterpretation mehr zulassen.

UML-Klassen-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 Sprachensollte jede Klasse in eine separate Datei geschrieben werden Diese Datei solltegenauso heißen wie der Name der Klasse

<?phpclass 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

Trang 5

Konstruktor auf dem Objekt selbst einen Methodenaufruf tätigen Dieser Selbstaufrufwurde 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 derVerwendung deklarieren müssen Bei der prozeduralen Programmierung ist dies einangenehmes 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 Referenz verwenden, indem Sie mit dem Befehl $this->farbe=$farbe der Eigenschaft des

$this-Objekts den von außen übergebenen Wert zuweisen Der Zugriff auf die private schaft ist an dieser Stelle möglich, da Sie sich ja in der Klasse selbst befinden

Eigen-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 klaration mit demselben Namen und damit zu einem Fehler führen

Klassende-Im HTML-Rumpf der PHP-Datei kann nun das erste Objekt angelegt werden Für dieErzeugung 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 keineParameter angeben, wird der parameterlose Default-Konstruktor der Klasse aufgerufen.Dieser existiert jedoch bei unserer Klasse nicht Stattdessen müssen Sie eine Zeichenketteals Parameter übergeben, der die Farbe des zu erstellenden Stiftes darstellt In diesemFall 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();

Trang 6

Das gerade erzeugte Objekt hat also seinen Konstruktoraufruf erfolgreich abgeschossenund besitzt nun eine Farbe Da die PHP-Datei aus Listing 4.2 eine Referenz auf diesesObjekt 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 einesObjektdiagramms Die erste Zeile ist die Ausgabe des Konstruktors; in der letzten Zeilewird der Stift durch den Destruktor-Aufruf zerstört Das Objekt „ lebt“ also nur währenddes 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 den sich nicht lohnen, wenn die Objekte und deren Beziehungen nur während einesPHP-Aufrufs bestehen würden Sie müssen also dafür sorgen, dass die Objekte übereinen längeren Zeitraum bestehen können Das erste Ziel besteht darin, Objekte in einerSession abzulegen, um die Referenzen im nächsten Aufruf einer PHP-Seite weiterver-wenden zu können

wür-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 diesemFormular wird auch die Session gestartet Der Quellcode des Formulars ist in Listing 4.3dargestellt

<h1>Willkommen in der Stift-Herstellung</h1>

Listing 4.3: Quellcode des Eingabeformulars Listing 4.2: Die erste Objekterzeugung – ein Stift wird geboren (Forts.)

Trang 7

In der Datei, die über HTTP-Post aufgerufen wird, wird nun der Stift erzeugt und in dieSession ü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 dasStiftobjekt doch in der Session persistent gehalten werden soll? Ist das Stiftobjekt in derSession jetzt verloren?

Die Antwort lautet: Nein, das Stiftobjekt in der Session ist noch vorhanden! Die datei befindet sich auf dem Dateisystem des PHP-Servers In diese Datei wurde dasObjekt „ hineinserialisiert“ – siehe dazu auch das nächste Kapitel zur Serialisierung.Lediglich das Stiftobjekt aus dem Arbeitsspeicher des PHP-Servers wurde wieder freige-geben

Session-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();

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.)

Trang 8

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 dieAnzahl 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 schaft zusammengesetzt ist Der Wert der Eigenschaft folgt dann hinter dem Semikolon

Eigen-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 Anschlussdaran wird die Session wieder gestartet und das Stiftobjekt aus der Session heraus in denArbeitsspeicher 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 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 derSession wird jedoch der Destruktor nicht aufgerufen, da das Objekt im Dateisystemlediglich in Textform vorliegt und nicht aktiv ist

gela-<?php session_start();

Trang 9

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 feld über mehrere Formulare übertragen oder auch in einer Datei ablegen

Text-Der Quellcode aus Listing 4.6 zeigt in einer veränderten stifterzeugung.php das 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.

Serialisie-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 alsoautomatisch eine Serialisierung bzw Deserialisierung durchgeführt

<?php require_once("stift.inc.php");

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");

Trang 10

4.1.4 PHP-eigene Methoden der Objektorientierung

Auf Grund der historischen Entwicklung der Sprache PHP von den „ Personal page Tools“ hin zu einer objektorientierten Programmiersprache sind einige besondereFunktionen entstanden, die für andere objektorientierte Programmiersprachen eherunüblich sind

Home-Diese Funktionen werden verstärkt in diesem Kapitel behandelt und ihre Bedeutung fürdie 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 dasObjekt 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 ten eignet, ist diese Deklaration jeder einzelnen Klasse zu Beginn jeder PHP-Datei sehrwartungsaufwändig

Objektgeflech-Um diesen Aufwand zu minimieren, bietet PHP die autoload-Methode Wie der

Konst-ruktor und der DestKonst-ruktor sind die Spezialmethoden der Objektorientierung bei PHPdurch 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 dieseMethode 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 ObjekteIhrer eigenen Klassen anlegt Listing 4.9 zeigt die Anwendung des Klassenladers auf dasbereits beschriebene Listing 4.6, bei dem ein Stiftobjekt angelegt wird

Wenn Sie statt eines Objekts 50 Objekte unterschiedlicher Klassen anlegen wollen, den Sie das automatische Laden der Klassen zu schätzen wissen und 49 Zeilen PHP-Code einsparen

wer-<?php function autoload($klasse){

Trang 11

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 feld $laender mit Namen und Kürzel von zwei Ländern verwaltet wird Die Notation =>

Daten-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 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-

pri-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 gabeparameter das Land und im zweiten Eingabeparameter das neue Länderkürzelübergeben wird

Ein-<?php require_once("classloader.inc.php");

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

Trang 12

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 sem Fall der Eingabe DE stattfinden Die Klasse behält also die Hoheit darüber, wie ihre

die-internen Eigenschaften gesetzt werden Dies entspricht der objektorientierten weise Ein Anwender der Klasse merkt nicht einmal, dass die Länderkürzel innerhalbder Klasse in einem assoziativen Feld verwaltet werden

Denk-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 lich ein neuer Eintrag hinzugefügt Bei einer Serialisierung des Objekts wird das Feld mitserialisiert und die neue „ Eigenschaft“ gespeichert Das Feld kann natürlich auch beieiner 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");

Trang 13

Aufrufen nichtdeklarierter Methoden und Identifikation von Objekten

Ähnlich wie der Zugriff auf Eigenschaften können sogar Methodenaufrufe von einer

besonderen PHP-Funktion manipuliert werden Diese Funktion nennt sich call Sie ist

insbesondere dafür geeignet, einen Nachteil der Sprache PHP in der Objektorientierungauszugleichen

Wie Sie wissen, müssen in PHP Variablen nicht mit Datentypen deklariert werden Sie

sagen also nicht vor der Verwendung von $x, dass $x eine Ganzzahl oder eine

Zeichen-kette sein muss PHP verwaltet die Datentypen bei der Zuweisung eines Wertes misch So kann sich der Datentyp einer Variablen sogar während ihrer Lebenszeitändern In der Praxis des prozeduralen Programmierens wird diese Fähigkeit des PHP-Interpreters gerade von Programmieranfängern geschätzt Man muss sich keine Gedan-ken um Datentypen machen

dyna-In der Objektorientierung ist diese Fähigkeit der Sprache jedoch erst einmal nachteilig dyna-InAbbildung 3.65 wurde bereits ein Klassendiagramm einer Bruchklasse dargestellt, das

an dieser Stelle nochmals in Abbildung 4.2 aufgegriffen wird

Abbildung 4.2: UML-Klassendiagramm der Bruchklasse

Dieses Klassendiagramm ist zunächst unabhängig von einer Programmiersprache Wir

konzentrieren uns zunächst auf die Eigenschaften Zähler und Nenner sowie auf den

Kon-struktor und auf die Methoden der Addition einer ganzen Zahl und eines anderenBruchs Die Prüfung der Gültigkeit eines Bruchs, die ja nur bei einem Nenner ungleich 0gegeben ist, wird zunächst zurückgestellt Die erste Realisierung der Bruchklasse sehenSie in Listing 4.12

Die Vorbelegung des Zählers und Nenners mit Standardwerten kann PHP leisten, indemdie Variablen vorbelegt werden Damit erhalten Sie auch gleichzeitig den Integer-Daten-typ Zusätzlich werden für den Zähler und den Nenner passende Get- und Set-Metho-den definiert In der Set-Methode des Nenners kann später die Prüfung der Eingabeerfolgen, die ungleich 0 sein muss Der Konstruktor des Bruchs ruft dann die Set-Metho-den auf und belegt die Eigenschaften des neuen Objekts mit den übergebenen Werten

Trang 14

Problematisch an der Vorgabe aus dem Klassendiagramm ist die Existenz mehrerer

add-Methoden, die sich lediglich anhand des Datentyps unterscheiden In der Deklarationeiner PHP-Funktion können Sie jedoch keinen Datentyp angeben, wie dies bei Java oder

VB.NET möglich ist Dort würden Sie mehrere add-Methoden schreiben, die sich nicht im

Namen, jedoch am Datentyp des übergebenen Eingabeparameters unterscheiden DerJava- oder NET-Interpreter würde dann die passende Methode auswählen

Genau diesen Schritt nimmt Ihnen PHP nicht ab Sie müssen die Auswahl der richtigenFunktion selbst implementieren Es wird entweder eine ganze Zahl, oder ein anderer

Bruch übergeben An dieser Stelle kommt die call-Funktion ins Spiel.

Wenn Sie diese besondere PHP-Funktion in einer Klasse implementieren, wird sie rufen, wenn Sie eine Methode eines Objekts aufrufen, die gar nicht existiert Den Aufruf

aufge-können Sie dann in der call-Funktion umleiten.

<?php class Bruch{

private $z=0; private $n=1;

public function construct($z,$n){

$this->setZähler($z); $this->setNenner($n);

} public function getZähler(){

return $this->z;

} public function getNenner(){

return $this->n;

} public function setZähler($z){

$this->z=$z;

} public function setNenner($n){

$this->n=$n;

} public function ausgeben(){

return $this->getZähler()."/".$this->getNenner();

} public function call($func,$data){

if ($func=="add"){

Listing 4.12: Die erste Bruchklasse

Trang 15

Die call-Funktion besitzt zwei Eingabeparameter Im ersten Parameter wird der Name

der aufgerufenen Methode übergeben Der zweite Parameter enthält eine Liste der gebenen Parameter an diese aufgerufene Funktion Die Abfrage in der Klasse prüft

über-zuerst, ob der Name der Methode add lautet

In diesem Fall wird der erste Parameter, der in $data[0] enthalten ist, auf seinen Datentyp geprüft Ist es eine Ganzzahl, so wird die private Hilfsmethode add_int aufgerufen und

der übergebene Parameter an diese Methode weitergereicht

Die Klassenzugehörigkeit eines Objekts können Sie mit dem Befehl instanceof prüfen.

Achten Sie hier auf die Syntax: Der Name der abgefragten Klasse wird nicht in

Klam-mern gesetzt! Wenn der übergebene Parameter ein Objekt der Klasse Bruch ist, so ist die Bedingung der zweiten if-Verzweigung wahr In diesem Fall wird die privat deklarierte Hilfsmethode add_bruch aufgerufen und die Objektreferenz weitergegeben.

Die Hilfsmethoden addieren nun gemäß den Regeln der Bruchrechnung die ganze Zahlbzw den anderen Bruch zum eigenen Bruchobjekt

Um den aktuellen Wert des Bruchs auszugeben, wurde zusätzlich die Methode ausgeben

definiert, die den Zähler und Nenner durch einen Schrägstrich getrennt als Zeichenkettezurückgibt Eine elegantere Methode dazu finden Sie im nächsten Unterkapitel

Interessant ist die Frage, wie der Aufruf einer solchen add-Methode über die

call-Kons-truktion funktioniert Dies ist in Listing 4.13 dargestellt Zunächst werden zwei neueBrüche erzeugt und der erste Bruch 1/2 ausgegeben

if (is_integer($data[0])){

$this->add_int($data[0]);

} else{

if ($data[0] instanceof Bruch){

$this->add_bruch($data[0]);

} } } } private function add_int($int){

$this->z += $int * $this->n;

} private function add_bruch($b){

$this->z = $this->z * $b->getNenner() + $this->n * $b->getZähler();

$this->n *= $b->getNenner();

} }

?>

Listing 4.12: Die erste Bruchklasse (Forts.)

Ngày đăng: 24/10/2013, 19:15

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN