GESTION DE FICHIERS AVEC LA SPL

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 17 mars 2009 à 12:02
astro53 Messages postés 48 Date d'inscription jeudi 18 octobre 2007 Statut Membre Dernière intervention 5 août 2009 - 23 mars 2009 à 07:38
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/49517-gestion-de-fichiers-avec-la-spl

astro53 Messages postés 48 Date d'inscription jeudi 18 octobre 2007 Statut Membre Dernière intervention 5 août 2009
23 mars 2009 à 07:38
Salut, heureusement que j ai plus de 20 minutes pour regarder ce site sinon je n aurais pas eu le temps de tout lire...
Moi j ai fais un bon en php il y a tout juste 1 mois peut etre moins en apprenant l'existence de la POO... Je ne savais rien encore la dessus auparavant. Et j ai lu beaucoup de tutoriaux sur le sujet. Et je n avais pas encore compris que les iterators pouvais servir a une arborescence et je vais de ce pas visiter ce lien sur la SPL...Merci a vous pour vos codes et commentaires judicieux. Je n ai pas encore ecris de source en PHP (seulement en Javascript). J'espere reussir un jour a ecrire de belles sources comme celle-ci.

PS:Je m excuse pour toutes les fautes d ortographe que je peux faire...
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
18 mars 2009 à 17:36
@Malalam : Ca va, et toi ? C'est pas facile de communiquer avec toi ;) Dernière fois que j'ai essayé de t'appeler, j'ai pas réussi (et pourtant j'avais une bonne excuse, c'était ton anniv...)

@Codefalse : Pour ce qui est de l'ancienneté de la SPL, tu te trompes un peu... Elle est compilée par défaut depuis PHP5.0. Depuis PHP5.3, elle ne peut pas être désinstallée. Et avant PHP5? la SPL était disponible comme extension PECL : http://pecl.php.net/package/SPL

Voilà, c'est tout ce que j'ai à rajouter pour le moment :).

Ah non, dernière chose... Ca fait vraiment plaisir de savoir que certaines personnes lisent quand même nos commentaires, nos longues discussions et interminables débats à l'occasion de sources de qualité variables, et en tirent des enseignements positifs... Ca conforte dans l'idée que les longues discussion parfois hors-sujet ne sont jamais vaines :)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
18 mars 2009 à 15:05
Que dire ! Pas mal de choses ont déjà été mentionnée.
Je voulais ajouter un malus parce que mon pseudo était pas mentionné, mais tu te rattrape dans ton dernier message ... mais j'hésite quand même ... bon ok je blague :p

Pour ce qui est du MVC, je rejoint Neige et Malalam. Tu parle ensuite qu'en général, tu boucle sur un array.
J'aimerai juste mentionner que je commence à voir les tableaux comme de la peste. Surtout sur une structure ou tu ne peux pas gérer la taille du tableau.
Si le dossier contient 5 fichiers, ca va pas être méchant. En revanche, si ton dossier en possède des milliers/millions, tu risque d'avoir des problèmes de mémoire.

La spl te fournit une itération à la volée, pourquoi ne pas en profiter ?
Pourquoi parcourir (boucler) le dossier pour mettre le contenu dans un tableau, et ensuite re-boucler sur ce tableau pour afficher le contenu ?

