Ich lese diesen Artikel über PHP-Variablenreferenzen: Ссылка und wollte überprüfen, ob mein Verständnis korrekt ist, wenn neue Variablencontainer erstellt werden.
Bei Nicht-Arrays werden variable Container immer dann erstellt, wenn Sie eine Variable zuweisen, die nicht auf einen Container verweist, für den is_ref gesetzt ist.
%Vor%Wie funktioniert es für Arrays? Es sieht nicht so aus, als ob das gleiche gilt. Zum Beispiel
%Vor%Meine Erwartung:
$ a und $ b zeigen auf denselben Container. Innerhalb dieses Containers haben wir 3 numerische_Tasten "0", "1", "2", die auf Container für die Ganzzahlen 1, 2 bzw. 3 zeigen.
Wenn wir $c = &$b[2]
ausführen, aktualisieren wir den Container mit der Ganzzahl 3:
Wenn wir $c = 4
ausführen, aktualisieren wir den Container mit der Ganzzahl 3:
Allerdings stimmt etwas nicht mit meiner Erwartung, denn $a[2] != 4
am Ende. Ich versuche herauszufinden, warum. Meine beste Vermutung ist, dass, wenn wir versuchen, Elemente eines Arrays oder Eigenschaften eines Objekts zu referenzieren, die PHP-Engine zuerst das Array / Objekt selbst überprüft, um zu sehen, ob is_ref = 1 ist. Wenn ja, funktioniert alles nach meinen Erwartungen. Wenn is_ref = 0, dann passiert etwas anderes, was ich sehe. Kann mir jemand mitteilen, was das "etwas anderes" ist?
BEARBEITEN Sieht so aus, als ob das tatsächlich passiert. Dieser Code sollte alles klären!
%Vor% Was Sie $a
erstellt haben, war eine einfache Variable. Wenn Sie jedoch $b
erstellt haben, hat PHP die Variable standardmäßig kopiert. So ist $b
nun völlig unabhängig von $a
, genau wie im ersten Beispiel.
Dann setzen Sie $c
gleich der Referenz auf $b[2]
. Sie zeigen also beide auf dieselbe Speicheradresse . Update eins und es aktualisiert das andere. Das Problem ist, dass $a
ebenfalls aktualisiert werden sollte, aber das sollte nicht sein, weil $b
eine eigene Variable ist. Überlegen Sie, was passiert, wenn wir $b
in einen Verweis auf $a
Das funktioniert so, wie du es beschreibst, weil $b
und $a
auf dasselbe verweisen (technisch ist $b
jetzt ein Symbol, das auf $a
zeigt)
Wenn Sie noch tiefer in das Thema eintauchen möchten, hier ist ein exzellenter Artikel, der es ausführlich behandelt. Ссылка
Tags und Links arrays php reference reference-counting