POO #10: Utiliser l'interface Iterator avec PHP 5
PHP 5 a apporté son lot de nouveautés en matière de programmation orientée objet, notamment la possibilité d'utiliser des Interfaces. Iterator en est une et nous allons voir comment l'utiliser grâce à ce tutoriel. La structure conditionnelle " foreach " vous permettait jusqu'à lors de parcourir le contenu d'un tableau. Avec la version 5 de PHP, vous pouvez désormais parcourir tout un objet pour récupérer ses propriétés.
Une interface est une manière de passer un contrat avec une classe, afin de s'assurer que celle-ci disposera bien de certaines méthodes/propriétés. Contrairement à l'héritage, il est possible d'implémenter plusieurs interfaces[1], ce qui permet de pallier à l'impossibilité d'utiliser l'héritage multiple en PHP.
L'interface native Iterator existe depuis déjà quelques temps en java et apporte un atout non négligeable en matière de programmation orientée objet. Voici ce à quoi ressemble le code de l'interface Iterator :
Ce qui affichera :
C'est là qu'intervient l'interface Iterator. Elle va en effet vous permettre de personnaliser le comportement de foreach. Implémenter cette interface dans votre classe vous oblige de surcharger (ou redéfinir) les 5 methodes suivantes : rewind(), next(), key(), current() et valid().
Ces méthodes seront appelées par foreach, dans cet ordre :
- rewind lors de la première iteration, qui vous permet de rembobiner votre objet (ici on remet $n à 0)
- valid qui vérifie que l'on n'est pas arrivé à la fin de notre itération (ici que $n est inferieur au nombre maximum d'itération fixé par la constante MAX). Si valid retourne TRUE, on poursuit sinon on s'arrête, c'est la fin de l'itération.
- current qui retourne la valeur de l'itération courante (ici $n)
- key qui retourne la clé de l'itération courante (ici key.$n )
- next qui lance l'itération suivante (ici, on incrémente $n de 1)
- Est en suite rappelée la méthode valid() qui vérifie une nouvelle fois que l'on n'est pas arrivé aux termes de l'Itération.
Note [1] : Une classe ne peut cependant pas implémenter deux interfaces partageant des noms de fonctions.
NB: Je rend grâce un vibrant hômmage au propriétairedu site https://apprendre-php.com/tutoriels.html, un site qui ma permis moi même d'apprendre les bases de PHP et le PHP Objet. Aujourd'hui je parviens à former pas mal d'étudiants raison pour laquelle je me dis pas meilleur que se site pour faire des tutos.