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 :

List array ou classe ?


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 75
    Points : 60
    Points
    60
    Par défaut List array ou classe ?
    Bonjour,
    Petit question qui paraitra bête pour les pro, mais quel est la différence entre l’utilisation d’ un simple array ou d’une class.
    J’ai appris le développement il y a un moment et j’ai oublié quelques bases.
    Je m’explique.
    Quand je créé un objet de type array et que je l’affiche dans une table tous mes objets s’affiche correctement.
    Si je crée un objet de type class et que je l’affiche dans une table tous mes objets s’affiche correctement aussi.
    Mais si je fais ce même obj de type classe sans faire pour chaque objet $monObj = new MaClass() et que je lui redonne (avec ‘set_’) de novelle donnée, mon tableau n’affiche que le dernier obj créé.
    Voire le code ci-dessous pour mieux comprendre

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
     
    <?php
     
    class Ma_Class
    {
    	private $_id;
    	private $_name;
     
    	function __construct() { }
     
    	function get_id() { return $this->_id; }
    	function set_id( $id ) { $this->_id = $id; }
     
    	function get_name() { return $this->_name; }
    	function set_name( $name ) { $this->_name = $name; }	
    }
     
     
    // Liste de mes objets sous forme de tableau
    $arrayL = array();
    // Liste de mes objets sous forme de classe
    $classL = array();
    // Liste de mes objets sous forme de classe sans faire new
    $classSNL = array();
     
     
    // Exemple 1 : Je remplis ma liste avec les objet sous forme de tableau
    $obj1 = array(); 	
     
    $obj1['id']			= '1';
    $obj1['name']		= 'Phillipe';
    $arrayL[] = $obj1;		
     
    $obj1['id']			= '2';
    $obj1['name']		= 'Marc';
    $arrayL[] = $obj1;			
     
    $obj1['id']			= '3';
    $obj1['name']		= 'Julien';
    $arrayL[] = $obj1;
     
    // Exemple 2 : Je remplis ma liste avec les objet sous forme de classe
    $obj2 = new Ma_Class(); 
    $obj2->set_id( '1' );
    $obj2->set_name( 'Phillipe' );
    $classL[] = $obj2;
     
    $obj2 = new Ma_Class(); 
    $obj2->set_id( '2' );
    $obj2->set_name( 'Marc' );
    $classL[] = $obj2;	
     
    $obj2 = new Ma_Class(); 
    $obj2->set_id( '3' );
    $obj2->set_name( 'Julien' );
    $classL[] = $obj2;
     
    // Exemple 3 : Je remplis ma liste avec les objet sous forme de classe sans faire new 
    $obj3 = new Ma_Class(); 
    $obj3->set_id( '1' );
    $obj3->set_name( 'Phillipe' );
    $classSNL[] = $obj3;
     
    $obj3->set_id( '2' );
    $obj3->set_name( 'Marc' );
    $classSNL[] = $obj3;	
     
    $obj3->set_id( '3' );
    $obj3->set_name( 'Julien' );
    $classSNL[] = $obj3;
     
     
    ?>			
     
    <!doctype html>
    <html lang="fr">
    <head>
      <meta charset="utf-8">
    	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    	<title>Test</title>
     
    </head>
    <body>
     
    <!--	Exemple 1	-->             
              <table id="t_exp_1" width="100%" border="1" cellpadding="1" cellspacing="1">
                <thead>
                 <tr>
                   <th>ID</th>
                   <th>Name</th>
                 </tr>
                </thead>
                <tbody>
    		  <?php
              for ($i = 0; $i < count($arrayL); $i++){
     
                  $id 	= $arrayL[$i]['id'];
                  $name = $arrayL[$i]['name'];
     
                  ?>
                  <tr>				
                    <td><?php echo $id; ?></td>
                    <td><?php echo $name; ?></td>
                  </tr>		   
                  <?php	
              } 
              ?>        
                </tbody>
              </table>
     
     
    <!--	Exemple 2	--> 
              <table id="t_exp_2" width="100%" border="1" cellpadding="1" cellspacing="1">
                <thead>
                 <tr>
                   <th>ID</th>
                   <th>Name</th>
                 </tr>
                </thead>
                <tbody>
    		  <?php
              for ($i = 0; $i < count($classL); $i++){
     
                  $id 	= $classL[$i]->get_id();
                  $name = $classL[$i]->get_name();
     
                  ?>
                  <tr>				
                    <td><?php echo $id; ?></td>
                    <td><?php echo $name; ?></td>
                  </tr>		   
                  <?php	
              } 
              ?>        
                </tbody>
              </table>
     
     
    <!--	Exemple 3	--> 
              <table id="t_exp_3" width="100%" border="1" cellpadding="1" cellspacing="1">
                <thead>
                 <tr>
                   <th>ID</th>
                   <th>Name</th>
                 </tr>
                </thead>
                <tbody>
    		  <?php
              for ($i = 0; $i < count($classSNL); $i++){
     
                  $id 	= $classSNL[$i]->get_id();
                  $name = $classSNL[$i]->get_name();
     
                  ?>
                  <tr>				
                    <td><?php echo $id; ?></td>
                    <td><?php echo $name; ?></td>
                  </tr>		   
                  <?php	
              } 
              ?>        
                </tbody>
              </table>
     
    </body>
    </html>
    Qu’est ce qui différencie une classe d’un array. Quant vaut-il mieux utiliser l’un ou l’autre.


    Merci

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Bonjour,

    ta question n’est pas si évidente car il y a un piège dans la manière dont PHP référence les tableaux.

    Ton exemple avec $obj1 est biaisé : tu ne crées pas de nouveau tableau à chaque nouveau jeu de valeurs. Mais ça marche quand même, parce que PHP fait quelque chose d’inattendu : il copie le tableau, au lieu de réutiliser la même référence comme il le ferait pour un objet de classe.

    Regardons en détail ce qui se passe. Quand tu modifies les valeurs de $obj1, tu modifies les valeurs du même tableau. Mais lorsque tu ajoutes ce tableau à $arrayL, PHP va en réalité ajouter une copie de $obj1, ce qui fait qu’en modifiant par la suite $obj1, tu ne modifies pas les données déjà présentes dans $arrayL.

    En utilisant des références, tu peux empêcher la copie du tableau, et voir ce qui se passerait dans un autre langage (par exemple JavaScript) où les tableaux ne sont pas copiés implicitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $obj1 = array();
     
    $obj1['id']     = '1';
    $obj1['name']   = 'Phillipe';
    $arrayL[] =& $obj1;
     
    $obj1['id']     = '2';
    $obj1['name']   = 'Marc';
    $arrayL[] =& $obj1;
     
    $obj1['id']     = '3';
    $obj1['name']   = 'Julien';
    $arrayL[] =& $obj1;
    Là tu as le même résultat que dans ton exemple 3.

    Du même coup tu as l’explication de ce qui se passe dans ce troisième exemple. PHP ne copie pas les objets. Du fait que les objets peuvent avoir un comportement spécial lors de leur construction (par exemple ouvrir une connexion à une base de données), PHP se retient d’en créer de nouveaux « à la légère ». Ça causerait des problèmes difficiles à comprendre. Du coup, à la place, il passe une référence.

    Donc ton objet $obj3 n’est jamais copié, et à la fin $classSNL contient trois références vers $obj3.



    Les différences entre un tableau et une classe, c’est :
    • D’abord, la classe peut avoir les méthodes, des membres privés, être héritée, etc. Elle te permet de représenter un concept, une unité logique de ton application. Le tableau, lui, représente un ensemble de données qui n’ont pas nécessairement de cohérence les unes entre les autres.
    • Le tableau te permet d’itérer (boucle for, foreach) sur ses valeurs ; avec une classe, ça n’a pas tellement de sens de vouloir itérer sur ses membres. Si tu te retrouves à avoir besoin d’une boucle, en particulier quand tu ne connais pas à l’avance le nombre d’éléments, choisis de préférence un tableau.
    • Les tableaux PHP viennent avec un ensemble de fonctions pour les manipuler : les trier, rechercher une valeur, appliquer une fonction à tous ses éléments, etc. Les classes, également, ont leurs propres fonctions qui couvrent des besoins différents : elles sont davantage orientées vers la métaprogrammation.
    • Un tableau est généralement la solution la plus simple (ça ne veut pas forcément dire la meilleure !). Une classe, ça se prépare, on y réfléchit, on la conçoit pour répondre à un besoin précis. Là où un tableau convient, une classe n’est pas nécessaire.
    • Enfin, c’est aussi une question de jugement personnel, et de style de programmation. Tout le monde n’est pas d’accord sur l’utilisation d’un tableau plutôt que d’un objet dans une situation donnée, et tu dois te faire ta propre opinion.


    J’espère que ça t’éclaire un peu mieux

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 75
    Points : 60
    Points
    60
    Par défaut
    Bonjour Watilin et merci de votre retour,

    C’est on ne peut plus clair. La persistance des données. J’avais à peine fini mon post que cela avait fait tilt. Plus, comme vous le dite, PHP qui fait des choses inattendues et avec qui j’ai encore quelque difficultés d’écriture ayant appris le C# avec Visual Studio où un chat est un chat.

    Mon projet (mille fois créé par tout le monde), un site tout bête pour gérer des commandes, facture, client,…
    Session utilisateur, quand je fais mon appel de page mes objet son des class et quand j’utilise JQuery/Json pour, après un clic sur une ligne de tableau (.datatable), récupérer et afficher des données supplémentaire, j’utilise les array. Dès ajout ou modification je mets à jour la base de données.

    Je ne suis pas encore très à l’aise avec le développement web, coté client, coté serveur.

    Est-ce que du coup, j’ai vraiment besoin de class pour l’appel des pages et qu’elles soient persistante coté serveur. Est-ce que l’utilisation d’array même pour l’appel des page suffirait pas, et ne serais pas plus simple ?

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Qu’est-ce qui te fait penser à la persistance ? Un objet n’est pas plus persistant qu’un tableau, il est créé au moment où tu fais new, et il est détruit au plus tard à la fin du script.

    Si j’ai cité en exemple une connexion à une base de données, c’était pour parler du comportement que toi, développeur, tu peux donner à l’objet lors de sa construction. Tu peux écrire du code de connexion à une BDD dans son constructeur. Mais ce n’est qu’un exemple. Comme PHP ne peut pas prévoir si le constructeur va avoir un « effet de bord » ou pas, les développeurs du langage ont choisi la solution prudente : un objet n’est jamais copié implicitement.

    Pour répondre à ta question, peu importe car la fonction json_encode accepte aussi bien les tableaux que les objets. Attention cependant, avec un objet, elle n’exportera que les membres publics ; les méthodes et les membres private ou protected seront ignorés. Personnellement je pense qu’il vaut mieux utiliser un tableau pour la clarté du code.

    Note : comme je suis curieux j’ai fait quelques tests, et il apparaît que PHP utilise, en certaines occasions, une « classe par défaut » (stdClass), qui est une sorte de tableau du pauvre : pas de méthodes, uniquement des membres publics, c’est itérable et c’est accepté par certaines fonctions de manipulation de tableaux – mais pas toutes. Je ne comprends pas bien l’intérêt de ce truc.

    Pour t’aider dans ton développement, voici un petit conseil. Essaye de ne pas mélanger les langages, sépare bien les côtés client et serveur. Souviens-toi que les scripts PHP et JS ne « vivent » pas au même moment : quand la partie client commence à fonctionner, la partie serveur a déjà terminé son exécution.

    C’est généralement une bonne idée d’avoir un fichier JS statique (pas de bouts de PHP dedans), et de faire des requêtes Ajax vers un script PHP consacré exclusivement à la génération du JSON.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 75
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Qu’est-ce qui te fait penser à la persistance ? Un objet n’est pas plus persistant qu’un tableau, il est créé au moment où tu fais new, et il est détruit au plus tard à la fin du script.
    Ba oui je suis en environnement client/serveur. Shame on me !!!
    Quant à Json et les membres publics merci pour l’info.

    Bon je vais arrêter de faire mon Shadoks « Pourquoi faire simple quand on peut faire compliquer ».

    Merci de votre aide et tous ces rappels Watilin, je vais reprendre les choses simplement et proprement ^^

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

Discussions similaires

  1. Initialisation d'une liste avec une classe
    Par Poischack dans le forum Général Python
    Réponses: 2
    Dernier message: 26/12/2007, 23h52
  2. Liste de 2 classes diffentes sans STL
    Par Freygolow dans le forum C++
    Réponses: 12
    Dernier message: 21/09/2007, 12h17
  3. PAs de listes de mes classes dans l'éditeur
    Par jerome.fortias dans le forum Visual Studio
    Réponses: 1
    Dernier message: 05/09/2007, 16h55
  4. Réponses: 7
    Dernier message: 29/04/2007, 10h37
  5. liste chainé en classe
    Par maroweb dans le forum C++
    Réponses: 7
    Dernier message: 09/12/2006, 19h05

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