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 :

[PHP5] fonctionnement inattendu d'un tableau d'objet


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kanzarih
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2002
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2002
    Messages : 327
    Par défaut [PHP5] fonctionnement inattendu d'un tableau d'objet
    Bon soir a tous,
    J'ai un comportement inattendu que je ne comprend pas. voila mon code :

    pour commencer j'ai une classe Test() :
    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
     
    <?php
    class Test{
        private static $v;
     
        public function __construct(){}
     
        public function getV(){
          return self::$v;
        }
     
        public function setV($value){
          self::$v = $value;
        }
    }
    ?>
    et un code utilisant cette classe :

    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
     
    <?PHP
    include('test.php');
    $table = array(1,2,3,4,5);
    $otable = array();
    foreach($table as $value){
      $test = new Test();
      $test->setV($value);
      $otable[]=$test;
    }
    echo '- la longueur du tableau d objet est de : '.sizeof($otable);
    foreach($otable as $obj){
      echo '<br>'.$obj->getV();
    }
    ?>
    l'exécution de ce code me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    - la longueur du tableau d objet est de : 5
    5
    5
    5
    5
    5
    alors que j'attendais qu'il m'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    - la longueur du tableau d objet est de : 5
    1
    2
    3
    4
    5
    pour expliquer, le code qui utilise la classe doit instancier pour chaque valeur du tableau '$table' un objet de type 'Test' en introduisant la valeur encoure du tableau dans l'attribut '$v' de l'objet pour enfin enregistrer chaque instance crée dans le tableau d'objet '$otable'. de ce fait je doit a la fin de l'exécution avoir un tableau d'objet de type 'Test' et chaque objet renferme dans son attribut '$v' une valeur du tableau '$table'.

    Mais ce que j'ai eu c'est un tableau d'objet de type 'TEST' renfermant chaqun la valeur '5' qui est la dernière valeur enregistrer dans le tableau '$table'.

    bon voila j'ai essayer d'être aussi claire que je peut
    alors quelqu'un a une idée d'où provient l'erreur?

    Merci et bon codage

  2. #2
    Membre émérite Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Par défaut
    Bonsoir,

    Pour moi, le comportement que tu décris n'a rien de surprenant,
    alors je veux bien m'essayer à une explication :

    $v, ainsi déclarée (statique), est une propriété qui "appartient" à la classe,
    c'est une propriété de classe.
    Toutes les instances de cette classe peuvent la lire et la modifier,
    mais lorsqu'un objet la modifie, elle est modifiée pour tous les autres.

    Bref,
    lorsqu'à la fin de ton script,
    tu affiches la valeur de la propriété $v de chaque objet,
    tu obtiens tout simplement la valeur de Test::getV(),
    la valeur de la propriété de classe.

    Pour obtenir 1,2,3,4,5, il ne faudrait pas déclarer $v statique,
    elle deviendrait alors une propriété d'objet,
    elle serait propre à chaque objet.

    Voili, voilou.
    Tentative d'explication réussie ?

    Fred

  3. #3
    Membre éclairé Avatar de kanzarih
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2002
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2002
    Messages : 327
    Par défaut
    et oui réussi a 1000000.....00000% et moi qui expliqué les variables static !! ou avais-je la tête .

    Merci

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

Discussions similaires

  1. [Tableaux] Tableau d'objet php5
    Par alliance dans le forum Langage
    Réponses: 3
    Dernier message: 21/08/2006, 21h21
  2. Tableau d'objets
    Par moulefrite dans le forum MFC
    Réponses: 7
    Dernier message: 15/06/2004, 14h14
  3. Sauvegarde / Chargement d'un tableau d'objets
    Par Naruto dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 14h34
  4. [VB6]Tableau d'objet withevents
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/02/2004, 19h44
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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