PHP5 - UTILISATION DES ITÉRATEURS ET DE LA RÉFLECTION.
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 2015
-
26 mars 2007 à 18:39
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 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.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 22 oct. 2008 à 10:40
ouais
cs_littlewings
Messages postés32Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention22 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és32Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention22 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és1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 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és2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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és10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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és2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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és2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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és10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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és2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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és12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 30 mars 2007 à 18:15
"classe statique"=> ce qu'on appelle namespace en cpp :) c'est plus vraiment de l'objet
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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és12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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és2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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 :
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és12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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és2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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és193Date d'inscriptionmercredi 24 août 2005StatutMembreDerniè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és449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009 28 mars 2007 à 20:25
Cool tiens moi au courant ;-)
@+
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 28 mars 2007 à 14:26
ouaip, jvais faire un ptit tuto :)
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDerniè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és2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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és591Date d'inscriptionmercredi 20 juillet 2005StatutMembreDernière intervention16 juillet 20092 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és40Date d'inscriptionjeudi 23 janvier 2003StatutMembreDernière intervention13 août 2008 27 mars 2007 à 11:22
On dit homogénéité ...
;-)
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 26 mars 2007 à 18:39
Je n'ai pas mis de Zip... simplement parce que j'ai oublié :)
22 oct. 2008 à 10:40
22 oct. 2008 à 10:28
21 nov. 2007 à 10:08
22 mai 2007 à 12:58
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)
5 avril 2007 à 16:48
5 avril 2007 à 09:09
3 avril 2007 à 23:07
1 avril 2007 à 18:47
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
31 mars 2007 à 10:32
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 ;-)
30 mars 2007 à 19:28
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) ^^ :)
30 mars 2007 à 18:15
30 mars 2007 à 18:09
Pour ma classe d'interfaçage module/sql non. C'est une classe statique.
30 mars 2007 à 13:38
# 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__];
# }
30 mars 2007 à 12:25
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 :)
30 mars 2007 à 07:29
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 :)
29 mars 2007 à 20:44
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.
29 mars 2007 à 20:33
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 :-)
28 mars 2007 à 20:25
@+
28 mars 2007 à 14:26
28 mars 2007 à 00:23
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
27 mars 2007 à 18:31
Jvais voir ce que je peux faire (et rajouter quelques trucs au passage)
27 mars 2007 à 14:20
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
27 mars 2007 à 11:22
;-)
26 mars 2007 à 18:39