Ausführliche Erläuterung der Klonmethode php__clone() und Anwendungsbeispiele für flaches und tiefes Klonen

伊谢尔伦
Freigeben: 2023-03-14 09:12:02
Original
2963 Leute haben es durchsucht

Sie können eine clone()-Methode in der Klasse Objekt definieren, um das Klonverhalten des Objekts anzupassen . Der Code für diese Methode wird während des Klonvorgangs ausgeführt. Zusätzlich zum Kopieren aller vorhandenen Objektmitglieder in das Zielobjekt werden die von der clone()-Methode angegebenen Vorgänge ausgeführt. Ändern Sie als Nächstes die Corporate_Drone-Klasse und fügen Sie die folgenden Methoden hinzu:

function clone() { 
 $this->tiecolor = "blue";
}
Nach dem Login kopieren

Erstellen Sie anschließend ein neues Corporate_Drone-Objekt, erhöhen Sie den Wert des Employeeid-Mitglieds, klonen Sie das Objekt und geben Sie dann einige Daten aus um das geklonte Objekt anzuzeigen, wird die Krawattenfarbe tatsächlich über die clone()-Methode festgelegt. Beispielcode:

<?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 />";
?>
Nach dem Login kopieren

Ergebnis der Programmausführung

drone1 employeeID: 12345
drone2 employeeID: 67890
drone2 tiecolor:
Nach dem Login kopieren

Ein weiteres kleines Beispiel:

<?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();
?>
Nach dem Login kopieren

Das Obige weist nur eine Klasse einer anderen Klasse zu, also gibt es zu diesem Zeitpunkt immer noch ein Objekt in der Erinnerung.

<?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();
?>
Nach dem Login kopieren

Die Klonmethode klont eine neue Klasse, sodass sich zu diesem Zeitpunkt zwei Objekte im Speicher befinden.

Die clone()-Methode von PHP erstellt eine flache Kopie einer Objektinstanz. Der grundlegende numerische Typ im Objekt wird nach Wert kopiert, und die Objekttyp-Mitgliedsvariablen im Objekt, falls Wenn Sie die Klonmethode nicht überschreiben und die Objektmitgliedsvariable nicht explizit klonen, wird die Mitgliedsvariable durch Übergeben einer -Referenz kopiert, anstatt ein neues Objekt zu generieren, wie im -Kommentar in Zeile 28 gezeigt Im Beispiel unten heißt es

<?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);
  
 ?>
Nach dem Login kopieren

Flaches Klonen: Klonen Sie nur Nicht-Objekt-Nicht-Ressourcen-Daten im Objekt, das heißt, die Attribute im Objekt speichern den Objekttyp, dann wird das Klonen unvollständig auftreten

<?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);
Nach dem Login kopieren

Die laufenden Ergebnisse sind wie folgt:

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
Nach dem Login kopieren

Deep Cloning: Alle Attributdaten eines Objekts werden vollständig kopiert. Sie müssen die magische Methode < verwenden 🎜>clone() und Deep Cloning darin implementieren

<?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);
Nach dem Login kopieren
Die laufenden Ergebnisse sind wie folgt:

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Klonmethode php__clone() und Anwendungsbeispiele für flaches und tiefes Klonen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage