PHP5 - UTILISATION DES ITÉRATEURS ET DE LA RÉFLECTION.

FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 - 26 mars 2007 à 18:39
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 22 oct. 2008 à 10:40
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41959-php5-utilisation-des-iterateurs-et-de-la-reflection

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
22 oct. 2008 à 10:40
ouais
cs_littlewings Messages postés 32 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 22 octobre 2008
22 oct. 2008 à 10:28
Je passe rarement par ici en ce moment, mais je suis fan de tes sources mister FhX, et celle-ci est particulièrement bien foutue. Beau boulot.
cs_littlewings Messages postés 32 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 22 octobre 2008
21 nov. 2007 à 10:08
Pareil, moi aussi je suis un tes fans FhX et je ne cracherais pas sur des petits tutos là-dessus, de toi ou des des trucs simples que t'as pu lire !
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
22 mai 2007 à 12:58
FhX, aurait-tu l'amabilite de proposer des liens qui explique comment marche tout ca ??? :)
J'essaye d'apprendre les iterateurs, l'usinage et tout le tintouin, mais a voir ta source j'ai un peu de mal a suivre quand meme !!
Ou est-ce que tu apprends tout ca ? C'est de l'autodidatie ou tu vois ca a ton boulot/cours ? je suis vraiment preneur de tout document pour expliquer clairement le fonctionnement, la relation entre les differentes classes, etc. Je pense avoir compris comment marche l'abstraction, mais pas encore les interfaces, la factory, etc. Ca me ferait grandement plaisir que tu m'indique la voie a suivre. (Je ne te demande pas de faire un tuto, juste des liens, si tu en a)

Merci beaucoup !

(desole pour le manque d'accent, je suis sur un clavier qwerty)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
5 avril 2007 à 16:48
ca marche, ca me laisse le temps d'améliorer un peu tout ca (quelques bugs par ci par la...)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
5 avril 2007 à 09:09
Ok, je te ferai un petit topo, mais faudra que tu attendes un peu : ma carte mère a grillé :-( et j'ai pas le temps de faire ça au taf.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
3 avril 2007 à 23:07
Update, les classes font encore un peu plus d'abstraction (j'ai corrigé quelques bugs avec ma classe d'itération au passage ^^)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
1 avril 2007 à 18:47
Merci Mala :)

Par contre, est ce que tu pourrais m'aider pour la partie XML ?
Genre par exemple, j'ai un fichier XML type :

<news id="1">
<title>Mon titre</title>
<content>Contenu de la news</content>
<date>110110192348</date
</news>
<news id="2">
//etc...
</news>


et que je puisse récupérer une news, et pourquoi pas faire comme un fetch() pour SQL (si j'appèle la fonction de fetch(), ca me renvoit la news suivante jusqu'à ce que j'en ai plus).
Parce que... XQuery :s j'ai pas encore eu le temps d'expérimenter ca correctement.

Si t'as le temps bien sur, au moins si tu pouvais me donner une piste à suivre, je pourrais ré-utiliser par la suite pour tous les modules :)

Mici :D
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mars 2007 à 10:32
Hello,

je passe peu ici en ce moment, ou vraiment en coup de vent, je manque vraiment de temps.
Mais ça, c'est une très jolie classe FhX :-) Fallait que je le dise!
Pour répondre en partie à Guill76 et rassurer FhX, la réflexion est utilisée par les développeurs de PHP dans les classes SPL par exemple. Typiquement du design pattern. Faisons leur confiance :-) La réflexion est un très bel outil, très utile, au même titre que la SPL d'ailleurs. On perd peut-être un peu en performance (et encore, il faudrait tester), mais on gagne en simplicité, en lisibilité, en réutilisabilité, en modularité et en plei dautres trucs en "ité" ;-)
C'est le PHP nouveau ;-)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 mars 2007 à 19:28
Non mais c'est bien pratique :)
Certaines méthodes ne sont pas spécifique à une instance de classe... mais bien à la classe elle-même !

Voila pourquoi je l'utilise ^^
L'objet ne se limite pas à une classe et à son/ses instances(s) ^^ :)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 mars 2007 à 18:15
"classe statique"=> ce qu'on appelle namespace en cpp :) c'est plus vraiment de l'objet
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 mars 2007 à 18:09
Pour ma classe SQL si.
Pour ma classe d'interfaçage module/sql non. C'est une classe statique.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 mars 2007 à 13:38
t'as pas de singleton pour sql ?
# public function GetSingle($id) {
# if ( !isset(self::$Iterates[__METHOD__]) ) {
# self::$Iterates[__METHOD__] = new AdvancedNews( self::$InterfaceClass->getMethod('GetNews')->invoke(NULL, $id) );
# }
# return self::$Iterates[__METHOD__];
# }
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 mars 2007 à 12:25
Disons que j'ai fais la base d'un design pattern avec ce bout de code.
Mais pour que ce soit un vrai design pattern, il me faudrait une abstraction encore plus haute pour gérer les modules (les factorys).

Par exemple, une classe 'System' qui va vérifier dans un fichier xml si le module peut être instancié ou non, renvoyer son instance etc... Un ptit exemple :

<?php
System::Init();
try {
$SQLNewsFactory = System::GetModule('NewsFactory', 'InterfaceSQL');
$XMLNewsFactory = System::GetModule('NewsFactory', 'InterfaceXML');

foreach ( $SQLNewsFactory->GetRange(0,10) as $key=>$news ) {
$XMLNewsFactory->Add($news);
}

System::Shutdown();

} catch ( ModuleException $e ) {
echo $e->getMessage();
}
?>

Voila par exemple comment écrire simplement des news provenant d'une base de donnée vers un fichier XML.
La classe System permet de récupérer les instances de modules (après leurs vérifications d'existances), et ensuite on fait mumuse avec.
Au mieux, on garde l'instance dans la classe System et qu'on utilise ensuite dans toute la page. La technique du Singleton dans les 'factory's que je n'ai pas codé ici. Il faudra utiliser la reflection pour faire un truc pareil... Ouh ca me tente :)

Il suffit après de faire des interfaces pour chaque 'factory' afin de pouvoir s'y retrouver facilement (autrement c'est la galère). Bien que PHP5 a quelques lacunes coté objet encore, ca peut se faire.
(exemple de lacune :
class x {
public function MaMethode( ObjetAttendu $obj );
}
class y extends x {
public function MaMethode( AutreObjectEtendantObjetAttendu $obj );
// Impossible, erreur...
}
class z extends x {
public function MaMethode( UnAutreObjetEtendantObjetAttendu $obj );
// Impossible, erreur...
}

)

Espérons que tout cela sera réparé dans PHP6 (normalement oui...).

Je suis en train de préparer quelques améliorations au passage. Je vais étendre ma factory de news de base pour implanter des méthodes add(), delete(), update() etc... Donc, je dois aussi étendre mon interface SQL pour rajouter ces méthodes. J'ai bientot fini, je posterais (ainsi que le zip ^^) le tout une fois fini :)

Vala ^^
Si tu veux du design pattern, regarde celui de Zend. Il est assez compliqué au début à la lecture, mais intéressant.
En tout cas, le système que je présente plus haut est le miens ! Je n'ai copié sur personne :)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 mars 2007 à 07:29
bien bien bien... comme je le disais, j'ai encore des progres a faire en OO
c'est joli comme code, un singleton, une factory :)
si t'as des bons trucs sur les design patterns, des trucs plus concret et qui expliquent vraiment l'interret de la chose, je suis prenneur :)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
29 mars 2007 à 20:44
Le problème, c'est que si je n'utilise pas la reflection, comment je fais pour invoquer mes méthodes et instancier la bonne classe de sortie ?

