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] Modifier un objet [références]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Par défaut [POO] Modifier un objet [références]
    Bonjour,

    J'ai créé une classe Affixe, et je n'arrive pas à modifier les variables des objets de cette classe. L'instanciation fonctionne correctement, mais la fonction ajouter (qui ajoute un élément dans un tableau $modifs et tient un compte) ne conserve pas les modifications au-delà de la fonction ajouter... L'objet oublie les modifications faites dès que la fonction ajouter est terminée.

    Voici la 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
     
    class Affixe {
        var $nom;
        var $modifs;
        var $nb_decl;
        function Affixe ($genre, $name, $m) {
            $this->nom = $name;
            $this->nb_decl = 0;
        }
        function ajouter (&$op) {
            $this->modifs[] = $op;
            $this->nb_decl += 1;
        }
    }
    Voici le code qui appelle 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
    16
    17
    18
    19
    20
    21
     
    // lecture du fichier des affixes
    $flux = fopen("fr_FR.aff", "r");
    while (!feof($flux)) {
        $line = fgets($flux);
        $elements = split(" +", $line);
        if (sizeof($elements) == 4) {
            // nouvel affixe
            $affix = new Affixe ($elements[0], $elements[1], $elements[2]);
            $affixes[$elements[1]] = $affix;
        }
        elseif (sizeof($elements) == 5) {
            // nouvel operandi
            $op = new Operandi ($elements[2], $elements[3], $elements[4]);
            $affix->ajouter($op);
        }
        else {
            echo "<p>#erreur à la lecture du fichier des affixes#</p>";
        }
    }
    fclose($flux);

  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
    Tu es en php4 ?

    Si oui tu as oublié un & :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->modifs[] =& $op;

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Par défaut
    Pour info, mon code tourne sur une page perso de chez Free.

    Free précise que les services actifs sont :
    Langage de script PHP basé sur la version 4.4.2
    Langage de script PHP basé sur la version 5.1.

    J'ignore sur laquelle des versions ça tourne...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Par défaut
    Merci pour la réponse, je viens d'essayer, mais ça ne change rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        function ajouter (&$op) {
            $this->modifs[] = &$op;
            $this->nb_decl += 1;
            //print_r($this->modifs); echo "<br><br>";
        }
    ça me paraît étrange...
    si je passe l'adresse de $op en paramètre, il ne devrait pas être nécessaire de d'entrer l'adresse du paramètre dans le tableau, non ?

  5. #5
    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
    Tu ne manipule pas des adresses, mais des références. Les références de php ne sont pas les pointeurs de c !

    Qu'est-ce qui te dis que ça ne change rien ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Par défaut
    Le tableau demeure vide et le compte reste à zéro, quoi que je fasse.

    Par exemple, si j'affiche l'état de l'objet de classe Affixe au fur et à mesure, grâce au code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function ajouter (&$op) {
            $this->modifs[] = &$op;
            $this->nb_decl += 1;
            echo "nb_decl : $this->nb_decl<br>"; print_r($this->modifs); echo "<br><br>";
    J'obtiens :

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Instanciation : Q -- nb_decl : 0
    
    Ajouts :
    nb_decl : 1
    Array ( [0] => operandi Object ( [cut] => 0 [add] => qu' [cond] => [aàâeèéêiîoôuh] ) )
    
    nb_decl : 2
    Array ( [0] => operandi Object ( [cut] => 0 [add] => quoiqu' [cond] => [aàâeèéêiîoôuh] ) [1] => operandi Object ( [cut] => 0 [add] => quoiqu' [cond] => [aàâeèéêiîoôuh] ) )
    
    nb_decl : 3
    Array ( [0] => operandi Object ( [cut] => 0 [add] => puisqu' [cond] => [aàâeèéêiîoôuh] ) [1] => operandi Object ( [cut] => 0 [add] => puisqu' [cond] => [aàâeèéêiîoôuh] ) [2] => operandi Object ( [cut] => 0 [add] => puisqu' [cond] => [aàâeèéêiîoôuh] ) )
    
    nb_decl : 4
    Array ( [0] => operandi Object ( [cut] => 0 [add] => lorsqu' [cond] => [aàâeèéêiîoôuh] ) [1] => operandi Object ( [cut] => 0 [add] => lorsqu' [cond] => [aàâeèéêiîoôuh] ) [2] => operandi Object ( [cut] => 0 [add] => lorsqu' [cond] => [aàâeèéêiîoôuh] ) [3] => operandi Object ( [cut] => 0 [add] => lorsqu' [cond] => [aàâeèéêiîoôuh] ) )


    Mais plus loin, si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach ($affixes as $elem) {
        print_r ($elem); echo "<br>";
    }
    j'obtiens :

    affixe Object ( [nom] => Q [modifs] => [nb_decl] => 0 )

  7. #7
    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
    Bienvenu dans php4. C'est une vrai plaie ces références.

    Si tu regardes la première trace (au fur et à mesure) tu remarqueras que l'item que tu rajoute "écrase" les autres.

    Avant de voir ton problème d'origine essayons tout d'abord de fixer ce truc.
    Essaie de rajouter juste après cette ligne :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $affix->ajouter($op);
    La ligne suivante :

    Et redonnes-nous la trace au fur et à mesure.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    Salut

    j'ai pas bien regarder ton code,
    mais je pense que c'est encore un pb de references

    essaye ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $affix = new Affixe ($elements[0], $elements[1], $elements[2]);
     
     $affixes[$elements[1]] =& $affix;

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

Discussions similaires

  1. [POO] Destruction d'objet et de ses références
    Par Bilhackmac dans le forum Langage
    Réponses: 8
    Dernier message: 15/11/2009, 17h12
  2. [POO] Perte de la référence sur mon objet (this) lors d'un évènement
    Par muad'dib dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/12/2008, 12h59
  3. Réponses: 2
    Dernier message: 28/06/2008, 23h08
  4. [POO] Passage d'objet par référence
    Par PinGu- dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2008, 10h23
  5. [POO] Modifier attributs d'un objet par référence
    Par justSam dans le forum Langage
    Réponses: 8
    Dernier message: 22/02/2007, 07h58

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