Heim > Backend-Entwicklung > PHP-Tutorial > Wie man Objektreferenzen, flache Kopien und tiefe Kopien in PHP versteht

Wie man Objektreferenzen, flache Kopien und tiefe Kopien in PHP versteht

不言
Freigeben: 2023-03-23 12:36:01
Original
1492 Leute haben es durchsucht

In diesem Artikel erfahren Sie, wie Sie Objektreferenzen, flaches Kopieren und tiefes Kopieren in PHP verstehen.

Viele unerfahrene PHPer sind mit der OOP-Programmierung nicht vertraut Als ich kürzlich das Buch „Junior PHP Engineer“ las, war ich vage über den Objektreferenzteil. Nachdem ich einige Informationen überprüft und verstanden hatte, wollte ich hier eine Aufzeichnung erstellen und mir sagen, dass diese Grundlagen konsolidiert werden müssen.

Referenzartikel: https://blog.csdn.net/hel12he/article/details/49617023

                                                                                🎜>

Zuerst sollten wir verstehen, wie der Speicherplatz verteilt ist in PHP. Im Allgemeinen ist der Speicherplatz in

Heap-Speicher, Stapelspeicher, Datensegment, Codesegment unterteilt, wie unten gezeigt:

Was ist also ein Objektbezug? Wollstoff?

Wenn wir das Schlüsselwort new verwenden, um eine Klasse zu instanziieren, können wir über dieses Objekt auf die Eigenschaften und Methoden in der Klasse zugreifen. Und jedes Objekt ist unabhängig. Beispielsweise verfügt eine Autoklasse über Attribute wie Größe, Farbe und Fahrmethoden. Diese Klasse kann in mehrere Objekte instanziiert werden, und die Attributmethoden jedes Objekts können geändert werden verfügt über einen eigenen Speicherbereich, der die Attribute und Methoden der Instanzklasse enthält oder Aliase verwendet, die tatsächlich auf denselben Speicherbereich verweisen, zum Beispiel:

<?php
  class One
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }
}
//实例化,并且向构造函数传递参数
$o1 = new One(&#39;test1&#39;);
echo "对象1的name值为:".$o1->name."<br/>";
//引用
$o2 = $o1;
//打印对象2的$name属性
echo "对象2的name值为:".$o2->name."<br/>";
//修改对象$o2的$name属性
echo "修改对象2的name为test2"."<br/>";
$o2->name = &#39;test2&#39;;
//比较此时两个对象的$name值
echo "修改后对象1的name值为:".$o1->name."<br/>";
echo "修改后对象2的name值为:".$o2->name."<br/>";
Nach dem Login kopieren
Ergebnisse drucken:

Es ist ersichtlich, dass die Referenz im Wesentlichen nur ein Alias ​​​​des Objekts ist. Tatsächlich ist der Speicherplatz, auf den das referenzierte Objekt verweist, und das referenzierende Objekt immer noch derselbe . . (Der Effekt von $o2=&o1 ist hier derselbe).


Was ist also flache Kopie?

Konzept:

Klonen zum Kopieren eines Objekts verwenden. Diese Art der Kopie wird als „flache Kopie“ bezeichnet. Alle Variablen des zugewiesenen Objekts haben weiterhin denselben Wert wie das ursprüngliche Objekt und alle Verweise auf andere Objekte Beide verweisen weiterhin auf das ursprüngliche Objekt. Das heißt, eine flache Kopie kopiert nur das betrachtete Objekt, nicht die Objekte, auf die es verweist.

Lassen Sie uns dasselbe Beispiel verwenden und $o2=$o1 in $o2=clone $o1 ändern. Sehen Sie, was passiert. Das Druckergebnis sieht wie folgt aus:


Wie Sie sehen können, wenn wir nur den Wert von ändern Objekt 2 und Objekt 1 haben sich nicht geändert, da die Verwendung des Schlüsselworts clone eine Kopie des Objekts generiert. Diese Kopie verfügt auch über einen eigenen Speicherplatz und war zuvor unabhängig voneinander. Bei der flachen Kopie wird das Objekt, auf das es sich bezieht, jedoch nicht kopiert.


前面说的东西都是内容只有数值的情况,当内容中也有引用的对象那就不一样了,也就引出了深复制的概念。

深复制概念:被复制的对象的所有的变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。也就是说深复制把要复制的对象所引用的对象都复制了一遍。

两种方法:

利用__clone魔术方法

public function __clone()
{
    $this->obj = new Obj();
}
Nach dem Login kopieren


利用串行化

$t = serialize($o1);
$o2 = unserialize($t);
Nach dem Login kopieren


举个栗子:

<?php
header("Content-type:text/html;charset=utf-8");
class TvControl{
}
class Tv{
    private $color;
    private $tvControl;
    function __construct(){
        $this->color = "black";
        $this->tvControl = new TvControl();
    }
    
    function getTvControl(){
        return $this->tvControl;
    }
}
		$tv1 = new Tv();
		$tvControl1 = $tv1->getTvControl();
		echo "原始类:"."<br/>";
		var_dump($tv1);
		echo "<br/>";
		$tv2 = $tv1;
		echo "引用类:"."<br/>";
		var_dump($tv2);
		echo "<br/>";
		$tv3 = clone $tv1;
		echo "克隆(浅复制):"."<br/>";
		var_dump($tv3);
		echo "<br/>";
		$tv4 = unserialize(serialize($tv1));
		echo "深复制:"."<br/>";
		var_dump($tv4);
Nach dem Login kopieren

打印结果:


深复制获取到的对象也是一个全新的对象。

那么如何比较两个对象是否引用于同一个对象呢?

Wir können „===" verwenden, um zu vergleichen, ob zwei Objekte auf dasselbe Ausgangsobjekt verweisen. Und „==“ kann nur vergleichen, ob zwei Objekte dieselbe Klasse und dieselben Attribute haben.

Verwandte Empfehlungen:

Vertiefendes Verständnis der Zählfunktion von PHP-Arrays

Vertieftes Verständnis von PHP-Schleifenanweisungen


Das obige ist der detaillierte Inhalt vonWie man Objektreferenzen, flache Kopien und tiefe Kopien in PHP versteht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage