Hallo,
wenn man Composite-Objekte klonen möchte, also aus gleichartigen
Objekten zusammengesetzte, dann muss man sich ja sehr genau überlegen,
was man eigentlich klonen will.
Ein Beispiel.
class Node {
public $children = array();
public $property = array();
//...
}
wobei die Children wiederum Nodes sind. Es gibt eine Methode addChild():
function addChild(Node $child) {
$this->children[] = $child;
/* let the child inherit the properties */
foreach ($this->property as $key=>$value) {
$child->property[$key] = $value;
}
}
Wen man nun eine Node klont, will man ja *eigentlich* nicht das, was
clone() standardmäßig macht: Es würde eine neue Node erzeugen, mit
denselben Properties, aber eben auch die selben Kinder referenzieren.
Ich möchte aber, dass clone() neue Kinder erzeugt, die wiederum gleiche
Properties wie die ursprünglichen haben, kurz: ich will den Baum klonen.
mein erster Ansatz
function __clone() {
$node = new Node();
foreach ($this->property as $key=>$value) {
$node->property[$key] = $value;
}
foreach ($this->children as $index=>$child) {
$node->addChild( clone ($child));
}
}
führte seltsamerweise dazu, dass die kinder identische Kinder hatten
(also die Enkel waren nicht das Gleiche, sondern dasselbe, identische
Objekt).
Hab ich hier irgendwas verpasst oder gibt es ein Problem mit clone()?
Servus,
Konni
P.S. die üblichen Überprüfungen ob children bzw. property überhaupt
existieren und Elemente haben, habe ich nur hier der Übersichtlichkeit
wegen weggelassen.
Ein einfaches "clone $node" tut es nicht.
--
Inzwischen ohne Signatur
