Klonování objektů

Školení, která pořádám

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.

Jakub Vrána, Výuka, 28.3.2007, diskuse: 1 (nové: 0)

Diskuse

cita:

jake mas reseni pro objekty, ktere implementuji nejakz ten iterator?

nebylo by vhodnejsi pouzit reflectionclass?

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.