09/10/2024 Tech
L’introduction des itérateurs dans la version 5 de PHP en 2004 a considérablement amélioré la méthodologie de manipulation de grandes quantités de données de manière performante et organisée.
L’un des avantages les plus importants de l’utilisation des itérateurs réside dans la manière dont la mémoire est gérée en arrière-plan. Le secret de cette mécanique repose sur le fait que les itérables ne sont jamais chargés entièrement dans la mémoire, seulement la valeur de l’itération courante. C’est grâce à cette mécanique qu’il est possible de parcourir de gros itérables sans saturer la mémoire.
Une multitude d’itérateurs sont déjà disponibles de base dans la Standard PHP Library (SPL), il vaut donc la peine de les consulter avant de se lancer dans la création d’un itérateur personnalisé.
Regardons l’utilisation de l’ArrayIterator, proposé par la SPL :
$arrayIterator = new ArrayIterator([
"firstIterationKey" => "FirstIterationValue",
"secondIterationKey" => "SecondIterationValue",
"thirdIterationKey" => "ThirdIterationValue",
]);
foreach($arrayIterator as $key => $value) {
// $key string(17) "firstIterationKey"
// $value string(19) "FirstIterationValue"
// ...
}
et oui… c’est aussi simple que ça. Il suffit simplement de l’utiliser avec un foreach, qui se charge d'appeler les méthodes qui seront expliquées par la suite, pour faire avancer l’itération.
Maintenant, imaginons qu’aucun des itérateurs proposés par la SPL ne corresponde à nos besoins. Comment mentionné précédemment, nous pouvons simplement créer notre propre iterator en implémentant l’interface Iterator.
Quatre méthodes sont imposées par l’interface Iterator. Voyons quelles sont ces quatre méthodes et quel est leur rôle :
class MyCutomIterator implements Iterator {
// Retourne la valeur de l'itération courante
public current(): mixed
// Retourne la position de l'iteration courante
public key(): mixed
// Permet de passer à l'itération suivante
public next(): void
// Permet de reinitialiser le pointeur
public rewind(): void
// Méthode en charge de verifier si la position du prochaine iteration existe.
public valid(): bool
}
Maintenant que nous savons comment utiliser les itérateurs, regardons ce qui se passe en coulisses.
Les étapes suivantes vont décrire comment foreach gère le parcours d’un itérable :
Première étape: Initialisation du foreach.
Deuxième étape : Vérification de la structure de données reçue pour déterminer si elle est traversable. À noter : seules les structures de données qui implémentent l’interface Traversable peuvent être parcourues avec foreach.
Troisième étape : À cette étape, PHP crée un itérateur pour cette structure de données si elle est traversable. À noter : que si la structure de données reçue implémente déjà l’interface Iterator, PHP considère que la structure est prête à être parcourue. Sinon, PHP crée un itérateur pour elle. Il ne faut pas oublier que foreach fonctionne uniquement avec des iterables.
Quatrième étape : La méthode rewind() est appelée pour initialiser le pointeur. Celle-ci est nécessaire pour s’assurer que l’itération commence depuis le début de l’itérable.
Cinquième étape : La méthode valid() est appelée pour savoir si la prochaine position de l’itérable existe. Dans le cas où valid() retourne true, l’itération se poursuit. Dans le cas contraire, cela signifie qu’il n’y a plus de position, donc l’itération se termine.
Sixième étape : La méthode current() est appelée pour récupérer la valeur de l’itération courante. C’est à ce moment-là que $value et $key sont populés.
Septième étape : Le code à “l’intérieur” du foreach est exécuté.
Huitième étape : La méthode next() est appelée pour faire avancer le pointeur à la prochaine position de l’itérable.
Et voilà comment fonctionnent les itérateurs. Au final, on peut dire qu’à partir du moment où l’on utilise le foreach, on utilise les itérateurs sans s’en rendre compte, finalement.
Si cet article t’a plu, n’hésite pas à lire mon article sur Sonata Exporter
Comprendre et utiliser les itérateurs en PHP was originally published in ekino-france on Medium, where people are continuing the conversation by highlighting and responding to this story.