Si, en tant que moteur de template, tu utilise php (ce que je fait, car à l'origine, php à été réalisé pour faire office de moteur de template, ndlr), tu peux passer un objet qui implémente iterator et qui parcours le dossier.

Par exemple tu peux instancier tout ton système est passer ton objet à ton moteur de template. Ou si tu veux rajouter des restrictions, tu peux faire une classe spécifique pour ton moteur de template, et passer un objet iterator (__construct (iterator $oTonObjet)) afin que quand tu boucle sur la classe spécifique, celle ci bouclera sur l'objet donné dans le constructeur.
Ca à l'avantage d'être générique (itérateur pour un dossier, pour un contenu de fichier (par lignes), contenu d'une base de donnée, etc, etc, etc).

En tout cas très bon travail. L'intérêt que tu montre à la SPL montre tout simplement que tu te tiens à jour (la SPL n'est là que depuis PHP 5.2), et que tu ne nous ponds pas des classes en php 4 :p
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
17 mars 2009 à 21:32
Salut les boss ! Je vois que ça réagit, ça fait plaisir. Bon, si ça peut vous faire désenfler, j'aurais pû ajouter à la liste des gourous Coucou747 ou Codefalse par exemple mais je vais m'arrêter là sous peine de faire des jaloux ! ;) Je ne sais pas si le terme de gourou vous convient mais en ce qui me concerne, je suis autodidacte, formé par vos soins sur ce site, à l'insu de votre plain gré. Vos interventions toujours bien avisées transforment les classes basiques en de véritables mines d'informations (sur ce qu'il ne faut pas faire en général, ou sur comment mieux faire)
Pour mon pseudo, désolé mais Malalam était déjà pris ... j'ai fait avec ce qu'il restait ! ;-)

Bon, pour en revenir à la source, je vois que vous avez un peu de mal tous les 2 avec la partie arborescence en HTML. C'est vrai que côté MVC, l'idéal serait de sortir cette fonction ; en tout cas, comme ça, ça a le mérite de ne pas avoir à passer par x classes externes pour sortir l'info qui peut être gérée ici. Je dois bien dire que 'dans la vraie vie', j'utilise une classe pour gérer les arborescences graphiques. Je lui transmets un Array organisé spécialement pour ça et il en ressort une arbo HTML. Mais tout ça est un petit peu lourd à placer ici (et j'ai pas non plus envie d'y mettre toutes mes sources ;-) Avec ce que je propose ici, c'est déjà presque un micro moteur de template puisque je génère des variables qui vont pouvoir être insérées dans les <li> (qu'on peut d'ailleurs remplacer par des
, , ...)
Par contre, ta proposition de gérer ça avec la SPL m'intéresse. Il faudrait que je regarde ça de plus prêt. En fait j'utilise pas mal de classes perso dont je me rend compte qu'elles sont déjà développées par la SPL. J'ai notamment développé une class que j'ai appellée 'gestion des hierarchies' et qui ne fait rien d'autre que ce que font les classes Iterator (sauf qu'Iterator est plus complet !)

Bon, ma function actuelle de création de l'arborescence peut paraître un peu compliquée parceque j'essaie de gérer tous les cas. Genre on ouvre un pour un dossier et il faut ensuite le refermer avec un quand on a fini de lister le dossier puis fermer la ligne <li> qui contenait ce dossier avec </li>. Seulement, il ce peut qu'on ferme plusieurs dossiers à la suite. On va donc se retrouver avec une suite de </li></li></li>. Et c'est ça qui prend quelques lignes dans la fonction.
Le problème vient peut-être du fait que, merci la SPL, l'arborescence qui nous est livrée est ordonnée de façon parfaitement linéaire pour ce qu'on veut en faire. Les fichiers et les dossiers ne sont pas mêlangés, il suffit de parcourir l'objet avec un foreach et de suivre tout naturellement l'ordre donné. J'ai donc utilisé cette facilité mais peut-être faudrait-il prendre en compte un fonctionnement moins linéaire ? Mais dans ce cas, je ne vois pas vraiment comment faire ... ?!

Bon, j'arrête pour ce soir, il y a déjà de quoi lire ;) Merci pour vos commentaires, je vais voir ce que je peux en faire !
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 mars 2009 à 20:04
Ah, juste: concernant ta méthode arborescence et la sortie...c'est bien, là-dessus que j'appuie : ta méthode est compliquée, à priori, parce que tu veux reproduire l'arbo dans une liste HTML. Avec une classe de sortie dédiée ET SPLisée, je pense que tu peux obtenir un truc beaucoup plus puissant, plus souple, ET alléger du même coup ta méthode arborescence (au détriment d'une nouvelle classe plus complexe hein...mais aussi plus puissante).
Vlà.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 mars 2009 à 20:01
Hello,

à moi, donc...

