Beim Kopieren von PHP-Objekten wird die Referenzadresse des Objekts kopiert. Wenn also $objA = $objB verwendet wird, verweisen $objA und $objB auf dieselbe Speicheradresse. Wenn sich $objA ändert, ist auch $objB betroffen.
Wenn wir möchten, dass das Objekt $objA in das Objekt $objB kopiert wird, wirken sich alle Änderungen an $objA nach dem Kopieren nicht auf $objB aus. Das heißt, $objA und $objB sind zwei unabhängige Objekte, aber der Anfangswert von $objB wird von $objA erstellt. Eine effizientere Möglichkeit ist die Verwendung der Methode clone().
$objB = clone $objA;
Der Wert von $objB ist die Instanz, die durch die clone()-Methode im $objA-Instanzobjekt geändert wurde.
Wenn das Objekt kopiert wird, bleiben die Referenzen in allen Attributen unverändert und verweisen auf die ursprünglichen Variablen. Wenn die Methode __clone() definiert ist, wird dies auch bei der Methode __clone() der Fall sein aufgerufen werden und kann verwendet werden, um den Wert des Attributs zu ändern.
Beispiel 1: Objekt klonen
<?php class subclass{ private $name; private $age; public function __construct(){ $this->name = 'fdipzone'; $this->age = '30'; } public function __clone(){ $this->name = 'xfdipzone'; $this->age = '29'; } } class myclass{ public $p1; public $p2; public function __construct(){ } public function __clone(){ $this->p1 = clone $this->p1; } } $obj = new myclass(); $obj->p1 = new subclass(); $obj->p2 = new subclass(); $obj2 = clone $obj; echo '<pre class="brush:php;toolbar:false">'; echo 'obj<br>'; var_dump($obj); echo '<br>obj2<br>'; var_dump($obj2); echo 'ok'; echo ''; ?>
Das obige Beispiel gibt Folgendes aus:
obj object(myclass)#1 (2) { ["p1"]=> object(subclass)#2 (2) { ["name":"subclass":private]=> string(8) "fdipzone" ["age":"subclass":private]=> string(2) "30" } ["p2"]=> object(subclass)#3 (2) { ["name":"subclass":private]=> string(8) "fdipzone" ["age":"subclass":private]=> string(2) "30" } } obj2 object(myclass)#4 (2) { ["p1"]=> object(subclass)#5 (2) { ["name":"subclass":private]=> string(9) "xfdipzone" ["age":"subclass":private]=> string(2) "29" } ["p2"]=> object(subclass)#3 (2) { ["name":"subclass":private]=> string(8) "fdipzone" ["age":"subclass":private]=> string(2) "30" } }
Wie Sie sehen können, klonen $obj2 $obj, $obj->p1 klonen $obj->p1 und die Methode __clone() wird ausgeführt. In der __clone-Methode werden die Namens- und Altersattribute von p1 geändert, sodass sich Name und Alter von p1 ändern. Da p2 die clone()-Methode nicht ausgeführt hat, sind die Eigenschaften des neu kopierten $obj2->p2 dieselben wie $obj->p2.
Beispiel 2: Klonen Sie das Objekt, aber einige Attributreferenzen bleiben unverändert.
<?php class myclass{ public $num = null; public $msg = null; public function __construct(){ $this->num = & $this->num; $this->msg = 'OK'; } public function __clone(){ $this->num = 2; } } $obj = new myclass(); $obj->num = 1; echo 'print obj values<br>'; var_dump($obj); echo '<br><br>'; $obj2 = clone $obj; echo 'clone obj to obj2<br>'; echo 'obj->num:'.$obj->num.'<br>'; echo 'obj->msg:'.$obj->msg.'<br>'; echo 'obj2->num:'.$obj2->num.'<br>'; echo 'obj2->msg:'.$obj2->msg.'<br><br>'; $obj2->num = 3; $obj2->msg = 'Yes'; echo 'set obj2->num=3, obj2->msg=Yes<br>'; echo 'obj->num:'.$obj->num.'<br>'; echo 'obj->msg:'.$obj->msg.'<br>'; echo 'obj2->num:'.$obj2->num.'<br>'; echo 'obj2->msg:'.$obj2->msg.'<br><br>'; ?>
Das obige Beispiel gibt Folgendes aus:
print obj values object(myclass)#1 (2) { ["num"]=> &int(1) ["msg"]=> string(2) "OK" } clone obj to obj2 obj->num:2 obj->msg:OK obj2->num:2 obj2->msg:OK set obj2->num=3, obj2->msg=Yes obj->num:3 obj->msg:OK obj2->num:3 obj2->msg:Yes
weil $this->num = &$this- > ;num, also bezieht sich $this->num des neuen Objekts nach clone() auf die Speicheradresse des alten Objekts. Wenn sich also die Eigenschaften des alten Objekts ändern, ändern sich auch die Eigenschaften des neuen Objekts, sodass die Verweise auf bestimmte Eigenschaften unverändert bleiben.
Und $this->msg ist keine Adressreferenz. Wenn sich also die Nachricht des neuen Objekts ändert, hat dies keine Auswirkungen auf das alte Objekt.
Hinweis: $this->num = & $this->num Wenn Sie eine Objektattribut-Adressreferenz verwenden, können Sie dieses Attribut vor dem Klonen nicht echoen/drucken , andernfalls ist die Adressreferenz ungültig.
Wenn im obigen Beispiel $obj2 = clone $obj zuvor hinzugefügt wurde, erstellt echo $obj->num; Der tatsächliche Effekt besteht darin, dass sich $obj->num nicht ändert, wenn sich $obj2->num ändert.
In diesem Artikel wird der verwandte Inhalt des PHP-Objektklonens vorgestellt. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Verwandte Empfehlungen:
Verwandte Vorgänge im allgemeinen MySQL-Protokoll
Einführung in die PHP-Cookie-Operationsklasse
Einführung in den PHP-Kurs zur Passwortgenerierung
Das obige ist der detaillierte Inhalt vonErfahren Sie mehr über das Klonen von PHP-Objekten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!