Maison >développement back-end >tutoriel php >Explication détaillée de la méthode de clonage php__clone() et exemples d'utilisation du clonage superficiel et du clonage profond
Vous pouvez définir une méthode clone() dans la classe objet pour ajuster le comportement de clonage de l'objet . Le code de cette méthode sera exécuté lors de l'opération de clonage. En plus de copier tous les membres d'objet existants vers l'objet cible, les opérations spécifiées par la méthode clone() sont effectuées. Ensuite, modifiez la classe Corporate_Drone et ajoutez les méthodes suivantes :
function clone() { $this->tiecolor = "blue"; }
Après cela, créez un nouvel objet Corporate_Drone, augmentez la valeur du membre Employeeid, clonez l'objet, puis affichez certaines données. pour afficher l'objet cloné. La tiecolor est en effet définie via la méthode clone(). Exemple de code :
<?php // Create new corporatedrone object $drone1 = new corporatedrone(); // Set the $drone1 employeeid member $drone1->setEmployeeID("12345"); // Clone the $drone1 object $drone2 = clone $drone1; // Set the $drone2 employeeid member $drone2->setEmployeeID("67890"); // Output the $drone1 and $drone2 employeeid members echo "drone1 employeeID: ".$drone1->getEmployeeID()."<br />"; echo "drone2 employeeID: ".$drone2->getEmployeeID()."<br />"; echo "drone2 tiecolor: ".$drone2->getTiecolor()."<br />"; ?>
Résultat de l'exécution du programme
drone1 employeeID: 12345 drone2 employeeID: 67890 drone2 tiecolor:
Un autre petit exemple :
<?php class Fruit { private $name = "水果"; private $color = "颜色"; public function setName($name){ $this->name = $name; } public function setColor($color){ $this->color = $color; } function showColor(){ return $this->color.'的'.$this->name."<br />"; } function destruct(){ echo "被吃掉了(对象被回收) <br />"; } } $apple = new Fruit(); $apple->setName("大苹果"); $apple->setColor("红色"); echo $apple->showColor(); $clone_apple = $apple; $clone_apple->setName("小苹果"); $clone_apple->setColor("青色"); echo $clone_apple->showColor(); ?>
Ce qui précède attribue simplement une classe à une autre classe, il y a donc encore un objet en mémoire à ce moment.
<?php class Fruit { private $name = "水果"; private $color = "颜色"; public function setName($name){ $this->name = $name; } public function setColor($color){ $this->color = $color; } function showColor(){ return $this->color.'的'.$this->name."<br />"; } function destruct(){ echo "被吃掉了(对象被回收) <br />"; } function clone(){ $this->name = "克隆水果"; } } $apple = new Fruit(); $apple->setName("大苹果"); $apple->setColor("红色"); echo $apple->showColor(); $clone_apple = clone $apple; $clone_apple->setColor("青色"); echo $clone_apple->showColor(); ?>
La méthode clone clone une nouvelle classe, il y a donc deux objets dans la mémoire à ce moment.
La méthode clone() de PHP crée une copie superficielle d'une instance d'objet. Le type numérique de base dans l'objet est copié par valeur, et les variables membres du type d'objet dans l'objet, si. Si vous ne remplacez pas la méthode clone et ne clonez pas explicitement la variable membre de l'objet, la variable membre sera copiée en passant une référence au lieu de générer un nouvel objet comme indiqué dans le commentaire à la ligne 28. de l'exemple ci-dessous dit
<?php class Account { public $balance; public function construct($balance) { $this->balance = $balance; } } class Person { private $id; private $name; private $age; public $account; public function construct($name, $age, Account $account) { $this->name = $name; $this->age = $age; $this->account = $account; } public function setId($id) { $this->id = $id; } public function clone() { #复制方法,可在里面定义再clone是进行的操作 $this->id = 0; $this->account = clone $this->account; #不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改 } } $person = new Person("peter", 15, new Account(1000)); $person->setId(1); $person2 = clone $person; $person2->account->balance = 250; var_dump($person, $person2); ?>
Clonage superficiel : clonez uniquement les données non-objet et non-ressource dans l'objet, c'est-à-dire que les attributs dans l'objet stockent le type d'objet, puis un clonage incomplet sera se produire
<?php class B{ public $val = 10; } class A{ public $val = 20; public $b; public function construct(){ $this->b = new B(); } } $obj_a = new A(); $obj_b = clone $obj_a; $obj_a->val = 30; $obj_a->b->val = 40; var_dump($obj_a); echo '<br>'; var_dump($obj_b);
Les résultats d'exécution sont les suivants :
object(A)[1] public 'val' => int 30 public 'b' => object(B)[2] public 'val' => int 40 object(A)[3] public 'val' => int 20 public 'b' => object(B)[2] public 'val' => int 40
Clonage profond : toutes les données d'attribut d'un objet sont entièrement copiées. Vous devez utiliser la méthode magique <.>clone() et implémentez-y le clonage profond
<?php class B{ public $val = 10; } class A{ public $val = 20; public $b; public function construct(){ $this->b = new B(); } public function clone(){ $this->b = clone $this->b; } } $obj_a = new A(); $obj_b = clone $obj_a; $obj_a->val = 30; $obj_a->b->val = 40; var_dump($obj_a); echo '<br>'; var_dump($obj_b);Les résultats en cours sont les suivants :
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!