Detaillierte Beispiele für flaches Kopieren und tiefes Kopieren in PHP
Vorwort:
Kürzlich den Design-Pattern-Aspekt besprochen, als ich Als ich das Entwurfsmuster von Prototype Pattern sah, fiel mir auf, dass es ein Problem des flachen Kopierens und des tiefen Kopierens mit sich bringt. Lassen Sie mich es hier zusammenfassen und mich daran erinnern, in Zukunft mehr Aufmerksamkeit zu schenken.
Seit PHP5 gibt der neueOperator automatisch eine Referenz zurück. Eine Objektvariable speichert nicht mehr den Wert des gesamten Objekts, sondern nur noch einen Bezeichner, um auf den tatsächlichen Objektinhalt zuzugreifen. Wenn ein Objekt als Parameter übergeben, als Ergebnis zurückgegeben oder einer anderen Variablen zugewiesen wird, hat die andere Variable keine Referenzbeziehung zum Original, aber beide speichern eine Kopie desselben Bezeichners, der auf den tatsächlichen Inhalt von verweist das gleiche Objekt.
Hier ist ein Beispiel:
class Example1 { public $name; public function construct($name) { $this->name = $name; } } $ex1 = new Example('test1');// $ex1->name现在是:test1 $ex2 = $ex1;// $ex2->name现在是:test1 $ex2->name = 'test2';// 这样修改一下之后,$ex1->name与$ex2->name都变为了:test2
Anhand des obigen Beispiels sollten Sie in der Lage sein, das Konzept der Referenzen zwischen Objekten zu verstehen, dann werden wir weiter nach unten gehen und bereitstellen In PHP wird das Schlüsselwort clone zum Objektkopieren verwendet. Lassen Sie uns die obige Klasse verwenden, um zu demonstrieren:
$ex1 = new Example('test1');// $ex1->name现在是:test1 $ex2 = clone $ex1;//$ex2->name现在是:test1 $ex2->name = 'test2';//现在$ex1->name还是test1,而$ex2->name是test2
Wie Sie hier sehen können, sind $ex1 und $ex2 nach dem Klonen zwei Verschiedene Objekte haben ihre eigenen variablen Umgebungen. Dabei ist jedoch zu beachten, dass es sich innerhalb dieser beiden Objekte um Werttypdaten handelt. Wenn es sich bei dem internen Besitz um einen Referenztyp handelt, verweist die durch das Klonen erhaltene Referenz im neuen Objekt immer noch auf die ursprüngliche Referenz. Hier ist das Konzept der flachen Kopie und der tiefen Kopie:
Flache Kopie: Diese Art der Kopie wird als „flache Kopie“ bezeichnet denselben Wert wie das Originalobjekt und alle Verweise auf andere Objekte verweisen weiterhin auf das Originalobjekt.
Tiefe Kopie: Alle Variablen des kopierten Objekts enthalten dieselben Werte wie das Originalobjekt, mit Ausnahme der Variablen, die auf andere Objekte verweisen.
Die Standardverwendung von Klonen besteht darin, eine flache Kopie durchzuführen. Wie führt man also eine tiefe Kopie durch?
Methode 1: Verwenden Sie die Klonmethode
public function clone() { $this->obj = new Obj(); }
Diese Methode ist sehr intuitiv, aber es gibt eine sehr umständliche Bedienungsmethode, nämlich wann in einer Klasse Wenn mehrere Referenzen enthalten sind, müssen Sie diese in der Klonmethode einzeln zurücksetzen. Und wir müssen uns auch mit einigen zirkulären Referenzproblemen befassen. Es ist sehr kompliziert.
Methode 2: Serialisierung verwenden (Kühlung und Auftauen)
$tmp = serialize($ex1); $ex2 = unserialize($tmp);
Das zu diesem Zeitpunkt erhaltene $ex2 ist ein brandneues Objekt. Dieser Prozess ist auch in Java werden als „Kühl-“ und „Auftau“-Prozesse bezeichnet.
Serialisierung ist ein rekursiver Prozess. Wir müssen uns nicht darum kümmern, wie viele Objekte innerhalb des Objekts referenziert werden und wie viele Ebenen von Objekten referenziert werden Es. Methode 2 ist wirklich pornographisch und gewalttätig, gefällt mir aber sehr gut.
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung von Shallow Copy und Deep Copy in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!