Instancier plusieurs objet du meme type

Eléphanteau du PHP | 11 Messages

04 août 2011, 12:04

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 ?

Eléphant du PHP | 275 Messages

04 août 2011, 12:37

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... );

Eléphanteau du PHP | 11 Messages

04 août 2011, 12:58

Merci ! :)

devlop78
Invité n'ayant pas de compte PHPfrance

05 août 2011, 02:50

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... );

Eléphant du PHP | 275 Messages

05 août 2011, 11:15

>.<

Mammouth du PHP | 19672 Messages

05 août 2011, 17:50

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¢ ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: