![]() |
![]() |
![]() | |
![]() |
Funktionen innerhalb von Objekten
Dies ist aber bei weitem noch nicht alles, was man in einer Klasse definieren und mit einem Objekt anstellen kann. In unserem Beispiel und ersten Objekt haben wir auf die Objektelemente direkt zugegriffen. Dadurch haben wir noch nicht sichergestellt, daß eine Änderung der PLZ auch automatisch eine Änderung des Ortes nach sich zieht. Normalerweise läßt man in Objekten als konstruierender Programmierer auf die Elemente auch gar keinen direkten Zugriff von „außen“ zu, sondern führt dazu Funktionen ein. D.h. alle Zugriffe, egal ob lesend oder schreibend, auf die objektinternen Variablen sollten über Funktionen abgewickelt werden. Da diese Funktionen die objektinternen Daten ändern und damit im direkten Bezug zu diesen stehen, gehören die Funktionen logisch gesehen zu dem Objekt. Deshalb werden die Funktionen auch innerhalb der Klasse definiert. Ändern wir unsere Adressklasse um Funktionen, die z.B. den Namen auslesen und schreiben: Class Adresse { var $Name; var $Strasse; var $PLZ; var $Ort; var $Land; function GetName () { return ($this->Name); } function WriteName ($NewName) { $this->Name = $NewName; // !!! Falsch: $Name = $NewName; } } In dieser Klasse haben wir zwei Funktionen definiert. Die Syntax der Funktionsdeklaration unterscheidet sich in keinerweise von der normalen Deklaration und wird an dieser Stelle deshalb auch nicht weiter behandelt. Der einzige Unterschied ist eben, daß die Funktionen innerhalb der Klasse definiert wurden. Damit stehen die Funktionen nicht global zur Verfügung ! Erwähnenswert und wichtig ist noch der Zugriff innerhalb der Funktionen auf Elemente der Klasse, also auf die klasseninternen „Variablen“. Hierzu stellt PHP uns ein virtuelles Objekt „$this“ zur Verfügung, welches immer auf die aktuelle Klasse verweist. Um also auf die „eigenen“ Elemente der Klasse zugreifen zu können, müssen Sie in PHP immer über das Objekt $this gehen. Im Beispiel oben haben wir in der auskommentierten Zeile absichtlich einmal gezeigt, wie es nicht geht. $Name bezieht sich auf eine Variable, die nur innerhalb der Funktion gültig wäre und nicht auf das Klassenelement „Name“ ! Wird nun von dieser Klasse „Adresse“ ein Objekt instanziert, können die beiden Funktionen nun statt eines direkten Datenzugriffes verwendet werden: $MeineAdresse = new Adresse; $MeineAdresse->WriteName ("Peter"); echo ($MeineAdresse->GetName ()); Sie werden jetzt sicherlich fragen, wozu der ganze Aufwand, das ist ja ein vielfaches an Code, den man normal benötigen würde. Für einfache Beispiele, wie hier, mag dies vielleicht auch noch gelten, in komplexeren Anwendungen ist es aber in der Regel umgekehrt. Ein Vorteil dieses Konzeptes sollte aber schon jetzt einleuchten, wenn wir eine Funktion zum Ändern der PLZ und des Ortes einführen (wir haben jetzt nicht mehr die komplette Klassendefinition an dieser Stelle wiederholt, da diese sonst zu lang würde): Class Adresse { ..... function WriteLocation ($NewPLZ, $NewOrt) { $this->PLZ = $NewPLZ; $this->Ort = $NewOrt; } }
Durch diese Funktion sind Sie gezwungen, bei einer PLZ-Änderung auch immer den Ort mit zu übergeben, da dieser sich ja mit geändert haben könnte. Hierdurch wird eine unsaubere Programmierung, die zu inkonsistenten Daten führen kann, bereits im Keim komplett verhindert. Alternativ wären auch zwei Funktionen, eine für die PLZ und eine für den Ort denkbar, welche bei Aufruf zu der PLZ z.B. durch eine hinterlegte Datenbank oder Tabelle automatisch den passenden Ort sucht und umgekehrt und diesen direkt mit ändert. [zurück] - [bookmarken] - [Druckversion] - [Weiterempfehlen] - [Kontakt] - [Impressum]
Copyright © 2000-2012 by Portunity GmbH - Alle Rechte vorbehalten. |
![]() ![]() Providing unter:
http://portunity.net
![]()
|
|||||||||