Wie funktionieren PHP-Referenzen unter Arrays für Arrays?

8

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:

  • is_ref = 0 wird is_ref = 1
  • ref_count = 1 wird ref_count = 2.

Wenn wir $c = 4 ausführen, aktualisieren wir den Container mit der Ganzzahl 3:

  • Integer 3 wird zu Integer 4, da is_ref gesetzt ist

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%     
Popcorn 02.10.2014, 19:16
quelle

1 Antwort

2

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

ändern %Vor%

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. Ссылка

    
Machavity 02.10.2014, 21:02
quelle