Při klonování objektů provádí PHP 5 takzvanou mělkou kopii. To znamená, že objekty, na které se klonovaný objekt odkazuje, jsou zkopírovány běžným přiřazením, tedy referencí. Pokud chceme provést takzvanou hlubokou kopii, musíme implementovat metodu __clone:
<?php class Clonable { private $object1; public function __clone() { $this->object1 = clone $this->object1; } } ?>
Pokud je objektů více, je rozumné klonování zautomatizovat. Zapomenout nesmíme ani na pole objektů:
<?php /** Hluboká kopie pole nebo objektu, slouží k volání v metodě __clone() s parametrem $this * @param array pole nebo objekt, ve kterém chceme vytvořit hlubokou kopii * @return null změní prvky předaného pole * @copyright Jakub Vrána, https://php.vrana.cz/ */ function deep_clone(&$obj) { foreach ($obj as &$val) { if (is_object($val)) { $val = clone $val; } elseif (is_array($val)) { deep_clone($val); } } } class AutoClonable { function __clone() { deep_clone($this); } } ?>
Funkce deep_clone
prochází předané pole nebo objekt, do jeho prvků ukládá klony podřízených objektů a pole zpracovává rekurzivně. Potom stačí, aby jakýkoliv klonovatelný objekt ve své metodě __clone zavolal tuto funkci s parametrem $this.
Diskuse je zrušena z důvodu spamu.