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 :

La classe fille n'hérite pas des propriétés de la classe mère [POO]


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut La classe fille n'hérite pas des propriétés de la classe mère
    Bjr,

    en vue de moduler mon code, je compte utiliser le mécanisme de la POO d'héritage.

    Comme jamais implémenté, j'ai d'abord fait un test, mais non concluant. Pourquoi ?

    dvp\poo\mere.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    namespace dvp\poo;
     
    class mere
    {
        public $propertieMere;
    }

    dvp\poo\fille.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
    namespace dvp\poo;
     
    class fille extends mere
    {
        public function getPropertiesMere() {
            return $this->propertie_mere;
        }
    }

    dvp\poo\TestHerit.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    include "mere.php";
    include "fille.php";
     
    use dvp\poo\mere;
    use dvp\poo\fille;
     
    $mere = new mere();
    $fille = new fille();
    $mere->propertie_mere = "un-test";
    echo "propertie_mere : ".$mere->propertie_mere."<br/>";
    echo "propertie_mere héritée : ".$fille->getPropertiesMere();

    l'exécution de TestHerit.php donne :
    propertie_mere : un-test
    propertie_mere héritée :
    Qu'est-ce qui va pas, SVP ?

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Première chose à faire: activer l'affichage des erreurs, car un tel code devrait normalement t'afficher: Warning: Undefined property: fille::$propertie_mere. (Tu as écrit $propertieMere dans l'une et $propertie_mere dans l'autre).

    Ensuite, quand une classe hérite d'une autre, cela signifie qu'elle dispose des méthodes et propriétés (public et protected) de la classe mère, mais en aucun cas que la valeur des propriétés d'une instance de la classe mère vont se retrouver dans une instance de la classe fille (et vice et versa)(*). Il n'y a pas de lien entre les instances. L'héritage, c'est uniquement un lien entre classes, mais pas entre leurs instances.

    Un test pour vérifier qu'une propriété de la classe mère se retrouve bien dans la classe fille serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Mother
    {
        public $motherProperty;
    }
     
    class Daughter extends Mother
    {
    }
     
    var_dump(property_exists('Daughter', 'motherProperty')); // bool(true)
    (*) Les seules exceptions sont les constantes et tout ce qui est static. (en résumé tout ce qui est propre à la classe)

    Aussi, si tu dois écrire un getter, autant le mettre dans la classe mère.

    L'héritage peut-être un moyen de rendre son code plus "modulaire" et d'alléger ses classes, mais il y a aussi l'injection de dépendances qui est une voie à étudier quand on se lance dans ce genre de choses.

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Merci pour ton explication. J'ai modifié mon test et là non plus, je ne comprend pas...

    mere.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    namespace dvp\poo;
     
    ini_set('display_errors', 1);
    error_reporting(-1);
     
    class mere
    {
        public $propertie_mere;
     
        public function getPropertieMere() {
            return $this->propertie_mere;
        }
    }

    fille.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    namespace dvp\poo;
     
    ini_set('display_errors', 1);
    error_reporting(-1);
     
    class fille extends mere
    {
     
    }

    TestHerit.php :
    Code php : 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
    ini_set('display_errors', 1);
    error_reporting(-1);
     
    include "mere.php";
    include "fille.php";
     
    use dvp\poo\mere;
    use dvp\poo\fille;
     
    $mere = new mere();
    $fille = new fille();
    $mere->propertie_mere = "un-test";
    echo "propertie_mere (méthode) : ".$mere->getPropertieMere()."<br/>";
    echo "propertie_mere héritée : ".$fille->getPropertieMere();

    Ca affiche :
    propertie_mere (méthode) : un-test
    propertie_mere héritée :
    Ici, la méthode getPropertieMere() est héritée et non surchargée, mais je suppose que le $this désigne l'instance, donc comment faire pour que la fille accède (lecture et écriture) à la propriété de la mère ?

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Comme je te l'ai dit dans mon message précédant, il n'y a pas de lien entre les instances de classes! Ce n'est pas parce qu'une classe hérite d'une autre que tu peux accéder aux valeurs d'une propriété d'une instance de l'une à partir d'une instance de l'autre. Si on devait utiliser une image pour qualifier l'héritage de classes, on pourrait dire que l'héritage consiste à transmettre une coquille (ou un schéma de construction) d'une classe à une autre, mais le contenu des instances de classes n'est pas dans le deal. D'ailleurs, si tu multiplies les instances de Mere et celle de Fille, comment pourrais-tu associer les différentes instances (telle mère à telle fille).

    mais je suppose que le $this désigne l'instance
    Tout à fait.

    comment faire pour que la fille accède (lecture et écriture) à la propriété de la mère
    Le seul moyen est de définir une propriété static dans la classe mère. Mais ce n'est pas anodin, ce faisant toutes les instances de la classe mère et toutes les instances des classes héritées auront cette valeur en commun, ce qui implique que si je décide de la changer dans une des instances de la classe mère ou d'une classe hérité, elle sera changée pour toutes les autres.

    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
    class Mother
    {
        public static $toto;
    }
     
    class Daughter extends Mother {}
     
    $m = new Mother;
    $d = new Daughter;
     
    $m::$toto = 8;
     
    echo $d::$toto, PHP_EOL; // 8
     
    $d::$toto = 10;
     
    echo $m::$toto, PHP_EOL; // 10
     
    // on peut d'ailleurs voir que les instances n'ont rien à voir la dedans,
    // puisqu'il n'est même pas utile d'en créer une pour modifier cette valeur.
     
    Daughter::$toto = 45;
     
    echo Mother::$toto, PHP_EOL; // 45
    Par ailleurs si je devais me référer à cette propriété au sein de la classe mère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function setToto($v) {
        self::$toto = $v;
    }
    J'utiliserai self qui se rapporte à la classe et non $this qui se rapporte à l'instance.

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Merci, c'est devenu clair :

    mere.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    namespace dvp\poo;
     
    ini_set('display_errors', 1);
    error_reporting(-1);
     
    class mere
    {
        public static $propertie_mere;
    }

    fille.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    namespace dvp\poo;
     
    ini_set('display_errors', 1);
    error_reporting(-1);
     
    class fille extends mere
    {
     
    }

    TestHerit.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    ini_set('display_errors', 1);
    error_reporting(-1);
    include "mere.php";
    include "fille.php";
     
    use dvp\poo\mere;
    use dvp\poo\fille;
     
    mere::$propertie_mere = "un-test";
    echo "propertie_mere héritée : ".fille::$propertie_mere ;
    et la propriété mère dont je compte faire hériter les filles étant un compteur, c'est parfait.

    Etonnant car avec Firefox, je n'avais pas le bouton ; il a fallu que j'édite avec Chrome pour l'avoir...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/12/2007, 15h03
  2. Réponses: 1
    Dernier message: 13/09/2007, 14h25
  3. Réponses: 4
    Dernier message: 22/06/2007, 19h02
  4. Réponses: 2
    Dernier message: 04/01/2007, 17h48
  5. Ma classe fille n'hérite pas de sa classe mère
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 15/06/2005, 13h49

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