Maison >développement back-end >tutoriel php >Comment fonctionne réellement la boucle « foreach » de PHP et comment son implémentation a-t-elle changé entre PHP 5 et PHP 7 ?

Comment fonctionne réellement la boucle « foreach » de PHP et comment son implémentation a-t-elle changé entre PHP 5 et PHP 7 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-23 22:20:18361parcourir

How Does PHP's `foreach` Loop Actually Work, and How Has Its Implementation Changed Between PHP 5 and PHP 7?

Comment foreach fonctionne réellement en PHP ?

Introduction :
foreach est largement utilisé en PHP pour le bouclage via des tableaux, des objets et d’autres structures de données. Comprendre son fonctionnement interne est crucial pour éviter tout comportement inattendu.

Trois types d'itérables foreach :
foreach prend en charge trois types d'itérables :

  • Tableaux
  • Objets normaux
  • Traversable objets

Itération d'objet traversable :
Pour les objets traversables, foreach agit comme un sucre syntaxique pour :

foreach ($it as $k => $v) {}

translates to:

if ($it instanceof IteratorAggregate) {
    $it = $it->getIterator();
}
for ($it->rewind(); $it->valid(); $it->next()) {
    $v = $it->current();
    $k = $it->key();
    // ...
}

Itération de tableau et d'objet :

Commandé Dictionnaires :
Les tableaux et objets PHP sont essentiellement des dictionnaires ordonnés qui maintiennent l'ordre d'insertion. L'itération suit cet ordre.

Conversion des objets :
Les représentations d'objets compressées sont converties en dictionnaires lors de l'itération. L'itération d'objet simple devient ainsi similaire à l'itération de tableau.

Pointeur de tableau interne (IAP) :
Les tableaux en PHP 5 ont un pointeur de tableau interne (IAP) qui prend en charge les modifications et les sauts. sur les éléments supprimés.

HashPointer :
foreach en PHP 5 utilise un HashPointer pour sauvegarder la position IAP et le hachage avant d'exécuter le corps de la boucle. Il le restaure ensuite si l'élément existe toujours ; sinon, il utilise la position IAP actuelle.

Duplication de tableaux :
foreach en PHP 5 duplique des tableaux qui ne sont pas des références (is_ref=0) et ont un refcount supérieur à 1.

PHP5 Exemples :

  • Dans les cas de test 1 et 2, les tableaux ne sont pas dupliqués car ils ont refcount=1 et sont transmis par valeur.
  • Dans le cas de test 3, l'IAP est défini à la fin du tableau après la boucle en raison de la suppression d'éléments.
  • Dans les cas de test 4 et 5, les tableaux sont dupliqués car le Les fonctions by-ref (chacune, réinitialiser) reçoivent une référence à un tableau dupliqué.

Modifications PHP 7 :

Itérateurs de table de hachage :
PHP 7 utilise des itérateurs de table de hachage externes, enregistrés dans le tableau. Chaque itérateur est avancé si l'élément correspondant est supprimé.

Aucune utilisation d'IAP par foreach :
foreach n'utilise plus l'IAP, éliminant ainsi le besoin de duplication. L'itération du tableau par valeur utilise toujours les éléments d'origine.

Duplication de tableau :
Les tableaux ne sont plus dupliqués lors de l'itération par valeur, quel que soit leur décompte ou leur statut de référence.

Exemples PHP 7 :

  • En PHP 7, les cas de test 1 et 2 ont le même résultat qu'en PHP 5 car les tableaux ne sont pas dupliqués.
  • En PHP 7, le cas de test 3 produit une sortie différente car la boucle non n'affecte plus l'IAP.
  • Dans PHP 7, les cas de test 4 et 5 se comportent de la même manière car chacun et réinitialiser dupliquent toujours le tableau, tandis que foreach utilise l'original array.

Améliorations supplémentaires de PHP 7 :

  • Les boucles externes dans les itérations imbriquées ne sont plus interrompues lorsque des éléments sont supprimés dans les boucles internes.
  • Le problème de la "flèche dans le temps" est résolu.

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