Maison  >  Article  >  développement back-end  >  Comment appeler __clone() en PHP

Comment appeler __clone() en PHP

墨辰丷
墨辰丷original
2018-06-05 17:42:011497parcourir

Cet article présente principalement comment appeler __clone() en PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Vous pouvez définir une méthode __clone() dans la classe d'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 produisez des données pour montrer que la tiecolor de l'objet cloné est bien 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:

Ce qui précède attribue simplement une classe à une autre classe, il y a donc encore un objet dans la 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 fait une copie superficielle d'une instance d'objet. Les types numériques de base dans l'objet sont copiés par valeur, et les variables membres du type d'objet dans l'objet, si __clone n'est pas remplacé par la méthode, si vous clonez explicitement la variable membre de l'objet, la variable membre est copiée par référence au lieu de générer un nouvel objet. Comme le dit le commentaire à la ligne 28 de l'exemple ci-dessous

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

sortie :

Le code est le suivant :

object(Person)#1 (4) { ["id":"Person":private]=> int(1) ["name":"Person":private]=> string(5) "peter" ["age":"Person":private]=> int(15) ["account"]=> object(Account)#2 (1) { ["balance"]=> int(1000) } } object(Person)#3 (4) { ["id":"Person":private]=> int(0) ["name":"Person":private]=> string(5) "peter" ["age":"Person":private]=> int(15) ["account"]=> object(Account)#4 (1) { ["balance"]=> int(250) } }
Résumé : Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

Recommandations associées :

Explication détaillée du principe de pagination PHP, du code de pagination, de la méthode de production de classe de pagination et des exemples

Étapes de vérification pour le développement de la version PHP de la plateforme publique WeChat Explication détaillée des exemples (à lire absolument)

Méthode php de suppression de répertoires de fichiers basée sur la récursivité

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