OOP in PHP – Teil 4: Klonen und Typprüfung

Bei der Arbeit im objektorientierten Umfeld müssen wir genau darauf achten, wie unsere Objekte gespeichert werden. Möchten wir ein Objekt kopieren oder nur mit Hilfe einer anderen Variable darauf zugreifen? Die Feinheiten der Objekte schauen wir uns in diesem Artikel genauer an.

Referenzen, Klone wie das alles funktioniert

Zuerst einmal ein kleiner Ausflug in die Begrifflichkeiten: Was ist eine Referenz überhaupt?
Beim Anlegen eines neuen Objekts werden die Attribute irgendwo im Speicher abgelegt. Damit wir im Code weiterhin darauf zugreifen können speichern wir das Objekt in einer Variable. Die Variable ist dementsprechend nichts anderes als ein Hinweis für den Server wo er die Daten des Objekts im Speicher finden kann, sie referenziert also auf das Projekt.

Speichern wir nun das Objekt folgendermaßen in einer zweiten Variable kopieren wir dadurch nicht das Objekt sondern legen eine weitere Referenz an (was das bedeutet erfahren wir gleich):

Sowohl $referenz1 als auch $referenz2 verweisen nun auf das selbe Objekt im Speicher!
Stellen wir uns ein Haus vor. Das Haus (unser Objekt) wird anhand eines Bauplans (die Klasse) gebaut, danach mit Möbeln und Farben (die Attribute) eingerichtet und kann mit Hilfe eines Schlüssels (die Variable bzw Referenz) betreten werden. Kopieren wir nun diesen Schlüssel können wir trotzdem nur dasselbe Haus betreten. Werden die Wände in diesem Haus grün gestrichen ist es egal, mit welchem Schlüssel wir das Haus betreten, die Wände sind immer grün.

Möchten wir nun allerdings ein zweites Haus haben, das genau gleich wie das erste aussieht, müssen wir unser Haus klonen. Das heißt anhand des Bauplans wird ein zweites Haus gebaut, die Wände werden in derselben Farbe gestrichen und die gleichen Möbel an der gleichen Stelle platziert. Allerdings führt uns unser neuer Schlüssel nur in das neue Haus, der alte Schlüssel hingegen in das alte Haus. Streichen wir also nun die Wände in einem der Häuser rosa verändert sich dadurch nichts im anderen Haus.

Raus aus der Metapher und zurück zu PHP. Um ein Objekt zu klonen gibt es komfortablerweise den clone Befehl der grundsätzlich genau gleich wie der new Befehl funktioniert:

Bitte beachten, dass wir hier nicht den Klassennamen sondern ein spezifisches Objekt angeben. Schließlich kopieren wir auch alle Attribute die das Objekt zu diesem Zeitpunkt enthält!

Typprüfung von Objekten

Hin und wieder kann es entscheidend sein, aus welcher Klasse ein Objekt erstellt wurde. Gerade wenn unser Code dynamischer und umfangreicher wird kann es durchaus vorkommen, dass in einer Variable – je nach vorherigem Codeablauf – verschiedene Arten von Objekten gespeichert werden. Um eine Typprüfung auf eine Variable durchzuführen gibt es zwei Möglichkeiten.

Möglichkeit 1: instanceof

instanceof ist mit einem boolschen Operator zu vergleichen und gibt true zurück, falls das Objekt der Variable aus der zu vergleichenden Klasse erstellt wurde. Klingt kompliziert also veranschaulichen wir das einfach an einem Beispiel:

Dieser Beispielcode für die Typprüfung würde die Ausgabe $referenz1 ist vom Typ Beispiel hervorbringen. Die zweite Typprüfung schlägt fehl da unser Objekt nicht von der Klasse AnderesBeispiel stammt.

Möglichkeit 2: Type Hinting

Eine zweite Möglichkeit der Typprüfung – speziell in Methoden – steht uns seit PHP5 mit dem sogenannten Type Hinting zur Verfügung. Möchten wir sicherstellen, dass nur Werte eines bestimmten Typs als Parameter in unsere Methode übergeben werden, können wir einfach den Klassennamen voranstellen.

In diesem Beispiel legen wir fest, dass methode1() einen Parameter vom Typ AnderesBeispiel erwartet. Erhält die Methode den erwarteten Parameter funktioniert alles wie es soll und die gewünschte Ausgabe erscheint. Übergeben wir jedoch einen Parameter anderen Typs (zum Beispiel 5 was ja einen integer darstellt) grüßt PHP uns mit einer Fehlermeldung. So stellt die interne Typprüfung von PHP sicher, dass unsere Methode nur mit erwarteten Parametern aufgerufen wird und so spätere Fehler vermieden werden können.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*