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] BUG PHP ?? Utilisation référence


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 18
    Points : 20
    Points
    20
    Par défaut [POO] BUG PHP ?? Utilisation référence
    Bonjour,

    J'ai la version PHP 4.4.2-0 (de dotdeb.org).

    Depuis peu, j'ai un problème (peut-être dû à une mise à jour de PHP, je ne sais pas).

    J'ai une classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class voiture {
       var $couleurs = array();
       ...
       ...
    }
    Ensuite, j'utilise une fonction qui prend en paramètre (par référence) un objet Voiture et qui va modifier son champs $couleurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function modificationCouleurs(&$voitureA){
       $modifCouleurs =& $voitureA->couleurs;
       ...
       ... // je modifie la variable $modifCouleurs, donc normalement le champs $couleurs de l'objet $voitureA devrait aussi être modifié (par référence).
    }
    Au final, le champs $couleurs n'est pas modifié !
    Pourtant, ce code fonctionnait parfaitement depuis longtemps, et sûrement que le changement de version PHP a posé problème.

    Alors, si qqun sait si cette version pose ce genre de soucis, merci beaucoup !!!

    Ou peut-être mon code est-il mauvais ?

    merci d'avance :-)

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 102
    Points
    102
    Par défaut
    ne passe pas par référence, et voit si ca marche

  3. #3
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    tu affectes à ta variable la valeur du champs de classe, je ne vois vraiment pas pourquoi lui devrait changer de valeur...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 123
    Points : 97
    Points
    97
    Par défaut
    je ne sais pas si y'a un rapport mais

    function modificationCouleurs(&$voitureA){

    il faut pas enlever le & ??

  5. #5
    Expert éminent 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
    Points : 6 449
    Points
    6 449
    Par défaut
    Essaye ce script pour t'abstraire de ton appli :
    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
     
    <?php
     
    class A {
        var $nom;
        function A($nom) {
            $this->nom = $nom;
        }
    }
     
    class B {
        function modif(&$a) {
            $nom =& $a->nom;
            $nom = 'Modif par B';
        }
    }
     
    $a =& new A('Je suis A');
    var_dump($a->nom);
     
    $b =& new B();
    $b->modif($a);
    var_dump($a->nom);
     
    ?>
    Chez moi, PHP/4.3.11, ca me donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string(9) "Je suis A" 
    string(11) "Modif par B"

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 18
    Points : 20
    Points
    20
    Par défaut code de test
    Merci pour ton code, je l'ai testé et il fonctionne.

    Cependant, je l'ai modifié pour y mettre l'équivalent de mon vrai code (qui utilise la session), et cela ne fonctionne toujours pas !

    Voici le code :

    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
     
    <?php
     
    class A {
        var $tab = array();
     
        function A() {}
     
        function getTab(){
        	return $this->tab;
        }
     
        function setTab($t){
        	$this->tab = $t;
        }
    }
     
    class B {
        function modif(&$a) {
            $tab =& $a->getTab();
            $tab[1] = "B2";
        }
    }
     
    session_start();
    $_SESSION['a'] = new A();
    $refA =& $_SESSION['a'];
     
    $refA->setTab(array("A1", "A2", "A3"));
     
    var_dump($refA->getTab());
    echo "<br><br>";
     
    $b = new B();
    $b->modif($refA);
    var_dump($refA->getTab());
     
    ?>
    Malgré tout, grâce à ce test, j'ai constaté que si je n'utilise pas la méthode "getTab()" de la classe A, mais directement le champs, cela fonctionne.

    Une explication ?
    est-ce que la ligne suivante est erronnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $tab =& $a->getTab();
    Merci encore...

  7. #7
    Expert éminent 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
    Points : 6 449
    Points
    6 449
    Par défaut
    C'est ta définition de getTab et setTab qui sont apparemment fausses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function & getTab(){
           return $this->tab;
    }
    function setTab(&$t) {
           $this->tab =& $t;
    }

Discussions similaires

  1. [PHP 5.3] [POO] Classes PHP utilisables
    Par jcaspar dans le forum Langage
    Réponses: 1
    Dernier message: 09/08/2009, 01h13
  2. Réponses: 1
    Dernier message: 20/03/2008, 11h09
  3. [POO] bug? de php
    Par XtofRoland dans le forum Langage
    Réponses: 11
    Dernier message: 21/02/2006, 14h54
  4. [PHP] Utilisation de XmlHttpRequest
    Par siddh dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 17/11/2005, 07h47
  5. [POO] Env PHP 5
    Par yanis97 dans le forum Langage
    Réponses: 8
    Dernier message: 09/11/2005, 17h16

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