200 votes

Comment créer une copie d’un objet en PHP ?

Il semble qu’en PHP, les objets sont passés par référence. Opérateurs d’assignation même ne semblent pas être de créer une copie de l’objet.

Voici une preuve simple, tirée par les cheveux :

Dans les deux cas impression j’obtiens « après »

Alors, comment passer $a à set_b() de valeur, et non par référence ?

328voto

Eran Galperin Points 49594

En PHP 5 + objets sont passés par référence. En PHP 4, ils sont passés par valeur (c’est pourquoi elle a duree passer par référence, qui est devenu obsolète).

Vous pouvez utiliser l’opérateur « clone » en PHP5 pour copier des objets :

En outre, il est seulement les objets qui sont passés par référence, pas tout, comme vous l’avez dit dans votre question...

119voto

yogman Points 2091

Les réponses sont généralement trouvés dans Java livres.

  1. clonage: Si vous n'avez pas remplacer méthode clone, le comportement par défaut est la copie superficielle. Si vos objets seule primitive variables de membre, il est tout à fait ok. Mais dans un sans type de langue avec un autre objet en tant que variables membres, c'est un mal de tête.

  2. la sérialisation/désérialisation

$new_object = unserialize(serialize($your_object))

Cela permet d'obtenir copie en profondeur avec un lourd coût en fonction de la complexité de l'objet.

27voto

Stanislav Points 1994

Selon le commentaire précédent, si vous avez un autre objet comme une variable membre, suite :

Maintenant vous pouvez faire le clonage :

12voto

Leo Points 1587

Selon les docs (http://ca3.php.net/language.oop5.cloning):

$a = clone $b;

1voto

zloctb Points 531

Ce code à l'aide clone méthodes

class Foo{

    private $run=10;
    public $foo=array(2,array(2,8));
    public function hoo(){return 5;}


    public function __clone(){

        $this->boo=function(){$this->hoo();};

    }
}
$obj=new Foo;

$news=  clone $obj;
var_dump($news->hoo());

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X