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

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

伊谢尔伦
伊谢尔伦original
2017-07-17 11:57:453018parcourir

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.&#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();
?>

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();
?>

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 &#39;<br>&#39;;
var_dump($obj_b);

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

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);
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!

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