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!

InformationsquelleAutor ddamasceno | 2011-08-07