Objekte klonen
Eine Kopie eines Objektes mit vollständig replizierten Eigenschaften zu
erzeugen, ist nicht immer das gewünschte Verhalten. Ein gutes Beispiel für
die Notwendigkeit von Kopierkonstruktoren ist ein Objekt, welches ein GTK
Fenster repräsentiert und dieses Objekt enthält die Ressource des GTK-Fensters.
Wenn Sie ein Duplikat dieses Objektes erzeugen, könnten Sie
ein neues Fenster mit gleichen Eigenschaften erzeugen wollen und das neue
Objekt soll die Ressource des neuen Fensters speichern.
Ein weiteres Beispiel ist ein Objekt, welches eine Referenz auf ein anderes
Objekt, das es benutzt, hält und wenn das Vaterobjekt repliziert wird, will
man eine neue Instanz dieses anderen Objektes erzeugen, damit das Replikat
eine eigene Kopie besitzt.
Eine Objektkopie wird durch die Nutzung des clone
Schlüsselwortes (welches wenn möglich die
__clone()-Methode des Objektes aufruft)
erzeugt. Die __clone()-Methode eines
Objektes kann nicht direkt aufgerufen werden.
$kopie_des_objektes = clone $objekt;
Wenn ein Objekt geklont wird, wird PHP eine seichte Kopie der Eigenschaften
des Objektes durchführen. Alle Eigenschaften, die Referenzen auf andere
Variablen sind, werden Referenzen bleiben.
__clone
(
) : void
Sobald der Klonvorgang abgeschlossen und eine __clone()-
Methode definiert ist, so wird die __clone()-Methode
des neu erzeugten Objekts aufgerufen, damit alle notwendigen Eigenschaften verändert werden
können.
Beispiel #1 Ein Objekt klonen
static$instanzen=0;
public$instanz;
public function__construct() {$this->instanz= ++self::$instanzen;
}
public function__clone() {$this->instanz= ++self::$instanzen;
}
}
classMyCloneable{
public$objekt1;
public$objekt2;
function__clone()
{// Erzwinge eine Kopie von this->object,
// andernfalls wird es auf das selbe Objekt zeigen$this->objekt1= clone$this->objekt1;
}
}$obj= newMyCloneable();$obj->objekt1= newSubObject();$obj->objekt2= newSubObject();$obj2= clone$obj;
print("Original Objekt:\n");print_r($obj);
print("geklontes Objekt:\n");print_r($obj2);?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Original Objekt:
MyCloneable Object
(
[object1] => SubObject Object
(
[instanz] => 1
)
[object2] => SubObject Object
(
[instanz] => 2
)
)
geklontes Object:
MyCloneable Object
(
[objekt1] => SubObject Object
(
[instanz] => 3
)
[objekt2] => SubObject Object
(
[instanz] => 2
)
)
PHP 7.0.0 führte die Möglichkeit ein, auf ein Klassenelement eines soeben
geklonten Objekts in einem einzigen Ausdruck zuzugreifen:
Beispiel #2 Zugriff auf ein Element eines soeben geklonten Objekts
$dateTime= newDateTime();
echo (clone$dateTime)->format('Y');?>
Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:
2016