Page 1 sur 1

Instancier plusieurs objet du meme type

Posté : 04 août 2011, 12:04
par Manserk
Hello j'ai une requete qui renvoit plusieures lignes de livraisons, j'aimerais instancier plusieurs objets selon le nombre de ligne ( une ligne = un objet )

je suis partis sur ça :
if ($bdd->getNbLignes($resTbPrepa) > 0) {
     $i = 0;
     while ($rowTbPrepa = mysql_fetch_assoc($resTbPrepa)) {
          $prep[$i] = new preparation(
               $rowTbPrepa['client_liv'],
               $rowTbPrepa['model_v_liv'], etc...
          )
            $i++;
      }
}
je stocke mes objets dans un tableau

est ce que c'est ok de faire comme ça ? la mon tableau qui est sensé contenir des objets preparation ne va etre dispo que dans la boucle non ?

Re: Instancier plusieurs objet du meme type

Posté : 04 août 2011, 12:37
par popy
Non, la portée des variables en php s'étend à toute la fonction.

Ceci dit, par souci de propreté, je te conseille de déclarer ta variable avant ta boucle, ne serais-ce que pour préciser que c'est un array

Code : Tout sélectionner

$prep = array();
Et oublie ton $i

Code : Tout sélectionner

$prep = new preparation( $rowTbPrepa['client_liv'], $rowTbPrepa['model_v_liv'], etc... );

Re: Instancier plusieurs objet du meme type

Posté : 04 août 2011, 12:58
par Manserk
Merci ! :)

Re: Instancier plusieurs objet du meme type

Posté : 05 août 2011, 02:50
par devlop78
Non, la portée des variables en php s'étend à toute la fonction.

Ceci dit, par souci de propreté, je te conseille de déclarer ta variable avant ta boucle, ne serais-ce que pour préciser que c'est un array

Code : Tout sélectionner

$prep = array();
Et oublie ton $i

Code : Tout sélectionner

$prep = new preparation( $rowTbPrepa['client_liv'], $rowTbPrepa['model_v_liv'], etc... );

Code : Tout sélectionner

$prep[] = new preparation( $rowTbPrepa['client_liv'], $rowTbPrepa['model_v_liv'], etc... );

Re: Instancier plusieurs objet du meme type

Posté : 05 août 2011, 11:15
par popy
>.<

Re: Instancier plusieurs objet du meme type

Posté : 05 août 2011, 17:50
par Cyrano
Comme personne ne semble réagir, je le fais : cette manière de faire me semble dénoter un problème de conception de ta classe preparation.

Créer une collection d'objets du même type risque fort de plomber l'utilisation de la mémoire. La solution que je verrais pour alléger un peu et simplifier consisterait à ajouter dans la classe une méthode du genre init() avec les paramètres du constructeur et de virer ces mêmes paramètres du constructeur.

Pourquoi cette idée ? Je présume qu'une fois tes objets stockés dans ton tableau, tu vas ensuite leur faire exécuter une série de traitements dans un boucle pour tous les passer en revue. Tu pourrais faire le tout en une seule boucle avec une seule instance de ta classe. Schématiquement, ça ressemblerait donc à ceci :
<?php
//..
if ($bdd->getNbLignes($resTbPrepa) > 0)
{
    $i = 0;
    $oPreparation = new preparation();
    while (false !== ($rowTbPrepa = mysql_fetch_assoc($resTbPrepa)))
    {
       $oPreparation->init(
            $rowTbPrepa['client_liv'],
            $rowTbPrepa['model_v_liv'], etc...
        );
        //.... Suite des traitements prévus sur l'instance ...
        //...
    } // fin des traitements sur la ligne, on boucle pour ré-initialiser l'instance avec la ligne de données suivante...
}
my 2¢ ;)