2015-12-04 1 views
9

foreach en PHP7 par défaut, lorsque itérer en valeur, fonctionne sur une copie du tableau selon: http://php.net/manual/en/migration70.incompatible.phpchangements foreach dans PHP7

-t-il créer paresseusement une copie que s'il y a des modifications apportées au tableau ou une valeur ou va-t-il toujours en faire une copie et faire en sorte que le référencement sur une référence soit une optimisation de la performance?

De même, est-ce que les tableaux d'objets sont toujours en boucle/vous donnent des références des objets? Ou vont-ils également créer des copies pour le foreach et retourner les objets par valeur?

+0

Selon [la réponse en haut ici] (http://stackoverflow.com/questions/10057671/how-does-foreach-actually-work?rq=1) il y a aussi une copie faite en PHP5 lors de l'itération par valeur. – Kenney

+2

Suggestion: Juste itérer et ne pas essayer d'optimiser en "écrivant un code efficace". La plupart du temps, il suffit d'utiliser les constructions et de les laisser découvrir comment exécuter du code. Ce n'est que si vous mesurez que la performance n'est pas acceptable que vous voudriez faire un changement. (Pas une réponse ou downvote car il y a une raison académique de poser la question, mais cela vaut la peine d'indiquer) – ircmaxell

+0

@ircmaxell cela pourrait être formulé briefer: http://stackoverflow.com/questions/385506/when-is-optimisation- prématuré –

Répondre

12

En PHP 7, si vous itérez un tableau par valeur, la copie sera faite paresseusement, seulement si et quand le tableau est réellement modifié.

Si vous itérez un tableau par référence, une séparation sera effectuée au début de la boucle. Si le tableau est actuellement utilisé à plusieurs endroits, cette séparation entraînera une copie. Par ailleurs, l'itération par référence signifie que a) le réseau doit être enveloppé dans une référence et b) chaque élément doit également être enveloppé dans une référence. Créer une enveloppe de référence est une opération coûteuse, car elle nécessite une allocation.

De plus, l'itération par référence nécessite l'utilisation d'un mécanisme d'itération à modification de sécurité. Cela fonctionne en enregistrant l'itérateur avec le tableau et en vérifiant les itérateurs potentiellement affectés dans diverses opérations de modification de tableau. Donc non, l'itération par référence n'est certainement pas une optimisation, c'est une désoptimisation. L'utilisation de références est généralement.