L'objet de copie et de clone en PHP
De considérer les éléments suivants:
$object1 = new stdClass();
$object2 = $object1;
$object3 = clone $object1;
$object1->content = 'Ciao';
var_dump($object1);
//Outputs object(stdClass)#1 (1) { ["content"]=> string(4) "Ciao" }
var_dump($object2);
//Outputs object(stdClass)#1 (1) { ["content"]=> string(4) "Ciao" }
var_dump($object3);
//Outputs object(stdClass)#2 (0) { }
Est-il normal PHP comportement $object2
a un contenu identique à $object1
?
Pour moi ça sonne comme $object2
est une référence à $object1
au lieu d'une copie.
Le clonage de l'objet avant de modifier le contenu de l'acte comme une copie.
Ce comportement est différent de ce qui se passe avec les variables et ne semble pas intuitif pour moi.
- C'est juste un autre PHP-WTF résultant de l'absence de spécifications.
- Voir l'exemple ici: php.net/manual/en/language.oop5.references.php.
- Pouvez-vous expliquer un peu pourquoi c'est pas intuitif pour vous?
- C'est pas intuitif pour moi parce que la logique des changements avec le type de variable. Comme expliqué dans les réponses suivantes, il ne doit pas se comporter de cette façon avec des tableaux par exemple.
- À mon avis, c'est plutôt pas intuitif dans ce qu'il est,
$obj2 = $obj1
et$obj2 =& $obj1
faire la même chose. - ils ne font pas tout à fait la même chose.
$obj2 = $obj1
résultats dans 2 références pour le même objet sous-jacent. Ainsi, si vous ne$obj2 = $obj3
, votre$obj1
variable n'est pas affectée. Mais si, au lieu de commencer par faire$obj2 =& $obj1
vous vous retrouvez avec 2 variables partage la même référence! Ensuite, si vous ne$obj2 = $obj3
, vous trouverez que$obj1
maintenant les points à$obj3
ainsi!
Vous devez vous connecter pour publier un commentaire.
Oui, c'est normal. Les objets sont toujours "affecté" par référence en PHP5. Pour réellement faire une copie d'un objet, vous devez
clone
il.Pour être plus correct bien, permettez-moi de citer le manuel:
C'est normal et je n'envisage pas de cette non-intuitif (pour les instances d'objet):
Assigne une nouvelle instance de l'objet à
$object1
.Attribue l'instance de l'objet à
$object2
.Attribue une nouvelle instance de l'objet cloné à partir d'une instance de l'objet à
$object3
.S'il ne serait pas de cette façon, chaque fois que vous avez besoin pour passer un objet concret exemple, vous avez besoin de le passer par référence. C'est lourd, au moins, mais PHP n'a donc, dans la version 4 (comparer
zend.ze1_compatibility_mode
core ). Qui n'était pas utile.Le clonage permet à l'objet de préciser comment il est copié.
copie d'objet vs clone de l'objet
maintenant clone d'un objet
Objets en php5 sont essentiellement des pointeurs, c'est un objet variable ne contient que l'adresse de l'objet de données qui se trouve quelque part d'autre. Une cession
$obj1 = $obj2
seulement de copier cette adresse et ne touche pas les données elles-mêmes. Cela peut en effet sembler contre-intuitif, mais en fait c'est bien pratique, parce qu'on a rarement besoin d'avoir deux copies de l'objet. Je souhaite que les tableaux php utilisé la même sémantique.ArrayObject
$result = new ArrayObject(array_map($cb, $arrOb->getArrayCopy()));