Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist der Unterschied zwischen Deep Copy und Shallow Copy in PHP?

Was ist der Unterschied zwischen Deep Copy und Shallow Copy in PHP?

WBOY
WBOYOriginal
2022-02-10 09:53:472702Durchsuche

Der Unterschied zwischen Deep Copy und Shallow Copy in PHP: 1. Deep Copy ist eine vollständige Kopie, wenn ein Wert zugewiesen wird, während Shallow Copy nur eine Referenzzuweisung ist, was der Übernahme eines Alias ​​entspricht. 2. Wenn Deep Copy Änderungen an vornimmt Eine davon hat keinen Einfluss auf eine andere, und oberflächliche Kopieränderungen an einer davon wirken sich auf die andere aus.

Was ist der Unterschied zwischen Deep Copy und Shallow Copy in PHP?

Die Betriebsumgebung dieses Tutorials: Windows 10-System, PHP-Version 7.1, DELL G3-Computer

Was ist der Unterschied zwischen Deep Copy und Shallow Copy in PHP? Kopieren: Beim Zuweisen wird der Wert vollständig kopiert. Eine vollständige Kopie wirkt sich nicht auf die andere aus. Bei der Zuweisung entspricht die Referenzzuweisung der Übernahme eines Alias. Änderungen an einem von ihnen wirken sich auf das andere aus.

Wenn in PHP = zugewiesen wird, ist das gewöhnliche Objekt eine tiefe Kopie, aber für das Objekt ist es eine flache Kopie. Mit anderen Worten handelt es sich bei der Zuweisung eines Objekts um eine Referenzzuweisung. (Wenn ein Objekt als Parameter übergeben wird, wird es auch als Referenz übergeben, unabhängig davon, ob beim Definieren der Funktion ein kaufmännisches Und vor dem Parameter steht.)

In PHP4 besteht die =-Zuweisung des Objekts darin, a zu implementieren Kopieren, was viele Probleme mit sich bringt.

In PHP5 sind = Zuweisung und Übertragung von Objekten beide Referenzen. Um eine Kopie zu implementieren, stellt PHP die Implementierung der Klonfunktion bereit.

Clone erstellt eine vollständige Kopie. Wenn wir jedoch beim Klonen möglicherweise nicht den gesamten Inhalt des Quellobjekts kopieren möchten, können wir den Vorgang mit __clone ausführen.

In __clone() können wir einige Operationen ausführen. Beachten Sie, dass diese Vorgänge, also die __clone-Funktion, auf das kopierte Kopierobjekt angewendet werden.

Aber es gibt ein Problem mit der Klonfunktion. Wenn ein Objekt geklont wird, können die gewöhnlichen Attribute des Originalobjekts nach Wert kopiert werden. Wenn jedoch die Objektattribute des Quellobjekts zugewiesen werden, handelt es sich immer noch um Referenzzuweisungen und oberflächlich Kopien.

<?php
//普通对象赋值,深拷贝,完全值复制
$m = 1;
$n = $m;
$n = 2;
echo $m;//值复制,对新对象的改变不会对m作出改变,输出 1.深拷贝
echo PHP_EOL;
/*==================*/
 
//对象赋值,浅拷贝,引用赋值
class Test{
    public $a=1;
}
$m = new Test();
$n = $m;//引用赋值
$m->a = 2;//修改m,n也随之改变
echo $n->a;//输出2,浅拷贝
echo PHP_EOL;
?>

 Um eine wirklich tiefe Kopie eines Objekts zu erhalten, gibt es zwei Methoden:

Schreiben Sie die Klonfunktion wie folgt:

<?php
class Test{
    public $a=1;
}
 
class TestOne{
    public $b=1;
    public $obj;
    //包含了一个对象属性,clone时,它会是浅拷贝
    public function __construct(){
        $this->obj = new Test();
    }
}
$m = new TestOne();
$n = $m;//这是完全的浅拷贝,无论普通属性还是对象属性
 
$p = clone $m;
 
//普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
$p->b = 2;
echo $m->b;//输出原来的1
echo PHP_EOL;
 
//对象属性是浅拷贝,改变对象属性中的a,源对象m中的对象属性中a也改变
 
$p->obj->a = 3;
echo $m->obj->a;//输出3,随新对象改变
?>

 Es ist nicht praktisch, die Funktion __clone() neu zu schreiben, und Sie müssen diese Klasse einfügen Jede Klasse Die Objektattribute werden alle einzeln in __clone()

Die zweite Methode wird durch Serialisierung und Deserialisierung implementiert. Diese Methode ist einfach, die tiefe Kopie des Objekts zu realisieren und erfordert keine Änderung der Klasse

<?php
class Test{
    public $a=1;
}
 
class TestOne{
    public $b=1;
    public $obj;
    //包含了一个对象属性,clone时,它会是浅拷贝
    public function __construct(){
        $this->obj = new Test();
    }
     
    //方法一:重写clone函数
    public function __clone(){
        $this->obj = clone $this->obj;
    }
}
 
$m = new TestOne();
$n = clone $m;
 
$n->b = 2;
echo $m->b;//输出原来的1
echo PHP_EOL;
//可以看到,普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
 
//由于改写了clone函数,现在对象属性也实现了真正的深拷贝,对新对象的改变,不会影响源对象
$n->obj->a = 3;
echo $m->obj->a;//输出1,不随新对象改变,还是保持了原来的属性
 
?>

Es gibt auch die dritte Methode. Die Methode ähnelt tatsächlich der zweiten, json_encode und dann json_decode, um die Aufgabe zu erfüllen

Empfohlenes Lernen: „

PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Deep Copy und Shallow Copy in PHP?. 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