La copie d'objet PHP consiste à copier l'adresse de référence de l'objet, donc lors de l'utilisation de $objA = $objB, $objA et $objB pointeront vers la même adresse mémoire. Lorsque $objA change, $objB est également affecté.
Si nous voulons que l'objet $objA soit copié dans un objet $objB, toute modification apportée à $objA après la copie n'affectera pas $objB. Autrement dit, $objA et $objB sont deux objets indépendants, mais la valeur initiale de $objB est créée par $objA. Un moyen plus efficace consiste à utiliser la méthode clone().
$objB = clone $objA;
La valeur de $objB est l'instance modifiée par la méthode clone() dans l'objet instance $objA.
Lorsque l'objet est copié, les références dans tous les attributs restent inchangées et pointent vers les variables d'origine. Si la méthode __clone() est définie, la méthode __clone() le sera. être appelé et peut être utilisé pour modifier la valeur de l’attribut.
Exemple 1 : objet clone
<?php class subclass{ private $name; private $age; public function __construct(){ $this->name = 'fdipzone'; $this->age = '30'; } public function __clone(){ $this->name = 'xfdipzone'; $this->age = '29'; } } class myclass{ public $p1; public $p2; public function __construct(){ } public function __clone(){ $this->p1 = clone $this->p1; } } $obj = new myclass(); $obj->p1 = new subclass(); $obj->p2 = new subclass(); $obj2 = clone $obj; echo '<pre class="brush:php;toolbar:false">'; echo 'obj<br>'; var_dump($obj); echo '<br>obj2<br>'; var_dump($obj2); echo 'ok'; echo ''; ?>
L'exemple ci-dessus affichera :
obj object(myclass)#1 (2) { ["p1"]=> object(subclass)#2 (2) { ["name":"subclass":private]=> string(8) "fdipzone" ["age":"subclass":private]=> string(2) "30" } ["p2"]=> object(subclass)#3 (2) { ["name":"subclass":private]=> string(8) "fdipzone" ["age":"subclass":private]=> string(2) "30" } } obj2 object(myclass)#4 (2) { ["p1"]=> object(subclass)#5 (2) { ["name":"subclass":private]=> string(9) "xfdipzone" ["age":"subclass":private]=> string(2) "29" } ["p2"]=> object(subclass)#3 (2) { ["name":"subclass":private]=> string(8) "fdipzone" ["age":"subclass":private]=> string(2) "30" } }
Comme vous pouvez le voir, $obj2 clone $obj, $obj->p1 clone $obj->p1 et la méthode __clone() est exécutée. Dans la méthode __clone, les attributs name et age de p1 sont modifiés, donc le nom et l'âge de p1 changent. Puisque p2 n'a pas exécuté la méthode clone(), les propriétés du $obj2->p2 nouvellement copié sont les mêmes que celles de $obj->p2.
Exemple 2 : Clonez l'objet, mais certaines références d'attribut restent inchangées.
<?php class myclass{ public $num = null; public $msg = null; public function __construct(){ $this->num = & $this->num; $this->msg = 'OK'; } public function __clone(){ $this->num = 2; } } $obj = new myclass(); $obj->num = 1; echo 'print obj values<br>'; var_dump($obj); echo '<br><br>'; $obj2 = clone $obj; echo 'clone obj to obj2<br>'; echo 'obj->num:'.$obj->num.'<br>'; echo 'obj->msg:'.$obj->msg.'<br>'; echo 'obj2->num:'.$obj2->num.'<br>'; echo 'obj2->msg:'.$obj2->msg.'<br><br>'; $obj2->num = 3; $obj2->msg = 'Yes'; echo 'set obj2->num=3, obj2->msg=Yes<br>'; echo 'obj->num:'.$obj->num.'<br>'; echo 'obj->msg:'.$obj->msg.'<br>'; echo 'obj2->num:'.$obj2->num.'<br>'; echo 'obj2->msg:'.$obj2->msg.'<br><br>'; ?>
L'exemple ci-dessus affichera :
print obj values object(myclass)#1 (2) { ["num"]=> &int(1) ["msg"]=> string(2) "OK" } clone obj to obj2 obj->num:2 obj->msg:OK obj2->num:2 obj2->msg:OK set obj2->num=3, obj2->msg=Yes obj->num:3 obj->msg:OK obj2->num:3 obj2->msg:Yes
car $this->num = & $this->num, donc après clone(), $this->num du nouvel objet fait référence à l'adresse mémoire de l'ancien objet. Par conséquent, si les propriétés de l'ancien objet changent, les propriétés du nouvel objet changeront également, de sorte que les références à certaines propriétés restent inchangées.
Et $this->msg n'est pas une référence d'adresse, donc si le msg du nouvel objet change, cela n'affectera pas l'ancien objet.
Remarque : $this->num = & $this->num Lorsque vous utilisez la référence d'adresse d'attribut d'objet, vous ne pouvez pas faire écho/imprimer cet attribut avant le clonage , sinon la référence d'adresse sera invalide.
Dans l'exemple ci-dessus, si $obj2 = clone $obj est ajouté avant, echo $obj->num; L'effet réel est que si $obj2->num change, $obj->num ne changera pas.
Cet article présente le contenu associé au clonage d'objets PHP. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois.
Recommandations associées :
Opérations associées sur le journal général MySQL
Introduction à la classe d'opérations php Cookies
Introduction à la classe de génération de mot de passe PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!