Warum kopiert foreach das Array, wenn wir es nicht in der Schleife geändert haben? [Duplikat]

9

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?

    
Pacerier 11.08.2013, 14:51
quelle

2 Antworten

1

Ihre Frage wird in dem Artikel beantwortet, mit dem Sie verlinkt sind. Es ist in der Sektion

angegeben
  

Nicht 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.

    
Sven 11.08.2013 15:00
quelle
1

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

    
Sutandiono 11.08.2013 15:13
quelle

Tags und Links