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 des classes


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Coordinateur développement web
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Coordinateur développement web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 412
    Points
    412
    Par défaut [POO] Héritage des classes
    Bonjour,

    J'ai un petit soucis concernant l'héritage de mes classes. Je suis sous php5
    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 A{
     
    function toto(){
     
    }
     
    }
     
    class B extends A{
     
    function toto(){
     
    }
    }
     
    class C extends B{
     
    function toto(){
     
    }
     
    }
    ma question est comment à partir de ma classe c, je peut accèder à ma fonction toto de ma classe A

    j'ai essayer le parent::parent::toto() mais bien entedu ca ne marche pas

    Merci de vos réponse

    Mic

  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
    J'aurais aussi fait ca intuitivement...
    Quelle erreur est renvoyée ?

  3. #3
    Membre averti
    Homme Profil pro
    Coordinateur développement web
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Coordinateur développement web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 412
    Points
    412
    Par défaut
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T_PAAMAYIM_NEKUDOTAYIM
    http://us2.php.net/manual/fr/keyword...ekudotayim.php

    mais je n'est rien trouvez...

  4. #4
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Points : 256
    Points
    256
    Par défaut
    Salut

    C'est bien ca que tu cherches a faire ?

    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
     
    <?php
    class A{
     
    	function toto() {
    		echo "hello World";
    	}
    }
     
    class B extends A{
    	function toto(){
    		echo " erf...";
    	}
    }
     
    class C extends B {
    	function toto () {
    		A::toto();
    		B::toto();
    	}
    	function toto_a(){
    		A::toto();
    	}
    	function toto_b () {
    		B::toto();
    	}
    }
     
    $o = new C ();
    $o->toto();
    $o->toto_a();
    $o->toto_b();
    // (out)
    // hello World erf...hello World erf...
    ?>
    notion de polymorphisme si je ne me trompe pas ( :

    edit : petite correction, ce n'etait pas exactement ce que tu cherchais, m'enfin la ca doit etre bon (ca marche pareil de tte facon)

    sahid

  5. #5
    Membre averti
    Homme Profil pro
    Coordinateur développement web
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Coordinateur développement web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 412
    Points
    412
    Par défaut
    Ok c'est bon ai trouvez

    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
     
    class A{
     
    function toto(){
     
    }
     
    }
     
    class B extends A{
     
    function toto(){
     
    }
    }
     
    class C extends B{
     
    function toto(){
        A::toto();
    }
     
    }
    $tp = new C();
    $tp->toto();
    en fait le mieux est de ne pas passer par parent mais par le nom des class

    Merci tous le monde

    Mic

  6. #6
    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
    Oui, maintenant reste à savoir si l'appel d'une méthode de classe accepte de jouer avec les attributs de cette classe.

    Exemple : l'attribut d qui est déclaré dans la classe A et renseigné dans la méthode toto de celle-ci.
    Si tu fais un A::toto() dans un objet de classe C, son attribut d sera t'il mis à jour malgré tout ?

    Je suis curieux de connaitre la réponse

  7. #7
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Points : 256
    Points
    256
    Par défaut
    bah apres c une histoire de visibilité des attributs je pense

    il faudra penser a declarer l'attribut en "protected" au lieu de "private"

    sahid

  8. #8
    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
    php ne gère pas la visibilité des attributs me semble t'il c'est juste en prévision de son orientation totalement objet.

    Non je parlais de la méthode utilisée, en l'occurence une méthode de classe (méthode que l'on peut invoquer sans avoir nécessairement créé un objet de cette classe). Je me demandais quel pouvait etre le comportement vis à vis des attributs hérités.

  9. #9
    Membre averti
    Homme Profil pro
    Coordinateur développement web
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Coordinateur développement web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Points : 412
    Points
    412
    Par défaut
    si depuis php5, tu peut géré la visibilité de tes variables

  10. #10
    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
    Je me suis mal exprimé : on peut gérer la visibilité mais cela n'engendre pas spécialement une protection particuliere de les déclarer en private il me semble.

    Bref je serais tout de meme curieux de savoir si quelqu'un a la réponse à la question que je me pose ^^

  11. #11
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par mic79
    en fait le mieux est de ne pas passer par parent mais par le nom des class
    Ca marche, mais ca enlève quand même la notion d'héritage de A, ce qui est un peu dommage. Je n'ai pas les moyens de tester au boulot, mais je suis cette discussion avec intérêt pour voir si quelqu'un va proposer quelque chose de plus 'smart'.

  12. #12
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Je me demandais quel pouvait etre le comportement vis à vis des attributs hérités
    Ca marche, mais ca enlève quand même la notion d'héritage de A, ce qui est un peu dommage. Je n'ai pas les moyens de tester au boulot, mais je suis cette discussion avec intérêt pour voir si quelqu'un va proposer quelque chose de plus 'smart'.
    Ca n'enlève rien à la notion d'héritage. Tout fonctionne correctement. C'est aussi comme ça que ça se passe en c++.

    Le truc qui aurait pu faire que ça ne fonctionne pas, c'est si php eu autorisé deux fonctions de même nom dans une hiérarchie dont l'une serait static et l'autre non static.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par goodpz
    Ca n'enlève rien à la notion d'héritage. Tout fonctionne correctement. C'est aussi comme ça que ça se passe en c++.

    Le truc qui aurait pu faire que ça ne fonctionne pas, c'est si php eu autorisé deux fonctions de même nom dans une hiérarchie dont l'une serait static et l'autre non static.
    Tu as raison goodpz ; et c'est idem en Java, Effeil, ... tout langage à objets ! Rq: avant de se lancer dans l'utilisation des concepts objets, mieux vaut les comprendre, sinon bonjour l'horreur pour celui qui reprend votre code ... Ca me rappelle les "vieux" programmeurs C qui pensent que coder en C++, c'est remplacer struct par class et .c par .cpp ...

  14. #14
    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
    Je crois avoir compris ce que voulait dire jml94.
    Passer par une méthode static enlève l'héritage dans la mesure ou ce n'est pas la classe fille qui appelle une méthode de sa mère à proprement parler avec cette écriture.

    D'ailleurs je ne suis pas sur qu'une telle utilisation par exemple en Java soit autorisée avec une methode protected.

    Je repose ma question car elle me turlupine : dans le cas ou une telle méthode devrait jouer sur des attributs de la classe mère, quel comportement aurait on ? Et si ca ne fonctionnait pas, comment le faire fonctionner ?

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ratapapa
    Je crois avoir compris ce que voulait dire jml94.
    Passer par une méthode static enlève l'héritage dans la mesure ou ce n'est pas la classe fille qui appelle une méthode de sa mère à proprement parler avec cette écriture.

    D'ailleurs je ne suis pas sur qu'une telle utilisation par exemple en Java soit autorisée avec une methode protected.

    Je repose ma question car elle me turlupine : dans le cas ou une telle méthode devrait jouer sur des attributs de la classe mère, quel comportement aurait on ? Et si ca ne fonctionnait pas, comment le faire fonctionner ?
    Une méthode static ne peut accéder qu'aux attributs static de la classe ou des éventuelles classes mères ; c'est logique car tte méthode static est appelée sans être préfixée d'un objet donc son code ne peut pas contenir d'accès aux attributs de l'objet courant !
    Quand on écrit g() { A::f(); } si g est une méthode de classe B héritière de la classe A, celà ne signifie pas que f est static, mais simplement que l'on appelle f telle qu'elle est définie dans A (= le comportement de f dans A) ; ceci est autorisé au cas ou dans B f aurait été redéfinie (=surchargée) et que tu veux pour un besoin particulier réutiliser tt de même la f de A ; on fait souvent ça dans la redéfinition de f elle même : ex : B hérite de A ; A déclare et définit la méthode f ; dans B on redéfinit f de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    f() { 
    A::f(); // réutilisation 
    // ici code spécifique 
    }
    c'est le principe même de la surcharge de méthode

    Autre chose : la liaison dynamique te permet de faire (par exemple en Java)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    A a;
    B b;
    a = new B();
    a.f(); // appelle le B::f()

  16. #16
    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
    Oui je connais le principe de l'objet ^^"

    Ma question précise c'est : dans le cas d'un héritage, le fait d'appeler une méthode par la voie static se comporte finalement exactement comme l'appel de la méthode parent ?

    Je m'explique :

    Une classe B hérite d'une classe A qui possède une méthode toto().

    Est ce que dans ce cas ces deux appels sont identiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class B extends A
    {
       function toto()
       {
           parent::toto();
           A::toto();
       }
    }
    Ce qui me fait m'interroger la dessus c'est si par exemple la méthode toto modifie un attribue de la classe A.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A
    {
         var $attribut;
     
         function toto()
         {
            $this->attribut = 0;
         }
    }
    EDIT : cette question n'est pas anodine puisqu'elle rejoint entièrement la question initiale : si ces deux appels ont des comportements différents, comment faire un appel "propre" à une fonction de la mère de la mère ?

    EDIT 2 : réponse partielle moi même, puisque si on a besoin d'appeler directement la méthode "grand mère" c'est que le diagramme de classe présente une faille quelque part

  17. #17
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Citation Envoyé par ratapapa
    Une classe B hérite d'une classe A qui possède une méthode toto().
    Est ce que dans ce cas ces deux appels sont identiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class B extends A
    {
       function toto()
       {
           parent::toto();
           A::toto();
       }
    }
    Réponse : oui, ils sont identiques.
    Et en ce qui concerne ta question sur la protection par private un peu plus haut : oui, private protège bien l'accès. Le seul hic en PHP vient du laxisme du langage : tu peux créer des variables à la volée. Donc, si tu as une variable private dans A et que dans la classe héritière B tu appelles une variable de même nom, tu en crées en fait une nouvelle dans l'espace de nommage de la classe B.
    Exemple :
    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
    class A {
    	private $attA = '??';
    	public function getAtt()
    	{ return $this->attA; }
    }
     
    class B extends A {
    	public function setAtt() 
    	{ $this->attA = 'eee'; }
     
    	public function displayAtt()
    	{
    		echo "dans la classe A : ".parent::getAtt();
    		echo "<br/>dans la classe B : ".$this->attA;
    	}
    }
     
    $b = new B();
    $b->setAtt();
    echo $b->displayAtt();
    donne en sortie :
    dans la classe A : ??
    dans la classe B : eee
    Le B::setAtt() a créé une variable locale B::$attA qui occulte la variable de même nom de la classe mère. Cependant, la variable private de la classe A a bien été protégée de la modification intempestive.

  18. #18
    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
    Désolé je suis contrariant mais je ne suis pas sur d'avoir eu la réponse totale à mon interrogation.

    Un dernier cas de figure et après je lache le morceau

    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
     
    class A
    {
        var $attributA;
     
        function toto()
        {
            $this->attributA = 0;
        }
    }
     
    class B extends A 
    {}
     
    class C extends B
    {
         //Ici je veux pouvoir coder une fonction qui modifie mon attributA, soit faire appel à la méthode toto de la classe A
    }
    Voila ma question : y'a t'il un moyen simple d'appeler la méthode toto de la classe grand mère sachant que celle-ci modifie la valeur de son attribut.
    Le résultat souhaité étant d'avoir la valeur 0 dans l'attributA de ma classe C

  19. #19
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    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
    class A {
      var $attributA;
      function toto() {
        $this->attributA = 0;
      }
    }
     
    class B extends A { }
     
    class C extends B {
      function f() {   
        $this->toto();
        // équilavent à A::toto()
        // mais inutile car toto() n'est pas overloadée
      }
    }
     
    $c = new C;
    print_r($c);
    $c->f();
    print_r($c);
    Ca fonctionne.

    A::toto() callée dans le scope de C::f() n'est pas un call de méthode static, mais un call de toto() dans le scope de la class A.

  20. #20
    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
    Merci bien je dormirai définitivement moins bête ce soir

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [POO] Organisation des classes PHP
    Par AsQuel dans le forum Langage
    Réponses: 6
    Dernier message: 16/02/2007, 09h09
  2. [POO] Problème héritage des classes PHP4
    Par zana74 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 16h00
  3. [POO] Héritage vs classe dans une classe
    Par robichou dans le forum Langage
    Réponses: 4
    Dernier message: 06/08/2006, 23h51
  4. [POO] conception des classes
    Par poukill dans le forum C++
    Réponses: 229
    Dernier message: 19/07/2006, 08h28
  5. [POO] faire des classes en php
    Par gromit83 dans le forum Langage
    Réponses: 2
    Dernier message: 13/04/2006, 16h10

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