Klonen von Objekten bedeutet, eine Kopie eines Objektes anzulegen, die dann als eigenständiges Objekt weiterexistiert. Dabei ist das Kopieren eines Objektes nicht trivial, da Objekte häufig auf weitere Objekte referenzieren, die wiederum auf weitere Objekte referenzieren. Man kann nun entweder das Objekt flach kopieren, indem die referenzierten Objekte nicht dupliziert werden oder es ist möglich tief zu kopieren, indem auch referenzierte Objekte mit geklont werden. Im letzteren Fall kann es sein, dass man alle sich im Speicher befindlichen Objekte mitklont, da diese in der Referenzierungskette alle irgendwann auftauchen.
PHP löst das Problem, indem es dem Entwickler die Entscheidung überlässt, wie tief geklont werden soll. Wenn der Entwickler das Sprachkonstrukt clone
einsetzt, so wird zunächst eine flache Kopie des Objektes erstellt. Wenn in der Klasse des geklonten Objektes die Methode __clone()
deklariert ist, so wird diese aufgerufen, damit weitere Aktionen durchgeführt werden können:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php class ReferenzierteKlasse { public $i = 1; } class MeineKlasse { public $referenziertesObjekt; public function __construct() { $this->referenziertesObjekt = new ReferenzierteKlasse(); } public function __clone() { $this->referenziertesObjekt = clone $this->referenziertesObjekt; } } $erstesObjekt = new MeineKlasse(); $zweitesObjekt = clone $erstesObjekt; $erstesObjekt->referenziertesObjekt->i = 2; ?> |
Hier wird das Objekt $erstesObjekt
geklont. Würde in seiner Klasse keine Methode __clone()
vorhanden sein, so würde nur eine flache Kopie angelegt werden. Die Anweisung in der Methode clone()
sorgt jedoch dafür, dass auch ein Klon des referenzierten Objektes angelegt wird. Somit existieren bei der Ausführung der letzten Anweisung zwei referenzierte Objekte und nur bei einem wird die Variable $i
auf 2
gesetzt. Bei einer flachen Kopie würde nur ein referenziertes Objekt existieren, welches nun auf 2
gesetzt werden würde und die ehemalige 1
verloren gehen würde.