Heim >Backend-Entwicklung >PHP-Tutorial >Warum ändern PHPs foreach mit Pass-by-Reference (&) Array-Elemente unerwartet?

Warum ändern PHPs foreach mit Pass-by-Reference (&) Array-Elemente unerwartet?

DDD
DDDOriginal
2024-12-11 04:41:09418Durchsuche

Why does PHP's foreach with pass-by-reference (&) change array elements unexpectedly?

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!

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