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?

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 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.