Heim  >  Artikel  >  Backend-Entwicklung  >  PHP objektorientiert – ausführliche Erklärung des Klonens von Objekten und der magischen Methode __clone()

PHP objektorientiert – ausführliche Erklärung des Klonens von Objekten und der magischen Methode __clone()

黄舟
黄舟Original
2017-03-25 10:15:201567Durchsuche

1.ObjektKlonen

Ein großer Nachteil der objektorientierten -Funktion von PHP4 besteht darin, dass es sich um Objekte handelt werden als ein anderer Datentyp behandelt, was viele gängige OOP-Methoden unbrauchbar macht, wie z. B. Entwurfsmuster. Diese Methoden basieren auf der Übergabe von Objekten als Referenzen an andere Klassenmethoden und nicht nach Wert, was die Standardpraxis von PHP ist. Glücklicherweise löst PHP5 dieses Problem und jetzt werden alle Objekte standardmäßig als Referenzen behandelt. Da jedoch alle Objekte als Referenzen und nicht als Werte behandelt werden, ist es jetzt schwieriger, Objekte zu kopieren. Wenn Sie versuchen, ein referenziertes Objekt zu kopieren, verweist dieses nur auf die Adresse des Originalobjekts. Um das Kopierproblem zu lösen, bietet PHP eine explizite Möglichkeit, ein Klonobjekt (Schlüsselwort, keine Methode) zu klonen.

Sie können das Objekt klonen, indem Sie das Schlüsselwort clone wie folgt vor dem Objekt hinzufügen:

destinationObject = clone targetObject;

Objekt klonen:

<?phpclass Person{
    var $name;    
    var $sex;    
    var $age;    
    function construct($name, $sex, $age){
        $this->name = $name;        
        $this->sex = $sex;        
        $this->age = $age;   
    }    function say(){
        echo "我的名字:" . $this->name . ",性别:" . $this->sex . ",年龄:" .$this->age . "<br />"; 
    }
}$person1 = new Person("张三三", "男", 23);
$person2 = clone $person1;   //使用clone关键字克隆/复制对象,创建一个对象的副本
$person3 = $person1;   //这不是复制对象,而是为对象多复制出一个访问该对象的引用
$person1->say();   //调用原对象中的说话方式,打印原对象中的全部属性值
$person2->say();   //调用副本对象中的说话方式,打印克隆对象中的全部属性值
$person3->say();   //调用原对象中的说话方式,打印原对象中的全部属性值?>

2.Magische Methodeclone()

Im obigen Programm werden insgesamt zwei Objekte erstellt, von denen eines eine durch geklonte Kopie ist Schlüsselwort clone. Zwei Objekte können völlig unabhängig sein, aber die Werte ihrer Mitglieder und Eigenschaften sind genau gleich. Wenn Sie während des Klonens den Mitgliedseigenschaften des geklonten Kopierobjekts Anfangswerte neu zuweisen müssen, können Sie in der Klasse eine magische Methode „clone()“ deklarieren. Diese Methode wird automatisch aufgerufen, wenn das Objekt geklont wird, sodass Sie die geklonte Kopie über diese Methode neu initialisieren können. Die Methode clone() benötigt keine Parameter. Schreiben Sie den Code im obigen Beispiel neu, fügen Sie der Klasse die magische Methode clone() hinzu und initialisieren Sie die Mitgliedseigenschaften im Kopierobjekt neu.

<?phpclass Person{
    var $name;    
    var $sex;    
    var $age;    
    function construct($name, $sex, $age){
        $this->name = $name;        
        $this->sex = $sex;        
        $this->age = $age;  
    }    function say(){
        echo "我的名字:" . $this->name . ",性别:" . $this->sex . ",年龄:" .$this->age . "<br />";    
    }    function clone(){
        $this->name = "李四四";   //为副本对象中的name属性重新赋值
        $this->age = 10;   //为副本对象中的age属性重新赋值
    }
}$person1 = new Person("张三三", "男", 23);
$person2 = clone $person1;  //创建一个对象的副本,并自动调用类中的clone()方法
$person1->say();   //调用原对象中的说话方式,打印原对象中的全部属性值
$person2->say();   //调用副本对象中的说话方式,打印克隆对象中的全部属性值?>

Laufende Ergebnisse:

我的名字:张三三,性别:男,年龄:23
我的名字:李四四,性别:男,年龄:10

3. Erweiterung der Singleton-Klasse: Klonen ist verboten

Für Wenn Sie den „KlonOperator“ für ein Objekt einer Klasse verwenden, wird ein neues Objekt kopiert, das genau dem aktuellen Objekt entspricht, und dabei wird automatisch die magische Methode der Klasse aufgerufen Zeit: clone( ) (solange die Methode in der Klasse existiert).
Wenn Sie eine Singleton-Klasse implementieren möchten, sollten Sie für das Objekt dieser Singleton-Klasse das Klonen deaktivieren . Um zu verhindern, dass das Klonen des Singleton-Klassenobjekts die obige Implementierungsform der Singleton-Klasse beeinträchtigt, wird in PHP normalerweise ein leerer privater (privat modifizierter) Klon dafür bereitgestellt ()Verfahren.
 
Schauen wir uns zunächst die Wirkung von „Kein Klonen ist verboten“ an:

<?php
class SingetonBasic {
    private static $instance;  
    //静态变量要私有化,防止类外修改

    private function construct() {    
    //构造函数私有化,类外不能直接新建对象}
    //
    private function clone() {} 
    //在clone()前用private修饰,用来禁止克隆
    public static function getInstance() {  //公共的静态方法,
    public——外部的接口,static——不使用对象而是通过类名访问
    if (!(self::$instance instanceof self)) { //私有静态变量$instance为空
        self::$instance = new self();  //新建为自身的对象,并赋值给私有变量$instance
    }    return self::$instance;	//返回私有变量$instance}

}$a = SingetonBasic::getInstance();$b = SingetonBasic::getInstance();
var_dump($a === $b);   //结果为:boolean true     a和b指向的是同一个对象$c = clone $a;
var_dump($a === $c); //结果为:boolean false      a和c指向的不是同一个对象?>

Das Ergebnis der Operation ist

boolean trueboolean false

Wir „verbieten das Klonen“ der Verarbeitung, das heißt, wir entfernen den

-Kommentar
private function clone() {}   //在clone()前用private修饰,用来禁止克隆
aus der

-Codezeile im obigen Code.

Das laufende Ergebnis ist

boolean trueFatal error: Call to private SingetonBasic::clone()

Das heißt, beim Klonen wird clone() automatisch aufgerufen, die Methode wird jedoch privat geändert und kann nicht direkt von außerhalb der Klasse aufgerufen werden, was dazu führt ein Fehler.

Das obige ist der detaillierte Inhalt vonPHP objektorientiert – ausführliche Erklärung des Klonens von Objekten und der magischen Methode __clone(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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