PHP-Referenzübergabe in Foreach
In PHP können Variablen entweder normale Variablen oder Referenzvariablen sein. Wenn eine Referenz einer Variablen einer anderen Variablen zugewiesen wird, wird diese zu einer Referenzvariablen, die im Wesentlichen an denselben Speicherort wie das Original bindet. Dieses Verhalten hat Auswirkungen, wenn die foreach-Schleife mit der Pass-by-Reference-Syntax (&) verwendet wird.
Betrachten Sie den folgenden Code:
$a = ['zero', 'one', 'two', 'three']; foreach ($a as &$v) { } foreach ($a as $v) { echo $v . PHP_EOL; }
Die Ausgabe dieses Codes ist:
zero one two two
Warum passiert das?
In der ersten foreach-Schleife wird jedes Element von $a als a zugewiesen Verweis auf die Variable $v. Dies bedeutet, dass jede Änderung an $v auch das entsprechende Element in $a ändert.
Konkret wird $v während der letzten Iteration der ersten Schleife der Wert von $a[3] zugewiesen (d. h. ' drei'). Diese Zuweisung erzeugt jedoch eine Referenzbeziehung, sodass $a[3] zu einer Referenzvariablen wird (auch wenn sie nicht explizit mit & zugewiesen wird).
In der zweiten foreach-Schleife werden die Werte der Elemente in $ a werden gedruckt. Da $a[3] nun jedoch eine Referenzvariable ist, ändert sich ihr Wert zusammen mit dem Wert von $v. Wenn $v während der dritten Iteration der Wert „zwei“ zugewiesen wird, wird $a[3] ebenfalls zu „zwei“.
Als Ergebnis wurde in der letzten Iteration $v (das immer noch auf $a zeigt [3]) hat den Wert „zwei“ und es wird „zwei“ ausgegeben. Dies erklärt, warum „zwei“ in der letzten Iteration wiederholt wird, anstatt „drei“ auszugeben, wie man intuitiv erwarten könnte.
Das obige ist der detaillierte Inhalt vonWarum ändern PHPs foreach mit Pass-by-Reference (&) Array-Elemente unerwartet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!