Le premier bon point, c'est que tu me considères comme un grand gourou...(ouais je sais???guère original).
Le premier mauvais point, c'est que tu me places au même niveau que Neige, alors que, franchement, je suis quand même très nettement meilleur...tss...;-)

Après les plaisanteries d'usage initiées par Neige, quelques éléments. je n'ai pas non plus beaucoup de temps, mais moi c'est parce que demain je me lève à 4h, et que je suis déjà fatigué d'avance rien que d'y penser. Tout ça pour un déplacement pro. Pff.

C'est pas mal! Donc. J'ai du mal à analyser ta méthode arborescence qui à première vue me semble un peu compliquée pour un truc qui construit une arbo à partir d'un itérateur récursif. Mais je n'ai pas le temps d'approfondir, donc...je m'abstiens d'en dire plus. En fait un peu plus quand même :-)...il aurait été intéressant, comme le souligne Neige, de permettre une sortie différente. Et comme tu sors une arbo de toute manière, tu aurais encore pu faire une classe de templating léger basée sur la SPL :-) Ou si tu veux te mettre à autre chose, à du XML et des XSL, très sympa aussi.
Tu utilises RegexIterator, ce qui est très bien! Mais, pour faire encore mieux, tu aurais pu le coupler avec un FilterIterator, puisque tu fais des filtres. Ca aurait donc fait une 3ème classe.

Sinon, franchement...c'est propre, c'est clair, c'est commenté, et moi j'aime bien ta norme de nommage des méthodes, propriétés etc. Fut-ce du français :-) Non, c'est très bien le français...sûr, quand on bosse à l'international ou qu'on veut partager à l'international un code, l'anglais c'est mieux; mais je ne crois pas que ce soit ton cas.
L'anglais a aussi l'avantage de, bien souvent, réduire le nombre de caractères à taper pour obtenir des noms explicites, c'est surtout pour ça que j'aime bien l'utiliser même dans des projets cantonnés à mon taf, pour mon taf, visibles uniquement par mes développeurs (français...marocains aussi mais bon...ils sont meilleurs en français qu'en anglais globalement!).

Bon taf, Alphanono (ah oui, mauvais point : c'est QUOI ce pseudo???? :-p)

Sinon, ça va, Olivier ? :-)
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
17 mars 2009 à 12:02
Salut,

Bon alors le premier bon point, c'est que tu me considère comme un grand gourou... Je sais pas si c'est objectivement vrai, mais ça fait plaisir d'être flatté de la sorte... Avant même de regarder la source, tu pars avec un bonus ^^

Bon plus sérieusement... J'ai pas la possibilité, là, de regarder bien en détails (un eeePC c'est pratique, mais c'est petit, et pour développer, y'a mieux...).

Autre bon point, la volonté d'utiliser des itérateurs et la SPL pour lister des fichiers. Ca, vraiment, ça fait chaud au coeur.

Bon mon commentaire va pas apporter grand chose, mais il me permmettra au moins de suivre les futurs commentaires (ouais, égoïstement...) et donc de ne pas oublier de regarder la source en détails quand je serai de retour dans ma campagne (faut pas hésiter à me le rappeler, même, je devrais 'normalement' être rentré ce week end).

Bon alors un petit point négatyif, ce serait bien de mettre les noms des méthodes en anglais (wouah la blague !). Non j'déconne, on s'en tape là (pardon, c'est pas drôle, mais je suis fatigué).

Plus sérieusement à nouveau, j'aime moyennement ce que ta classe produit en sortie. Ca me semble fait proprement, mais j pense qu'on peut faire mieux : séparer la sortie du traitement. Ouais, parce qu'en plus, j'aime bien le design pattern MVC qui consiste (entre autres) à séparer le traitement de l'affichage. Là, tu sors du HTML (ou du XHTML, peu importe). L'idée est que si tu veux afficher ta liste dans un fichier texte, en XML, même avec les quelques propriétés qui permettent de mettre en forme ton texte, ça peut ne pas suffire (mais bon, j'ai qu'un peu survolé, alors je me trompe peut-être...).

Bref... Excellente initiative en tout cas !