In einer Blog-Post "PHP Internals: When does foreach copy", erklärte Nikić, dass, wie dies in einem Code:Warum kopiert foreach das Array, wenn wir es nicht in der Schleife geändert haben?
Snippet 1
$array = range(0, 100000);
foreach ($array as $key => $value) {
xdebug_debug_zval('array'); // array is not copied, only refcount is increased
}
foreach
wird das Array nicht kopieren, weil das einzige, was foreach
modifiziert über $array
ist es intern Arrayzeiger.
Er erklärte auch, dass in einem Code wie folgt aus:
Snippet 2
$array = range(0, 100000); // line 1
test($array);
function test($array) {
foreach ($array as $key => $value) { // line 4
xdebug_debug_zval('array'); // array is copied, refcount not increased
// ...
}
}
foreach
das Array kopiert werden, denn wenn es nicht der Fall war, die $array
Variable in Zeile 1 geändert werden würde .
jedoch das einzige, was foreach
modifiziert über $array
ist es Zeiger interne Array ist. Also warum ist es 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?
Von dem, was ich weiß, ist, dass konnte nicht viel, Sie Array immer als Kopie ist vorbei, weil Sie es als Referenz nicht sind vorbei. – JorgeeFG
@Jorge, der Punkt ist, warum php nur weich kopiert (refcount erhöhen) in Schnipsel 1, aber hart in Schnipsel 2 kopiert? Warum können wir nicht auch in Snippet 2 kopieren, da es keine Änderungen am Array gibt? – Pacerier
@Pacerier http://php.net/manual/en/language.references.pass.php –