IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Php et les collections [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 17
    Points : 18
    Points
    18
    Par défaut Php et les collections
    Bonsoir à tous.

    Voilà cela fait quelques années maintenant que je m'attarde sur le php, et depuis quelques mois je m'intéresse de près à sa POO. Théoriquement parlant j'ai, par le biais de mes professeurs, bien assimilé le concept de POO. Je fais également du C# et je commence à m'intéresser à Java. Voilà pour la petite histoire, non pas pour m'étaler sur mes (maigres) compétences, mais pour que vous puissiez situer à peu près mon niveau.

    Mon problème est en réalité une succession d'interrogations. À chaque nouveau projet j'essaie de revoir et de corriger ce qui ne va pas dans ma façon de coder. Ici, vous l'aurez compris, cela concerne les collections.

    Imaginons par exemple une classe "Personnes", et une classe "Groupe", censée être une collection de Personnes. J'ai lu pas mal de documentations à ce sujet, et même si elles sont en général bien détaillées, elles occultent des faits qui semblent être des évidences pour le lecteur type, mais pas pour moi...
    Tout d'abord, quelle structure utiliser ?

    J'utilisais des arrays jusqu'à maintenant, mais aujourd'hui je ne sais plus s'il vaut mieux garder cette structure, ou bien utiliser des SplObjectStorage, ou encore des ArrayObject.
    Tout cela sachant que j'aimerais disposer d'une méthode qui me permettrait de retourner un objet (ou l'indice de l'objet) dont je connais seulement la valeur d'un seul attribut (Valeur unique pour chaque objet, bien entendu). Jusqu'à présent j'effectuais ce traitement avec une boucle while vérifiant chaque objet du tableau. Mais avec le recul, je n'ai VRAIMENT pas l'impression que ce soit la meilleure solution. Il doit certainement y avoir plus propre et plus performant...

    De plus, j'ai lu énormément de choses concernant les itérateurs, que ce soit en Php comme en .net.
    Je pense avoir plus ou moins appréhendé le système, mais j'ai du mal à voir l'intéret (Je suppose qu'il y en a un, je dois juste être à côté de la plaque). Avoir la main sur le comportement du Foreach, je comprends bien, mais j'ai énormément de mal à voir l'intérêt sans un exemple concret...

    Voilà, connaître les réponses à ces questions m'aiderait beaucoup à y voir plus clair... Je vous remercie sincèrement d'avoir lu mon post, ainsi que de l'aide que vous pourrez éventuellement m'apporter, pour les plus altruistes.

    Bonne soirée à tous.

  2. #2
    mon_nom_est_personne
    Invité(e)
    Par défaut
    alors pour les collecteurs encore une fois, avec php y'a pas une solution mais plein
    Mais je pense qu'etendre ton objet avec ArrayObject est une tres bonne idee.

    Pour revenir sur les iterateur et notement l'interet d'un foreach sur une boucle normal et de :
    - etre sur de traiter totalement un tableur,
    - de pourvoir traiter un tableau qui utilise des chaines de caracteres comme index et pas des chiffres; un for($i=0, $i < $table_length;$i++) quand ton tableau c'est array('maison' => 'chateau', 'patate' => 'papi mougeot') c'est pas evident et pire quand c'est un object
    - Eviter les boucles infinies
    - securite, les elements que tu traite dans le foreach sont des copies pas des instances donc sa evite de reecrire l'element du tableau par accident

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Tout d'abord merci beaucoup pour ta réponse. Je vais essayer de mettre des ArrayObject en pratique.

    J'ai bien compris la différence entre un for et un foreach, ce que j'ai du mal à comprendre c'est quel intérêt d'implémenter une interface iterator alors que le foreach gère ça tout seul ?

    Après réflexion le seul bon point que j'y vois serait de paramétrer la méthode de validation pour s'en servir comme d'un système de recherche, mais je ne suis pas sûr que ce soit son utilité... J'ai assez de mal à saisir la place d'un itérateur dans une classe quand on dispose du foreach.

    En tout cas merci encore de ta réponse mon_nom_est_personne, ça m'avance déjà beaucoup !

  4. #4
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Si tu utilises des tableaux classiques uniquement, l'interface Iterator n'est pas indispensable en effet. Là où cela devient intéressant c'est lorsque tu as à manipuler des conteneurs divers. Iterator te permet alors deux choses :
    - tu peux parcourir ta structure sans avoir besoin de connaître exactement l'implémentation de cette structure. Il suffit qu'elle soit un tableau classique ou qu'elle implémente l'interface Traversable.
    - tu peux créer tes propres classes d'itérateurs pour simplifier les traitements faits lors du parcours des conteneurs. C'est un peu comme array_walk() ou array_map() en plus souple.

    Exemple simple : tu as une série de valeurs dont tu dois éliminer tout ce qui n'est pas un caractère alphanumérique. Peut-être qu'en plus, du fait de tes traitements, ces valeurs peuvent venir de divers endroits : un ArrayObject quelconque, ou $_POST comme résultat d'une saisie de formulaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class MyIt extends ArrayIterator {
       public function current() {
          $val = parent::current();
          return preg_replace("/\W/", "", $val);
       }
    }
     
    //$_POST = array("nom" => "brun 33'a!", "prenom" => "christoph$*e56");
    $myIt = new MyIt($_POST);
    foreach($myIt as $key => $val) {
        echo $key, "-", $val, "<br/>";
    }
     
    //$arr = ArrayObject() contenant le même type de valeurs
    $myIt = new MyIt($arr);
    foreach($myIt as $key => $val) {
        echo $key, "-", $val, "<br/>";
    }
    Comme tu peux le voir, le parcours de la structure est homogène dans tous les cas. De même, les traitements le sont aussi. C'est simple, modulable, réutilisable.

    En outre, il ne faut pas oublier que la SPL livre plusieurs conteneurs ayant chacun ses spécifications (tableaux, queues, etc), et plusieurs types d'itérateurs : ArrayIterator, RegexIterator, RecursiveArrayIterator, etc. Comme boite à outils, cela laisse le choix des stratégies.

    Un exemple intéressant de mise en pratique de la SPL et des itérateurs pour le traitement des données de formulaire est développé dans le
    numéro de septembre de PHP Architect. Ca peut être une bonne source d'inspiration.

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Effectivement dans ce genre de cas l'emploi d'un itérateur prend tout son sens.
    Je vais essayer de me procurer ce numéro de Php Architect qui a l'air vraiment intéressant.

    Merci beaucoup pour votre aide, j'y vois déjà beaucoup plus clair.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Calendrier] Multi-utilisateurs en php avec les ACL
    Par moabomotal dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 06/12/2005, 17h51
  2. C++ - les collections
    Par Spir dans le forum C++
    Réponses: 14
    Dernier message: 18/06/2005, 20h09
  3. [VB.NET] Utiliser les collections de contrôles (Textbox)
    Par dinbougre dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/01/2005, 18h57
  4. [ODBC] Intranet en PHP : Lister les tables d'une base Access
    Par fblouet dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/10/2003, 14h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo