Exemples détaillés de copie superficielle et de copie profonde en PHP
Avant-propos :
J'ai récemment examiné l'aspect du modèle de conception lorsque j'ai J'ai vu le modèle de conception de Prototype Pattern, j'ai remarqué qu'il impliquait un problème de copie superficielle et de copie profonde. Permettez-moi de le résumer ici et de me rappeler d'y prêter plus d'attention à l'avenir.
Depuis PHP5, le nouvelopérateur renvoie automatiquement une référence. Une variable objet n'enregistre plus la valeur de l'objet entier, mais enregistre uniquement un identifiant pour accéder au contenu réel de l'objet. Lorsqu'un objet est passé en paramètre, renvoyé en résultat ou affecté à une autre variable, l'autre variable n'a aucune relation de référence avec celle d'origine, mais elles stockent toutes deux une copie du même identifiant, qui pointe vers le contenu réel de le même objet.
Voici un exemple :
class Example1 { public $name; public function construct($name) { $this->name = $name; } } $ex1 = new Example('test1');// $ex1->name现在是:test1 $ex2 = $ex1;// $ex2->name现在是:test1 $ex2->name = 'test2';// 这样修改一下之后,$ex1->name与$ex2->name都变为了:test2
Grâce à l'exemple ci-dessus, vous devriez être capable de comprendre la notion de références entre objets, nous continuerons ensuite à descendre et à fournir en php Le mot-clé clone est utilisé pour copier un objet Utilisons la classe ci-dessus pour démontrer :
$ex1 = new Example('test1');// $ex1->name现在是:test1 $ex2 = clone $ex1;//$ex2->name现在是:test1 $ex2->name = 'test2';//现在$ex1->name还是test1,而$ex2->name是test2
Comme vous pouvez le voir ici, après le clonage, $ex1 et $ex2 sont deux. objets différents, ils ont leurs propres environnements variables. Mais il convient de noter ici qu'à l'intérieur de ces deux objets, ce qui appartient, ce sont des données de type valeur. Si ce qui appartient en interne est un type référence, alors la référence dans le nouvel objet obtenu par clonage pointe toujours vers la référence d'origine. Voici le concept de copie superficielle et de copie profonde :
Copie superficielle : Utilisez le clonage pour copier des objets. Ce type de copie est appelé "copie superficielle". la même valeur que l'objet d'origine, et toutes les références à d'autres objets pointent toujours vers l'objet d'origine.
Copie complète : Toutes les variables de l'objet copié contiennent les mêmes valeurs que l'objet d'origine, à l'exception des variables qui font référence à d'autres objets.
L'utilisation par défaut de clone est d'effectuer une copie superficielle, alors comment effectuer une copie profonde ?
Méthode 1 : Utiliser la méthode de clonage
public function clone() { $this->obj = new Obj(); }
Cette méthode est très intuitive, mais il existe une méthode de fonctionnement très gênante, c'est-à-dire lorsque dans une classe Lorsqu'elle contient plusieurs références, vous devez les réinitialiser une par une dans la méthode clone. Et nous devons également faire face à certaines problématiques de référence circulaire . C'est très compliqué.
Méthode 2 : Utiliser la sérialisation (réfrigération et décongélation)
$tmp = serialize($ex1); $ex2 = unserialize($tmp);
Le $ex2 obtenu à ce moment est un tout nouvel objet. Ce processus est également en java. appelés processus de « réfrigération » et de « décongélation ».
La sérialisation est un processus récursif Nous n'avons pas besoin de nous soucier du nombre d'objets référencés dans l'objet et du nombre de couches d'objets référencées. il. La méthode 2 est vraiment pornographique et violente, mais je l'aime beaucoup.
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!