Heim  >  Artikel  >  Backend-Entwicklung  >  Erfahren Sie mehr über das Klonen von PHP-Objekten

Erfahren Sie mehr über das Klonen von PHP-Objekten

jacklove
jackloveOriginal
2018-06-09 14:42:331721Durchsuche

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 = &#39;fdipzone&#39;;
		$this->age = &#39;30&#39;;
	}
	public function __clone(){
		$this->name = &#39;xfdipzone&#39;;
		$this->age = &#39;29&#39;;
	}
}
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 &#39;<pre class="brush:php;toolbar:false">&#39;;
echo &#39;obj<br>&#39;;
var_dump($obj);
echo &#39;<br>obj2<br>&#39;;
var_dump($obj2);
echo &#39;ok&#39;;
echo &#39;
'; ?>

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 = &#39;OK&#39;;
	}
	public function __clone(){
		$this->num = 2;	
	}
}
$obj = new myclass();
$obj->num = 1;
echo &#39;print obj values<br>&#39;;
var_dump($obj);
echo &#39;<br><br>&#39;;
$obj2 = clone $obj;
echo &#39;clone obj to obj2<br>&#39;;
echo &#39;obj->num:&#39;.$obj->num.&#39;<br>&#39;;
echo &#39;obj->msg:&#39;.$obj->msg.&#39;<br>&#39;;
echo &#39;obj2->num:&#39;.$obj2->num.&#39;<br>&#39;;
echo &#39;obj2->msg:&#39;.$obj2->msg.&#39;<br><br>&#39;;
$obj2->num = 3;
$obj2->msg = &#39;Yes&#39;;
echo &#39;set obj2->num=3, obj2->msg=Yes<br>&#39;;
echo &#39;obj->num:&#39;.$obj->num.&#39;<br>&#39;;
echo &#39;obj->msg:&#39;.$obj->msg.&#39;<br>&#39;;
echo &#39;obj2->num:&#39;.$obj2->num.&#39;<br>&#39;;
echo &#39;obj2->msg:&#39;.$obj2->msg.&#39;<br><br>&#39;;
?>

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!

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