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

  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 : 52
    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 : 52
    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...

  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 : 52
    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

  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 : 52
    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 ?

  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 : 52
    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 !

  12. #12
    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
    Citation Envoyé par jml94
    Et si tu fais une instantiation par valeur : $o = new A();
    cela ne change-t-il pas la suite ?
    Ca ne change pas la suite. Suffit de tester.
    En fait j'ai jamais trop su quoi faire des références lors de l'instantiation d'un objet. Dans mon fort interieur je me dit que crée une instance de A (new) puis fais une copie (=) pour l'affecter à $o alors que se contente de passer une référence vers l'instance créée. Mais là je n'ai pas les ressources suffisantes pour pouvoir trancher cette problematique sans grand intéret pour mes projets, la seule chose qui me pousse à utiliser les références lors d'une instantiation, c'est pour pouvoir prendre l'habitude d'utiliser les references en php4.

  13. #13
    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 : 52
    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
    Bonjour,
    J'avais oublié de poster ma solution, puisque j'en ai trouvé une, au cas où cela intéresserait d'autres personnes.
    J'ai donc effectivement pris le parti d'utiliser php5, dont les classes sont un peu plus avancées. Mon choix s'est porté sur la SPL, comme Mr N me l'avait conseillé, mais j'utilise une autre interface, plus simple et qui suffit largement pour une collection toute bête. (Je vais d'ailleurs lancer un autre post pour un petit problème un peu plus sioux.)

    Voici donc le code des classes :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <?php
    class Nobjet {
    // mon objet de base
     
        public id;
        public attribut;
     
        __construct($id, $attribut='') {
            $this->id         = $id;
            $this->attribut = $attribut;
            return true;
        }
     
        public Methode(...) {
            //les autres méthodes....
        }
    }
     
    class Zobjets implements IteratorAggregate {
    // la collection elle-même, dotée d'un itérateur basique
     
        private m_tab = array();
        public max_id = 0;
     
        __construct($db) {
            /*$db est une référence à un objet mysql dans lequel j'ai implémenté les fonctions d'accès à la base
            C'est un constructeur qui va prendre tous les objets présents dans une base mysql (typiquement des photos) pour en faire une collection */
            $req="SELECT id, att FROM tbl_table ORDER BY id;";
            $result=$db->query($req) or die("Requete foireuse");
            while($c = $db->fetch_assoc($result)) {
                $o = new Nobjet($c['id'], $c['att']);
                $m_tab[$o->id] = $o;
                if ($c['id'] > $this->max_id) $this->max_id = $c['id'];
            }
     
        public function getIterator() {
        //iterateur permettant le foreach
           return new ArrayIterator($this->m_tab);
        }
     
        public function Ajouter($Nobjet) {
            $this->m_tab[$Nobjet->id] = $Nobjet;
        }
     
    }
    ?>
    Et puis son utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
     
    $db = new DB($db_host, $db_username, $db_password, $db_name, $p_connect);
     
    $collection = new Zobjets($db);
     
    foreach($collection as $obj) {
        echo "Quel bô nobjet, Maryse :\n";
        echo "\tIdentifiant = ".$obj->id;
        echo "\tAttribut = ".$obj->attribut;
    }
     
    ?>
    Voilou.
    On peut ensuite implémenter tout ce qu'il faut pour ajouter, supprimer, modifier dans la collection.
    Cette collection peut-être sérialisée et ppassée en variable de session pour un album photos, ce qui permet d'économiser les accès sql, etc...

    Et si vous avez des remarques/conseils/critiques, je suis preneur.

    Tchô

  14. #14
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 17
    Par défaut
    Bonjour,

    J'ai implémenté une classe Collection à partir des exemples de codes si dessus (PHP4).

    Comme j'ai un peu galèré au début je me dis que mon bout de code pourra servir à quelqu'un .

    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
    27
    28
    29
     
    <?
    class Collection {
    	var $objets;
     
    	function Collection() {
    		$this->objets = array();
    	}
    	function Add($o) {
    		$this->objets[count($this->objets)] =$o;
    	}
    	function Get($i) {
    		return $this->objets[$i];
    	}
     
    	//Il faut définir la méthode ICompare de l'objet pour utiliser cette méthode
    	function Contains($input){
    		for($i=0;$i<count($this->objets);$i++){
    			if($this->objets[$i]->ICompare($input))
    				return true;
    		}
    		return false;
    	}
     
    	function Length() {
    		return count($this->objets);
    	}
    }
    ?>
    Et l'utilisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $c = new Collection();
    $objet = new Objet();
    $c->Add($objet);
    for($i=0;$i<$c->length();$i++){
    	$Objet = $c->get($i);
    	//.....
    }
    Dans l'espoir que ça serve à quelqu'un :p.

  15. #15
    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
    Je pense que tu peux t'abstenir du nbCase(s)
    http://php.net/count

  16. #16
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 17
    Par défaut
    Merci pour l'info, j'en profite pour éditer mon précédent post.

+ 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