PHP Foreach Pass by Reference und Array Modification
In PHP kann die Verwendung von Pass by Reference in einer foreach-Schleife zu unerwartetem Verhalten führen. Betrachten Sie den folgenden Code:
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) {} // Array remains unchanged: ["foo", "bar", "baz"] foreach ($arr as $item) {} // Array is modified: ["foo", "bar", "bar"]
Warum ändert die zweite Schleife das Array?
In der ersten Schleife wird die Variable $item als Referenz übergeben. Das bedeutet, dass an $item vorgenommene Änderungen auch das entsprechende Element im $arr-Array beeinflussen. In der zweiten Schleife wird $item jedoch als Wert übergeben. Daher wirken sich Änderungen an $item nicht auf das Array aus.
Entscheidend ist, dass $item nach der ersten Schleife immer noch auf das letzte Element von $arr verweist. Wenn die zweite Schleife das Array durchläuft, überschreibt jeder Wert von $item das letzte Element von $arr, da beide auf denselben Speicherort verweisen.
Debuggen der Ausgabe
Um das Verhalten zu verstehen, können wir den aktuellen Wert von $item wiedergeben und das Array $arr während jeder Schleife rekursiv ausgeben Iteration.
Erste Schleife:
foo Array ( [0] => foo [1] => bar [2] => baz ) bar Array ( [0] => foo [1] => bar [2] => baz ) baz Array ( [0] => foo [1] => bar [2] => baz )
Nach der ersten Schleife zeigt $item auf das letzte Element von $arr.
Zweite Schleife:
foo Array ( [0] => foo [1] => bar [2] => foo ) bar Array ( [0] => foo [1] => bar [2] => bar ) bar Array ( [0] => foo [1] => bar [2] => bar )
Da jeder Wert von $item überschrieben wird, wird er auch überschrieben ändert das letzte Element von $arr.
Ist es ein Bug?
Nein, dieses Verhalten ist kein Bug, sondern das beabsichtigte Verhalten der Pass-by-Reference . Es ist wichtig, die Auswirkungen der Übergabe von Variablen als Referenz zu verstehen und sie angemessen zu verwenden.
Das obige ist der detaillierte Inhalt vonWarum ändert die Verwendung von Pass-by-Reference in einer PHP-„foreach'-Schleife das Array, nachdem die Schleife endet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!