Comment fonctionne réellement PHP 'foreach' ?
En PHP, l'instruction foreach est une construction de langage utilisée pour parcourir les éléments d'un tableau ou un objet traversable. La boucle foreach est conçue pour fonctionner de manière prévisible et efficace, et elle a subi des changements importants entre PHP 5 et PHP 7 pour améliorer ses fonctionnalités et ses performances.
PHP 5
En PHP 5, l'instruction foreach utilise un pointeur de tableau interne (IAP) pour suivre et gérer l'itération. L'IAP est un mécanisme centralisé qui permet à plusieurs boucles foreach et autres fonctions qui interagissent avec le tableau de coordonner leurs opérations.
Cependant, en raison de l'utilisation d'un IAP partagé, foreach dans PHP 5 présentait plusieurs limitations :
-
Duplication de tableau : Si un tableau référencé était itéré par valeur, le tableau était dupliqué pour empêcher les modifications pendant l'itération n'affecte pas le tableau d'origine (par exemple, lors de l'utilisation de fonctions telles que reset(), each(), etc.). Cette duplication inutile a eu un impact sur les performances.
-
Interférence avec IAP : les modifications apportées à l'IAP via des fonctions telles que reset() n'affectaient pas toujours la boucle foreach. Cela pourrait conduire à un comportement inattendu dans certains scénarios.
PHP 7
PHP 7 a introduit des améliorations significatives à l'implémentation de foreach. Le changement le plus notable est l'introduction de itérateurs de table de hachage externes, qui ont remplacé l'IAP unique.
-
Tables de hachage externes : chaque boucle foreach maintient sa propre table de hachage externe itérateur. Cet itérateur garde une trace de la position actuelle et d'autres informations pertinentes dans le tableau ou l'objet itéré. Grâce à ces itérateurs indépendants, la boucle foreach ne modifie plus l'IAP du tableau sous-jacent, éliminant ainsi les problèmes d'interférence.
-
Aucune duplication de tableau : En PHP 7, l'itération par valeur des tableaux ne impliquent des dédoublements. Si le tableau est modifié pendant la boucle, il sera cloné à la demande (suivant le mécanisme de copie sur écriture). Cela améliore considérablement les performances par rapport aux duplications inutiles de PHP 5.
Impact sur le comportement
Les changements dans l'implémentation de foreach de PHP 7 ont entraîné plusieurs différences de comportement par rapport à PHP5 :
-
Modifications du tableau : En PHP 5, les modifications apportées à un tableau référencé lors d'une boucle foreach par valeur seraient reflétées dans la boucle. Cependant, en PHP 7, l'itération par valeur des tableaux opère toujours sur les éléments d'origine, quelles que soient les modifications apportées pendant la boucle.
-
Modifications IAP : modifications apportées à l'IAP à l'aide de fonctions telles que la réinitialisation () n'a plus d'impact direct sur la boucle foreach dans PHP 7. foreach maintient son propre itérateur, qui n'est pas affecté par les modifications externes apportées au IAP.
Consignes d'utilisation
Pour garantir une utilisation optimale et éviter des problèmes potentiels avec l'instruction foreach, tenez compte des directives suivantes :
- Préférez l'itération par valeur autant que possible. Cela évite la création d'un itérateur supplémentaire et améliore les performances.
- Soyez conscient des changements de comportement entre PHP 5 et PHP 7 concernant les modifications de tableaux lors de l'itération par valeur.
- Soyez prudent lors de la modification le tableau ou l'objet étant itéré lors d'une boucle foreach, car cela peut entraîner un comportement inattendu en fonction des circonstances spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Déclaration:Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn