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] Héritage et surcharge de méthodes


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 28
    Points : 27
    Points
    27
    Par défaut [POO] Héritage et surcharge de méthodes
    Salut,

    J'ai un "petit" soucis avec 2 classes écrites en PHP5. Rien de très important, mais j'aimerais être sûr d'avoir bien compris

    J'ai une première classe, qu'on va appeler A :
    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
     
    class A
    {
        const CLASS_VERSION = "beta 1";
        private $prop1;
        private $prop2;
     
        public function __construct()
        {
        // ...
        }
     
        public function get_version()
        {
             return self::CLASS_VERSION;
        }
     
        public function writeMe()
        {
             echo $this->prop1."<br />".$this->get_version();
        }
    }
    et une classe B, qui hérite de A :
    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
     
    class B extends A
    {
         const CLASS_VERSION = "alpha 1.1";
         private $prop3;
     
         public function __construct()
         {
             parent::__construct();
             $this->prop3 = "";
         }
     
         public function get_version()
         {
             return self::CLASS_VERSION;
         }
     
         public function writeMe()
         {
              parent::writeMe();
              echo "<br />Je suis la classe B";
         }
    }
    Je teste maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    include("A.class.php");
    include("B.class.php");
     
    $test = new B();
    $test->writeMe();
    Et c'est là que se pose mon problème, j'obtiens comme résultat la valeur de la propriété 1 ($prop1) suivie du numéro de version de la classe A (A::CLASS_VERSION) puis sur la ligne du dessous "Je suis la classe B".

    Ca me semble à la fois logique et illogique.
    Ma variable est une instance de la classe B. J'appelle la méthode writeMe() qui fait appel à writeMe() de la classe mère A et :
    • Affiche la valeur de $prop1 - ça c'est OK
    • Affiche le numéro de version - là je ne comprends pas trop comment ça se passe
    • Affiche le reste du texte - ça c'est OK


    J'aimerais comprendre pourquoi j'obtiens le numéro de version de la classe mère (A), et non celle de la classe fille (B) alors que la méthode get_version() est surchargée dans B.
    Suis-je donc obligé de réécrire toute la méthode writeMe() de la classe B pour obtenir le résultat voulu ?

    Je ne sais pas si c'est très clair alors n'hésitez pas à me demander plus de détails

    Merci !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    Quand tu fais appel à la méthode writeMe de ta classe mère, celle-ci utilise la méthode get_version de sa propre classe.
    Tu fais donc bien appel à la méthode parent et non à la méthode surchargée.

    Si tu veux t'en convaincre je t'invite à appeler directement get_version à la suite dans la methode writeMe de ta classe fille, et là tu auras bel et bien le bon résultat renvoyé.

    En l'occurence oui il te faut réécrire la fonction writeMe ou réorganiser tes fonctions différemment selon moi.
    Tout pas mieux que tout le monde : évitez les questions techniques en mp sinon à quoi bon poster sur un forum ?

    Petite citation : "Le sage cherche la vérité, l'imbécile l'a déjà trouvée"

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 28
    Points : 27
    Points
    27
    Par défaut
    OK, c'est donc le comportement normal de PHP
    Merci pour ta réponse c'est exactement ce que je voulais savoir !

    Je vais essayer d'organiser mes méthodes autrement, je trouve ça plus élégant que de réécrire toute la méthode, non ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    C'est plus généralement le comportement normal d'un langage objet
    La classe fille a accès aux méthodes de la classe mère mais pas l'inverse.

    Pour réorganiser les méthodes, tu peux déclarer un getter sur la variable prop1 et l'utiliser dans la méthode de la classe mère et celle de la classe fille par exemple.
    Tout pas mieux que tout le monde : évitez les questions techniques en mp sinon à quoi bon poster sur un forum ?

    Petite citation : "Le sage cherche la vérité, l'imbécile l'a déjà trouvée"

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 28
    Points : 27
    Points
    27
    Par défaut
    Parfait, j'ai restructuré mes méthodes en isolant les portions de code communes aux classes mères et filles. Et en créant d'autres pour les portions où ça change. Ca marche nickel.

    Merci encore pour tes précisions ratapapa. Je connais la POO depuis quelques années maintenant mais je n'utilise que très rarement l'héritage, d'où mes interrogations

    Merci

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

Discussions similaires

  1. Héritage multiple, surcharge de méthodes, etc
    Par Stnaire dans le forum jQuery
    Réponses: 0
    Dernier message: 04/03/2012, 00h25
  2. Héritage et surcharge de méthode ?
    Par scheme dans le forum C++
    Réponses: 11
    Dernier message: 05/10/2010, 10h42
  3. [POO] Héritage : Surcharge d'un membre statique parent
    Par Nullos Oracle dans le forum Langage
    Réponses: 7
    Dernier message: 11/09/2007, 18h39
  4. [POO] Héritage d'une méthode getInstance ?
    Par knocc dans le forum Langage
    Réponses: 4
    Dernier message: 13/02/2007, 19h47
  5. [POO] Surcharge de méthode
    Par ouioui2000 dans le forum Langage
    Réponses: 4
    Dernier message: 09/03/2006, 15h25

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