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

Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
- - Dernière réponse : coucou747
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
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

Afficher la suite 
coucou747
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
27 -
ouais
cs_littlewings
Messages postés
33
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
22 octobre 2008
-
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
33
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
22 octobre 2008
-
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
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
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 -
ca marche, ca me laisse le temps d'améliorer un peu tout ca (quelques bugs par ci par la...)
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
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 -
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 -
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
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
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 -
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
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
27 -
"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 -
Pour ma classe SQL si.
Pour ma classe d'interfaçage module/sql non. C'est une classe statique.
coucou747
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
27 -
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 -
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
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
27 -
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 -
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
-
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
450
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
5 mars 2009
-
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 -
ouaip, jvais faire un ptit tuto :)
cs_jean84
Messages postés
450
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
5 mars 2009
-
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 -
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
1 -
"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
-
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 -
Je n'ai pas mis de Zip... simplement parce que j'ai oublié :)