Maison  >  Article  >  développement back-end  >  En savoir plus sur le clonage d'objets PHP

En savoir plus sur le clonage d'objets PHP

jacklove
jackloveoriginal
2018-06-09 14:42:331722parcourir

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 = &#39;fdipzone&#39;;
		$this->age = &#39;30&#39;;
	}
	public function __clone(){
		$this->name = &#39;xfdipzone&#39;;
		$this->age = &#39;29&#39;;
	}
}
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 &#39;<pre class="brush:php;toolbar:false">&#39;;
echo &#39;obj<br>&#39;;
var_dump($obj);
echo &#39;<br>obj2<br>&#39;;
var_dump($obj2);
echo &#39;ok&#39;;
echo &#39;
'; ?>

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 = &#39;OK&#39;;
	}
	public function __clone(){
		$this->num = 2;	
	}
}
$obj = new myclass();
$obj->num = 1;
echo &#39;print obj values<br>&#39;;
var_dump($obj);
echo &#39;<br><br>&#39;;
$obj2 = clone $obj;
echo &#39;clone obj to obj2<br>&#39;;
echo &#39;obj->num:&#39;.$obj->num.&#39;<br>&#39;;
echo &#39;obj->msg:&#39;.$obj->msg.&#39;<br>&#39;;
echo &#39;obj2->num:&#39;.$obj2->num.&#39;<br>&#39;;
echo &#39;obj2->msg:&#39;.$obj2->msg.&#39;<br><br>&#39;;
$obj2->num = 3;
$obj2->msg = &#39;Yes&#39;;
echo &#39;set obj2->num=3, obj2->msg=Yes<br>&#39;;
echo &#39;obj->num:&#39;.$obj->num.&#39;<br>&#39;;
echo &#39;obj->msg:&#39;.$obj->msg.&#39;<br>&#39;;
echo &#39;obj2->num:&#39;.$obj2->num.&#39;<br>&#39;;
echo &#39;obj2->msg:&#39;.$obj2->msg.&#39;<br><br>&#39;;
?>

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn