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 :

[POO] Créer une collection en php


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut [POO] Créer une collection en php
    Bonjour,
    J'ai beau chercher dans les forums, je n'arrive pas à avoir une réponse nette : est-il possible oui ou non de créer un objet collection en php ?

    Un truc du genre :

    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
    19
    20
    21
     class UnObjet {
        var $id;
        var $attribut;
     
        function UnObjet() {
            $this->id = integer;
            $this->attribut = "something";
        }
    }
     
    class LesObjets {
        var $Objets;
     
        function LesObjets() {
            $this->Objets = array();
        }
     
        function Ajouter($UnObjet) {
            $this->Objets[$UnObjet->id] = $UnObjet;
        }
    }
    Ce qui ne marche pas (enfin pas idéalement) puisque j'obtiens un hash (l'objet LesObjets) qui contient lui même un hash (composé des objets et de leurs id). Pas génial pour les itérations...

    Connaissez-vous un moyen de faire mieux ?

    Merci,

    JM

  2. #2
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 192
    Par défaut
    Salut,

    Plutôt que d'utiliser l'id de l'objet comme identifiant du tableau d'objets, pourquoi ne pas utiliser la fonction array_push() pour rajouter des objets au tableau, ça éviterait d'avoir les id d'objets en double, et permettrait de parcourir le tableau avec un for()...

    Ceci n'ayant aucune notion de ce qu'est véritablement une collection, ce n'est pas forcément ce que tu cherches...

    a+

  3. #3
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Bonjour jml94,

    J'ai déjà implémenté des collections et j'ai pris la même structure que toi.

    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
    class Collection {
       function Collection() {
          $this->_objets = array();
       }
       function add(&$o) {
          $this->_objets[] =& $o;
       }
       function getAll() {
          return $this->_objects;
       }
    }
     
    $c =& new Collection();
    $t = $c->getAll();
    foreach($t as $o) {
       //...
    }
    Par contre je te suggere de passer à PHP5 et faire en sorte que ta classe Collection implémente l'interface ArrayAccess.
    Ainsi le parcours est transparent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $c = new Collection();
    foreach($c as $o) {
       //...
    }

  4. #4
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 192
    Par défaut
    Salut,

    Je débute et ne connais pas la signifiaction du "&" dans ta collection, sert-il à faire appel à une référence à l'objet (ou à la notion de pointeur, je ne m'y connais pas assez pour voir la différence entre référence et pointeur) ?

    Merci,

    a+

  5. #5
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Oui c'est nécessaire pour travailler avec des objets en php4 (#@!% références !)
    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
    19
    20
    21
    22
    23
    24
    25
    26
     
    <?php
    class A {
       var $id;
       function A() {
          $this->id = 0;
       }
    }
     
    function modifie_par_valeur($objet) {
       $objet->id++;
    }
     
    function modifie_par_reference(&$objet) {
       $objet->id++;
    }
     
    $o =& new A();
     
    modifie_par_valeur($o);
    var_dump($o->id === 0);
     
    modifie_par_reference($o);
    var_dump($o->id === 1);
     
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bool(true)
    bool(true)
    En php5 il n'y a pas besoin car tout est passé par référence par défaut.

  6. #6
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 192
    Par défaut
    ok merci pour la précision

    a+

  7. #7
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par Mr N.
    Oui c'est nécessaire pour travailler avec des objets en php4 (#@!% références !)
    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
    19
    20
    21
    22
    23
    24
    25
    26
     
    <?php
    class A {
       var $id;
       function A() {
          $this->id = 0;
       }
    }
     
    function modifie_par_valeur($objet) {
       $objet->id++;
    }
     
    function modifie_par_reference(&$objet) {
       $objet->id++;
    }
     
    $o =& new A();
     
    modifie_par_valeur($o);
    var_dump($o->id === 0);
     
    modifie_par_reference($o);
    var_dump($o->id === 1);
     
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bool(true)
    bool(true)
    En php5 il n'y a pas besoin car tout est passé par référence par défaut.
    Et si tu fais une instantiation par valeur : $o = new A();
    cela ne change-t-il pas la suite ?

  8. #8
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par Mr N.
    Bonjour jml94,

    J'ai déjà implémenté des collections et j'ai pris la même structure que toi.

    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
    class Collection {
       function Collection() {
          $this->_objets = array();
       }
       function add(&$o) {
          $this->_objets[] =& $o;
       }
       function getAll() {
          return $this->_objects;
       }
    }
     
    $c =& new Collection();
    $t = $c->getAll();
    foreach($t as $o) {
       //...
    }
    Par contre je te suggere de passer à PHP5 et faire en sorte que ta classe Collection implémente l'interface ArrayAccess.
    Ainsi le parcours est transparent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $c = new Collection();
    foreach($c as $o) {
       //...
    }

    PARFAIT ! Pourquoi n'y avais-je pas pensé !
    C'est ta fonction getall qui fournit la collection. Grand merci à toi !

    Pour ce qui est du php5, je pratique aussi, mais j'avais le problème pour le site d'un pote sur 1and1.fr . Ils prétendent offrir du php5, mais visiblement son hébergement est resté coincé en version 4..

    Pour le passage par référence, c'est obligatoire? En 5, je sais que c'est automatique. Ce n'est pas pareil en php 4 ?

    ---edit---

    Je viens de voir ta réponse plus haut. Autant pour moi.
    Je voulais te remercier trop vite...

  9. #9
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418

  10. #10
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Merci, tu es précieux !

  11. #11
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par novices
    Salut,

    Plutôt que d'utiliser l'id de l'objet comme identifiant du tableau d'objets, pourquoi ne pas utiliser la fonction array_push() pour rajouter des objets au tableau, ça éviterait d'avoir les id d'objets en double, et permettrait de parcourir le tableau avec un for()...

    Ceci n'ayant aucune notion de ce qu'est véritablement une collection, ce n'est pas forcément ce que tu cherches...

    a+
    Parce qu'en fait, l'id peut-être autre chose que du numérique.
    Ainsi, j'ai un hash au lieu d'un tableau et je peux accéder directement par clés.
    De toute façon, je ne peux pas avoir de clé en double, c'est le principe du hash non ?

    Et enfin, soyons tatillons et parlons perfs. Vu sur le net : Si vous utilisez la fonction array_push pour ajouter un élément à un tableau, il est mieux de la remplacer par l'opérateur $array[] = qui évite le passage par une fonction.

    tchô,

    JM

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

Discussions similaires

  1. [POO] Collections en php
    Par Ropio dans le forum Langage
    Réponses: 4
    Dernier message: 17/03/2008, 11h26
  2. [POO] Quelle archi pour une webapp PHP objet ?
    Par yann2 dans le forum Langage
    Réponses: 6
    Dernier message: 09/06/2006, 11h10
  3. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 11h58
  4. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20
  5. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49

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