In un post sul blog "PHP Internals: When does foreach copy", Nikic ha dichiarato che in un codice come questo:Perché foreach copia l'array quando non lo abbiamo modificato nel ciclo?
Snippet 1
$array = range(0, 100000);
foreach ($array as $key => $value) {
xdebug_debug_zval('array'); // array is not copied, only refcount is increased
}
foreach
non copiare l'array perché l'unica cosa che foreach
modifica su $array
è il suo interno puntatore di array.
Ha anche precisato che in un codice come questo:
frammento 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
copierà la matrice, poiché se così non fosse, la variabile $array
in linea 1 sarebbe cambiato .
Tuttavia, l'unica cosa che foreach
modifica merito $array
è che è puntatore interno. Quindi perché importa se il puntatore dell'array interno della variabile $array
nella riga 1 è cambiato? Non importava nel frammento 1, perché aveva importanza nel frammento 2?
Perché lo standard foreach
deve copiare la matrice nello snippet 2, anche se non l'abbiamo modificata nel ciclo?
Da quello che so, che potrebbe essere non molto, si array è sempre passa come una copia, perché non si passa come riferimento. – JorgeeFG
@Jorge, il punto è il motivo per cui php è solo copiato (aumento del conto) in frammenti 1, ma copiato nel frammento 2? Perché non è possibile eseguire una copia soft nello snippet 2, poiché non c'è alcuna modifica all'array? – Pacerier
@Pacerier http://php.net/manual/en/language.references.pass.php –