C'est impossible ( à moins d'utiliser un eval() ce qui est encore plus lent ! ).
Donc il ne reste que la reflection.
Mais jvais essayer d'optimiser encore un peu ca, de toute facon c'est encore incomplet.
guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016
29 mars 2007 à 20:33
Salut,
C'est une source plutôt sympa et complexe .
Mais j'ai une interrogation sur l'intérêt de la reflexion ici.
j'ai l'impression que c'est une perte en performance que d'utiliser la reflexion pour instancier les objets et invoquer leur methodes.
Personnellement je voyais plutot l'utilité de la reflexion dans la creation de documentation pour les classes, dans les outils de tests ou de debug mais pas trop dans le cadre du dev brut d'un projet.
Mais bon c'est un avis, je me plante peut-être: faudrait voir les perf :-)
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
28 mars 2007 à 20:25
Cool tiens moi au courant ;-)

@+
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
28 mars 2007 à 14:26
ouaip, jvais faire un ptit tuto :)
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
28 mars 2007 à 00:23
Super source mais je suis definitivement fache avec les iterateurs. Je n'y comprend vraiment rien.. :-(
Tu n'aurais pas un tuto (genre Les iterateurs pour les gros nulls) ? Parce que je sens bien que c'est super pratique mais je n'arrive pas a saisir l'idee.

Merci
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
27 mars 2007 à 18:31
vi, moi et les zip on est faché :p
Jvais voir ce que je peux faire (et rajouter quelques trucs au passage)
vilhjalms Messages postés 591 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 16 juillet 2009 2
27 mars 2007 à 14:20
"Pfiou, avec un titre aussi compliqué, j'imagine que je ne vais pas avoir beaucoup de gens qui vont lire une source pareil. Remarquez, je vous comprends ^^"

Cela m a plutot attire au dela de votre pseudo :)

Encore une bonne class :) Par contre l absence de zip :( :)

Je ne connaissais pas le principe de reflexion en php merci pour le lien et votre source
cs_gege217 Messages postés 40 Date d'inscription jeudi 23 janvier 2003 Statut Membre Dernière intervention 13 août 2008
27 mars 2007 à 11:22
On dit homogénéité ...
;-)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
26 mars 2007 à 18:39
Je n'ai pas mis de Zip... simplement parce que j'ai oublié :)
Rejoignez-nous