In einem Blogbeitrag "PHP Internals: Wann ist foreach kopieren ", erklärte NikiC in einem Code wie diesem:
Snippet 1
%Vor% foreach
kopiert das Array nicht, da das einzige, was foreach
an $array
ändert, der interne Array-Zeiger ist.
Er sagte auch, dass in einem Code wie folgt:
Snippet 2
%Vor% foreach
kopiert das Array, wenn nicht, würde die $array
Variable in Zeile 1 geändert werden.
Allerdings ist das einzige, was foreach
an $array
ändert, ist der interne Array-Zeiger . Warum ist es dann wichtig, wenn der interne Array-Zeiger der $array
-Variable in Zeile 1 geändert wird? In Snippet 1 spielte es keine Rolle, warum spielte es in Snippet 2 eine Rolle?
Warum muss foreach
das Array in Snippet 2 kopieren, obwohl wir es nicht in der Schleife geändert haben?
Ihre Frage wird in dem Artikel beantwortet, mit dem Sie verlinkt sind. Es ist in der Sektion
angegebenNicht referenziert, refcount & gt; 1
mit der Erklärung, dass eine Kopie der -Strukturen benötigt wird, weil sich der Array-Zeiger bewegt, und dies darf das äußere Array nicht beeinflussen.
Das liegt daran, dass im zweiten Fall $ array als Wert an die Funktion test()
übergeben wird. Daher wurde eine Kopie des Arrays $ in der Funktion erstellt, und foreach()
funktioniert in der Kopie. Anders verhält es sich, wenn das $ -Array durch Verweis auf die Funktion test()
übergeben wird.
Informationen über den Wert "pass by" und "pass by reference" siehe diese Frage
Tags und Links arrays php foreach php-internals