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] Collection Php5 incompréhension :'(


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 151
    Par défaut [POO] Collection Php5 incompréhension :'(
    (Re)Bonjour tout le monde

    j'essaye de comprendre l'interface iterateur de php5 ce qui me permettrait d'afficher mes catégories avec une ptite boucle foreach bien propre...
    Pourriez vous m'aider ?
    Je vois pas trop comment m'en servir dans ce cas là ...
    J'ai lu tous les posts de mjl94 concernant les collections etc ... j'en déduis qu'il faut que je fasse une classe collectionCatégorie qui implémente iteratorAgregate (d'après le manuel php;-) )
    Mais je vois pas trop comment mettre ca en place ??

    d'après ce que je comprends il faudrait que je fasse ca :
    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
     
    class CollectionCategories implements IteratorAggregate
    {
      private $items = array();
      private $count = 0;
     
      // Définition requise de l'interface IteratorAggregate
      public function getIterator() {
       return new MyIterator($this->items);
      }
     
      public function add($value) {
       $this->items[$this->count++] = $value;
      }
    }
    mais ensuite ?
    dois je à chaque fois que je fais une nouvelle catégorie faire un CollectionCategorie->add ? Pour pouvoir ensuite faire un foreach dessus ??
    Je trouve ca un peu bizarre, je crois que je fais pas ce qu'il faut ?

  2. #2
    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
    Comment te sers-tu de ta collection dans ton code ?

    Qui fait le foreach ?

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 151
    Par défaut
    en fait j'aimerais sur ma pages "catégories" pouvoir afficher toutes mes catégories simplement en faisant un petit foreach sur les catégories (qui sont rangées dans une BD) et viennent d'une classe comme ca :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    <?php
    class Categorie {
    	private $idCat;
    	private $nomCat;
    	private $description;
     
    	function __construct($dbh){
    		$this->dbh = $dbh;
    		$this->description = '';
    		$this->nomCat = '';
    		$this->idCat = 0;
    	}
     
    	function getId(){
    		return $this->idCat;
    	}
     
    	function getNomCat(){
    		return $this->nomCat;
    	}
     
    	function getDescription(){
    		return $this->description;
    	}
     
    	function selectCategorie($cat){
    		if(is_int($cat))
    			$sql = "Select idCat, nomCat, descprition FROM categories WHERE idCat = $idC";
    		elseif (is_string($cat)){
    			$cat = $this->dbh->quote($cat);
    			$sql = "Select idCat, nomCat, descprition FROM categories WHERE nomCat = $idC";
    		}
    		$sth = $this->dbh->query($sql);
    		$result = $sth->fetchAll();
    		$this->idCat = $idC;
    		$this->nomCat = $result[0]['nomCat'];
    		$this->description = $result[0]['description'];
    	}
     
    	function nbCategories(){
    		$sql = "Select count(*) as nbCat FROM categories";
    		$sth = $this->dbh->query($sql);
    		$result = $sth->fetchAll();
    		return $result[0]['nbCat'];
    	}
     
    	function nvelleCat($nomCat,$description){
    		$this->selectCategorie($description);
    		if($this->idCat==0){
    			$nomCat = $this->dbh->quote($nomCat);
    			$description = $this->dbh->quote($description);
    			$sql = "INSERT into categories (nomCat, description) 
    					VALUES ($nomCat,$description)";
    			$retour = $this->dbh->exec($sql);
    			retourReq($retour);
    		}
    		else echo 'Catégorie déjà existante';
    	}
     
    	function supprCat($idC){
    		$sql = "DELETE FROM categories WHERE idCat=$idC";
    		$retour = $this->dbh->exec($sql);
    		retourReq($retour);
    	}
     
    }
    ?>
    je sais pas si j'ai été clair ?

  4. #4
    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 : 51
    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 AsQuel
    (Re)Bonjour tout le monde

    j'essaye de comprendre l'interface iterateur de php5 ce qui me permettrait d'afficher mes catégories avec une ptite boucle foreach bien propre...
    Pourriez vous m'aider ?
    Je vois pas trop comment m'en servir dans ce cas là ...
    J'ai lu tous les posts de mjl94 concernant les collections etc ... j'en déduis qu'il faut que je fasse une classe collectionCatégorie qui implémente iteratorAgregate (d'après le manuel php;-) )
    Mais je vois pas trop comment mettre ca en place ??

    d'après ce que je comprends il faudrait que je fasse ca :
    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
     
    class CollectionCategories implements IteratorAggregate
    {
      private $items = array();
      private $count = 0;
     
      // Définition requise de l'interface IteratorAggregate
      public function getIterator() {
       return new MyIterator($this->items);
      }
     
      public function add($value) {
       $this->items[$this->count++] = $value;
      }
    }
    mais ensuite ?
    dois je à chaque fois que je fais une nouvelle catégorie faire un CollectionCategorie->add ? Pour pouvoir ensuite faire un foreach dessus ??
    Je trouve ca un peu bizarre, je crois que je fais pas ce qu'il faut ?


    dois je à chaque fois que je fais une nouvelle catégorie faire un CollectionCategorie->add pour pouvoir ensuite faire un foreach dessus ?
    Pas forcément.
    Je ferais plutôt un constructeur de la collection qui initialise son tableau interne avec tous les objects Catégorie présents dans la base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public function __construct($PDO) {
            $requete = "SELECT id, attribut FROM table ORDER BY id;";
     
            foreach ( $PDO->query($requete) as $c ) {
                $o = new Categorie();
                $o->id       = $c['id'];
                $o->attribut = $c['attribut'];
     
                $this->items[] = $o;
            }
     
            return count($this->items);
        }

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 151
    Par défaut
    oue j'aime bien
    merci
    bon et imaginons qu'il y ait des articles et des catégories
    et que bien évidemment un article fait partie d'une catégorie particulière

    il faut que :
    - catégorie extends collectionCatégories ?
    - collectionCatégories implements iteratorAgreggate ?
    - faire la même chose pour article ? ou bien peut on faire une collection générique ?
    - car si il faut faire la même chose dans ce cas :
    - article extend collectionArticle, catégorie ?
    - collectionArticleImplements iteratorAgreggate et extend qqch ?
    Lol ca devient compliqué là ...
    Bref que dois je faire dans ce cas là ?
    Merci

    edit : comment peux tu faire $o->id ?? ca veut dire que t'as mis l'attribut de ta classe Categorie en public ?

  6. #6
    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 : 51
    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 AsQuel
    oue j'aime bien
    merci
    bon et imaginons qu'il y ait des articles et des catégories
    et que bien évidemment un article fait partie d'une catégorie particulière

    il faut que :
    1) catégorie extends collectionCatégories ?
    2) collectionCatégories implements iteratorAgreggate ?
    3) faire la même chose pour article ? ou bien peut on faire une collection générique ?
    4) car si il faut faire la même chose dans ce cas :
    - article extend collectionArticle, catégorie ?
    - collectionArticleImplements iteratorAgreggate et extend qqch ?
    Lol ca devient compliqué là ...
    Bref que dois je faire dans ce cas là ?
    Merci
    Oula mon garçon, pas d'affolement, ça fait dire des bêtises ...

    1) Pourquoi une catégorie devrait-elle hériter de sa collection ?
    Non, la collection contient des objets, mais ces objets n'héritent pas de la collection.

    2) Oui, comme d'hab, sauf si le parcours par foreach ne t'es pas utile. Et cela peut être le cas, à toi de voir. Mais de toute façons, ça va pas trop user ton clavier à coder...

    3) Encore non, désolé, je suis contrariant.
    Un article est inclus dans une catégorie, donc l'article est une PROPRIETE de CATEGORIE. Un autre choix est de se faire une collection d'articles à part et de ne stocker que son identifiant dans la catégorie idoine. Les deux écoles existent.

    4) Je te laisse répondre avec les éléments ci-dessus

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 151
    Par défaut
    désolé la joie de enfin comprendre m'a emportée lol *pardon*
    donc je récapitule calmement parceque sinon mon prof de POO va se retourner dans sa tombe :p

    donc je fais une collection de catégorie et une d'articles implémentant chacun iteratorAgreggate. ou alors apparemment tu parlais d'une autre solution (que je n'ai pas compris c'est pourquoi j'ai répété l'autre )

    et il y a juste mon article qui extend une catégorie et c'est tout !
    Ok c'est un peu plus clair ... mais il reste du flou ...

    edit : comment peux tu faire $o->id ?? ca veut dire que t'as mis l'attribut de ta classe Categorie en public ?
    et ton constructeur retourne une valeur ??

  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 : 51
    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 AsQuel
    donc je fais une collection de catégorie et une d'articles implémentant chacun iteratorAgreggate. ou alors apparemment tu parlais d'une autre solution (que je n'ai pas compris c'est pourquoi j'ai répété l'autre )
    Je vais essayer d'expliquer si tu veux

    et il y a juste mon article qui extend une catégorie et c'est tout !
    Ok c'est un peu plus clair ... mais il reste du flou ...
    Je ne suis pas sûr, mais je ne crois pas que l'article hérite de la catégorie.
    Un objet qui est propriété d'un autre n'en hérite pas forcément, je dirais même que je ne vois pas le cas où ça peut arriver.

    edit : comment peux tu faire $o->id ?? ca veut dire que t'as mis l'attribut de ta classe Categorie en public ?
    et ton constructeur retourne une valeur ??
    Oui j'ai mis $id en public. C'était pour faire simple.
    De toute façon, au grand damn des gourous de l'objet, je mets systématiquement en public lorsque je ne fais pas de vérif sur mes champs.
    A quoi cela sert-il de coder un getter qui fait juste un return et un setter qui faiit juste une assignation ? Faut vraiment aimer coder !

  9. #9
    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 : 51
    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
    Le CollectionCategories->add($objet) m'est utile principalement pour le traitement d'un formulaire d'ajout, par exemple dans un panneau d'administration des catégories.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Citation Envoyé par jml94




    Pas forcément.
    Je ferais plutôt un constructeur de la collection qui initialise son tableau interne avec tous les objects Catégorie présents dans la base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public function __construct($PDO) {
            $requete = "SELECT id, attribut FROM table ORDER BY id;";
     
            foreach ( $PDO->query($requete) as $c ) {
                $o = new Categorie();
                $o->id       = $c['id'];
                $o->attribut = $c['attribut'];
     
                $this->items[] = $o;
            }
     
            return count($this->items);
        }
    Salut,

    je me permet une remarque à cet lecture. En effet je pense que ce n'est pas une bonne pratique que lire de remplir une collections d'items depuis la bdd dans un constructeur.

    Pour une raison purement pratique tou d'abord, en effet il arrivera des cas ou l'on souaitera instancier une telle collection vide. Hors ici ce n'est pas possible. Il faudra une opération supplémentaire. Et surtout on à lu des données depuis la bdd pour rien. Donc cela grève les performances.

    La seconde raison, est que lorsque l'on utilise cette méthode on exprime pas clairement ce que le code fait. En effet, créer une nouvelle collection, à mon sens en tout cas, ne veux pas dire que je vais lire des données, mais plutot je créé un conteneur et c'est tout.
    AMHA qu'il devrait plutot y avoir une méthode bien particuliere utiliser pour remplir l'instance, ou conteneur, depuis la bdd.


    bye

  11. #11
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 151
    Par défaut
    oue c'est pas faux ... !
    mais pourquoi initialiserais tu une collection vide ?

    mais je vais étudier la question ^^

Discussions similaires

  1. [POO] Classe php5 et constructeur php4
    Par mathrem dans le forum Langage
    Réponses: 1
    Dernier message: 19/03/2007, 17h10
  2. [POO] Demande conseils sur la POO avec php5
    Par tigunn dans le forum Langage
    Réponses: 9
    Dernier message: 08/02/2007, 14h44
  3. [POO] Surchage php5 es ce du vrai POO ?
    Par vacknov dans le forum Langage
    Réponses: 7
    Dernier message: 28/07/2006, 17h40
  4. Réponses: 4
    Dernier message: 16/06/2006, 10h49
  5. Réponses: 9
    Dernier message: 16/03/2006, 18h05

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