|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 897 ![]() |
Bonjour à tous.
Je vous propose la classe PDOStatementIterator. J'ai été amené à créer cette classe pour faciliter l'usage des Iterators avec les PDOStatement car bien que ces derniers implémentent l'interface Traversable, il n'est pas possible de l'utiliser comme un Iterator (du moins pas directement). Il est vrai que l'usage de IteratorIterator nous permet de contourner ce problème, mais on aimerai grandement pouvoir se positionner dans le PDOStatement (SeekableIterator) et compter le nombre de lignes retournées (Countable), c'est là que PDOStatement entre en scène. Voici le code source de la classe: Code :
L'usage de cette classe est indépendant du fetch_mode choisi dans le PDOStatement, ce qui la rends bien pratique pour récupérer des collections en LazyLoading. Exemple: Code :
Voir également la discussion d'origine: http://www.developpez.net/forums/d10...oo-orm-entite/ Vos commentaires sont les bienvenus.
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
||||
|
00
|
|
|
#2 |
![]() ![]() Julien PauliArchitecte de système d'information Inscription : mai 2006 Messages : 603 ![]() |
A vue de nez, je dirai nikel.
Traversable est compliquée, elle déclare un itérateur interne, donc on peut utiliser foreach() (ça appel fetch()), mais l'itérateur n'est pas visible depuis PHP, pour personnaliser le comportement, faut l'encapsuler dans IteratorIterator, comme tu l'as fait. NoRewind ne fonctionne pas ? |
|
00
|
|
|
#3 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 897 ![]() |
Cette implémentation ne fonctionne pas correctement:
Code :
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
||
|
00
|
|
|
#4 |
![]() ![]() Julien PauliArchitecte de système d'information Inscription : mai 2006 Messages : 603 ![]() |
Code :
parent::__construct($this->_statement = $statement); |
|
00
|
|
|
#5 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 897 ![]() |
Non car le constructeur de NoRewindIterator attends un Iterator. La solution consiste à wrapper le PDOStatement dans un IteratorIterator avant de le wrapper à son tour par un NoRewindIterator, mais pour une raison qui m'échappe, ça ne fonctionne pas dans le contexte du constructeur... L'objet construit ne se traverse plus.
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
|
00
|
|
|
#6 |
![]() ![]() Julien PauliArchitecte de système d'information Inscription : mai 2006 Messages : 603 ![]() |
NoRewindIterator extends IteratorIterator
|
|
00
|
|
|
#7 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 897 ![]() |
La signature de leurs constructeurs est différentes. Essaie tu verras.
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
|
00
|
|
|
#8 |
![]() ![]() Julien PauliArchitecte de système d'information Inscription : mai 2006 Messages : 603 ![]() |
Ahh oui les vilains,ils ont typés sur Iterator et non pas Traversable.
Pas bien ça Du coup je sais pas, j'ai pas testé le IteratorIterator , mais ça devrait fonctionner. Bug possible ? |
|
00
|
|
|
#9 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 897 ![]() |
J'ai testé à la main avec ça:
Code :
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
||
|
00
|
|
|
#10 |
![]() ![]() Julien PauliArchitecte de système d'information Inscription : mai 2006 Messages : 603 ![]() |
C'est plutot louche
|
|
00
|
|
|
#11 |
![]() ![]() Inscription : septembre 2010 Messages : 7 958 ![]() |
malheureusement on ne pas pas utiliser ce genre de classe direct dans PDO::ATTR_STATEMENT_CLASS sans passer par un pont
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#12 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 897 ![]() |
Non en effet, à moins de réécrire un iterateur en partant de Iterator.
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
|
00
|
|
|
#13 |
![]() ![]() Julien PauliArchitecte de système d'information Inscription : mai 2006 Messages : 603 ![]() |
Yes, il type sur PDOStatement. C'est une limite interne
|
|
00
|
|
|
#14 | |||
![]() ![]() Julien PauliArchitecte de système d'information Inscription : mai 2006 Messages : 603 ![]() |
Citation:
Code :
|
|||
|
00
|
|
|
#15 | ||
![]() ![]() Inscription : septembre 2010 Messages : 7 958 ![]() |
Ça perd de beaucoup de son intérêt la, je vois pas comment tu peux implémenter Iterator puisque c'est pas possible de le faire :
Code :
__________________
http://blog.stealth35.com/ |
||
|
|
00
|
|
|
#16 |
![]() ![]() Julien PauliArchitecte de système d'information Inscription : mai 2006 Messages : 603 ![]() |
Yes, c'est parcequ'il implémente Traversable en interne et ne peut pas implémenter Iterator.
Bloqué !
|
|
00
|
|
|
#17 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 897 ![]() |
On revient donc sur notre wrapper de départ... Aucune piste en ce qui concerne le NoRewindIterator.
Pour rappel les tests de wrap d'un PDOStatement dans un IteratorIterator ne posent aucun problème, or lorsqu'on met cet IteratorIterator dans un NoRewindIterator, plus rien ne marche... Voici un exemple: Code :
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
||
|
00
|
|
|
#18 |
![]() ![]() Julien PauliArchitecte de système d'information Inscription : mai 2006 Messages : 603 ![]() |
Faut regarder si ya pas un rapport de bug à ce sujet.
A tout hasard, tester avec un NoRewindIterator(IteratorIterator) sur autre chose que PDOStatement, pour prouver que le bug supposé vient bien de PDOStatement (pas sûr)
|
|
00
|
|
|
#19 | ||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 3 897 ![]() |
Chose étrange, il semble que NoRewindIterator nécéssite un iterateur rembobiné pour fonctionner correctement... Je vais voir la doc à ce sujet.
Voici un exemple: Code :
Code :
__________________
On vous a menti PHP, Injection de dépendances et composants La POO en PHP en 10 minutes pour moins Suivez-moi sur GitHub et TwitterN'oubliez pas de vous servir des bouttons , et
|
||||
|
00
|
|
|
#20 |
![]() ![]() Julien PauliArchitecte de système d'information Inscription : mai 2006 Messages : 603 ![]() |
Idem sur le Caching ; ça , c'est un bug ! (déja vu, relevé, mais pas corrigé il me semble)
|
|
00
|
Copyright © 2000-2013 - www.developpez.com