Explication détaillée de la méthode de clonage php__clone() et exemples d'utilisation du clonage superficiel et du clonage profond

伊谢尔伦
Libérer: 2023-03-14 09:12:02
original
2912 Les gens l'ont consulté

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";
}
Copier après la connexion

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 />";
?>
Copier après la connexion

Résultat de l'exécution du programme

drone1 employeeID: 12345
drone2 employeeID: 67890
drone2 tiecolor:
Copier après la connexion

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.&#39;的&#39;.$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();
?>
Copier après la connexion

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.&#39;的&#39;.$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();
?>
Copier après la connexion

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);
  
 ?>
Copier après la connexion

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 &#39;<br>&#39;;
var_dump($obj_b);
Copier après la connexion

Les résultats d'exécution sont les suivants :

object(A)[1]
 public &#39;val&#39; => int 30
 public &#39;b&#39; =>
 object(B)[2]
  public &#39;val&#39; => int 40
 
object(A)[3]
 public &#39;val&#39; => int 20
 public &#39;b&#39; =>
 object(B)[2]
  public &#39;val&#39; => int 40
Copier après la connexion

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 &#39;<br>&#39;;
var_dump($obj_b);
Copier après la connexion
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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!