Sortie fin juin, PHP 5.5.0 est disponible en version stable. Il est temps de vous faire part des nouvelles fonctionnalités disponibles en quelques articles. Voici donc le premier de la série.
Les Générateurs, concept qui ne sera pas nouveaux pour ceux qui connaissent d'autres langages de développement, [generators] permettent d’implémenter des itérateurs [iterators] sans implémenter l’interface Iterator. Mais qu’est-ce que ça veut dire ?
Un Générateur vous permet d’utiliser un foreach sans devoir parcourir un tableau d’éléments en mémoire. Une fonction Générateur est similaire à une fonction classique mais ne retourne pas qu’un seul résultat. Le générateur retournera autant de fois des valeurs qu’il est nécessaire. Cette nouvelle version de PHP introduit le mot-clef yield [produire].
L’avantage principal des générateurs est d’éviter de charger en mémoire de gros tableaux au risque d’atteindre la limite de mémoire disponible.
Prenons un cas concret. Si vous voulez parcourir un très long tableau de données, soit vous le charger entièrement en mémoire et vous le parcourez, soit vous ne charger qu’une ligne à la fois. Cette dernière méthode a pour avantages de ne pas surcharger la mémoire (limitée) pendant l’opération mais à un coût : les lignes de codes à écrire, ça devient vite long. Heureusement, les Générateurs sont là pour vous aider.
Dans l’exemple suivant, nous voulons générer une liste de nombres impairs ne dépassant pas la limite de 9. Grace aux Générateurs, nous pouvons appeler la fonction qui sera mise en pause dès que la limite sera atteinte. Lorsque cette limite est atteinte, elle est renvoyée à l’appelant. La fonction sera continuée lorsque l’appelant le demandera. Au lieu de stocker les nombres dans un tableau retourné en fin de fonction, nous pouvons utiliser yield pour qu’ils soient immédiatement passés à l’appelant.
<?php
function xrange($start, $limit, $step = 1) {
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
}
echo 'Chiffres impairs simplement : ';
/* Notez qu'aucun tableau n'est créé ni retourné,
* ce qui préserve la mémoire */
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
?>
L’exemple affiche : Chiffre paire simple depuis range(): 1 3 5 7 9
Dans l’exemple présenté ci-dessus, vous remarquerez que la fonction xrange() n’a pas de return mais un yield. Le yield ne retourne pas une seule valeur mais autant de valeur qui sont demandées. Une fois toutes les valeurs épuisées, le code suit son parcours normalement.
Si vous avez besoins de tableaux associatifs ou de valeurs par référence (&$value) comme retour de générateurs, cela est aussi possible. Je vous invite à lire la documentation sur le sujet ici
Les générateurs ne révolutionnent pas le code mais le rendent plus clair et plus concis.