11/12/10, Fil:
avec http://core.spip.org/trac/spip/changeset/16670 je propose de
remplacer le CORPS des boucles par un appel à un itérateur générique
n'ayant pas la notion de SQL.
Super idée. (bon je connais pas le fonctionnement du compilo et tout
ça, mais vu comme ça de l'extérieur je trouve ça chouette).
A noter : PHP offre aussi une notion d'itérateur générique
PHP: Iterator - Manual
Du coup, y a-t-il une raison pour ne pas avoir mis de
"implements Iterator" après la définition de la classe Iter ? A priori
tes fonctions se mappent assez bien :
Iterator::current = Iter::select
Iterator::key = un compteur interne incrémenté à chaque pas
(#COMPTEUR_BOUCLE)
Iterator::next = Iter::next
Iterator::rewind = Iter::seek(0)
Iterator::valid() = Iter::ok
Bien sûr dans un premier temps le seul itérateur connu est de type
SQL. Mais en évacuant la notion SQL dans la classe d'itération, on
peut désormais imaginer un itérateur JSON ou FICHIERS ou ... TABLEAU
PHP.
Bonne idée. Du coup on pourrait avoir un système d'héritage. Par
exemple :
IterateurSPIP implements Iterator
Ça définit les fonctions d'Iterator (current, key, next, rewind,
valid), plus celles dont on a besoin pour SPIP le cas échéant,
genre free ou count qui sont pratiques.
IterateurSQL implements IterateurSPIP
IterateurJSON implements IterateurSPIP
IterateurArray implements IterateurSPIP
IterateurXML implements IterateurSPIP
(au lieu de Iterateur on peut dire Boucle)
Ainsi, SPIP utiliserait IterateurSPIP (ou BoucleSPIP), et un plugin
peut définir son propre IterateurPatate (BouclePatate) qui implémente
les fonctions définies dans IterateurSPIP, un peu comme on fait déjà
sur l'interface d'abstraction SQL.
Petite question peut-être inutile, mais que c'est bien de poser au cas
où : a priori, le type d'objet renvoyé par un Iter est actuellement un
tableau (ayant pour clés et valeurs celles définies par sql_fetch). Si
on définit une interface d'abstraction pour les itérateurs SPIP, il
faudra voir si ça convient tel quel comme conteneur d'information.