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] Comment accéder à mes classes parentes en "sautant des niveaux"


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 41
    Points : 31
    Points
    31
    Par défaut [POO] Comment accéder à mes classes parentes en "sautant des niveaux"
    Bonjour!

    Je suis nouveau sur ce forum! C'est la première fois que je poste ici parce que je ne suis pas un pro et que je ne crois pas réellement trouver ma place parmi vous ^^

    cela dit, je cale sur un problème en php poo ne trouve pas de réponses pour moi... (c'est bien une première, et donc je viens vous embêter... )

    J'ai un vrai problème d'accès à mes classes mères.

    Je me trouve avec ces classes:

    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
    <?php
    class Element
    {
      protected $o = 'element' ;
     
      function __construct()
      {
     
      }
    }
     
    class Membre extends Element
    {
      protected $o = 'Membre' ;
     
      function __construct()
      {
     
      }
    }
     
    class Session extends Membre
    {
      $o = 'Session' ;
     
      function _construct()
      {
        echo $this->o ; //affiche "Session" 
        echo parent::$this->o ; //affiche encore "Session" 
      }
    }
     
    ?>
    Ce qui me semble bizarre là dedais, c'est que lorsque j'instancie un objet new Session(), cela m'affiche "SessionSession", donc le constructeur de ma classe Session appelle deux fois la même propriété $o...

    Comment ça se fait? pourquoi je ne peux pas appelé d'abord la variable $o de la classe Session, puis la variable $o de la classe mère, à savoir la classe Membre...? Comment faire pour y remédier...?


    Et j'ai un second problème...

    Lorsque je rajoute une ligne de code à ma classe Session:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    class Session extends Membre
    {
      $o = 'Session' ;
     
      function _construct()
      {
        echo $this->o ; //affiche "Session" 
        echo parent::$this->o ; //affiche encore "Session" 
        echo parent::parent::$this->o ; //affiche encore "Session" 
      }
    }
    ?>
    J'obtiens alors une erreur de type parse error:

    Parse error: parse error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting ',' or ';' in C:\Documents and Settings\BAROZFR4\Mes documents\Projets Boulot\CSEA\site_v2\classes\element.class.php on line 114

    Cette syntaxe doit donc être incorrecte, mais alors comment faire pour appeler explicitement une classe mère depuis une classe fille, mais en en sautant une...?

    Je ne sais pas si je suis clair...

    Merci en tout cas!

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Citation Envoyé par fredu Voir le message
    Ce qui me semble bizarre là dedais, c'est que lorsque j'instancie un objet new Session(), cela m'affiche "SessionSession", donc le constructeur de ma classe Session appelle deux fois la même propriété $o...
    Normal, il y a 2 echo dans ton __construct donc il va afficher 2 fois à la suite le contenu de $o.


    Citation Envoyé par fredu Voir le message
    Comment ça se fait? pourquoi je ne peux pas appelé d'abord la variable $o de la classe Session, puis la variable $o de la classe mère, à savoir la classe Membre...? Comment faire pour y remédier...?
    Ta classe session fait un extends de ta classe Membre.
    Dans ta classe Session tu redéfini la valeur de $o qui va changer pour toutes tes classe parentes de ton instance.


    Citation Envoyé par fredu Voir le message
    Cette syntaxe doit donc être incorrecte, mais alors comment faire pour appeler explicitement une classe mère depuis une classe fille, mais en en sautant une...?
    parent::$this->o renvoit une valeur (le texte 'Session')
    Or il faut un objet pour pour utiliser parent::
    Donc en gros quand tu fait parent::parent::$this->o c'est comme si tu fesait parent::'Session' d'ou php qui ne comprend pas

    Sinon pour t'aider, pourquoi ne pas utiliser des nom de variable différente dans toutes tes classe.
    En plus tu pourra les appeler directement depuis ta derniere classe enfant en fesant $this->a, $this->b, $this->c

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Oui, j'ai tout pigé!

    Je ne voulais justement pas utiliser des noms de variables différents!

    En fait, je pensais que lorsque je définissait une variable dans chaque classe (avec le même nom) je pouvais y accéder en retraçant l'arbre de mes classes alors qu'en fait, lorsqu'on surcharge la classe, on écrase simplement la variable.

    Je suis à mes débuts en matière de poo et c'est une notion qui a été tout à coup assez confuse... Mais j'ai relu ma bible php (qui ne traite que superficiellement l'usage php oo) et avec vos indication, tout me parait plus clair!

    J'avais fait l'erreur à cause de cette même notion sur les méthodes.

    Lorsque je surcharge une méthode dans une classe enfant, je pouvais y appeler la même méthode de la classe parente explicitement avant d'y ajouter mes bouts de code...

    d'où l'abus...

    en tous cas merci du coup de pouce! (je reviendrai vous embêter... )

    A+

    --- edit jml94 ---

    Merci de ne pas oublier le tag

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Citation Envoyé par fredu Voir le message
    En fait, je pensais que lorsque je définissait une variable dans chaque classe (avec le même nom) je pouvais y accéder en retraçant l'arbre de mes classes alors qu'en fait, lorsqu'on surcharge la classe, on écrase simplement la variable.
    Oui, parce que ce n'est pas un membre statique.
    C'est un membre d'instance, donc la valeur est assigné à.... l'instanciation en fonction du scope/type (Element/Membre/Session) de l'instance.

    Si tu veux pouvoir le faire, il faudrait utiliser un membre statique, et utiliser le <late static binding> qui est un nouveau mécanisme de php5.3 pour gérer une problématique quelque peu similaire à la tienne.

    a plus

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/04/2008, 11h42
  2. [POO] Liaisons entre mes classes
    Par cahnory dans le forum Langage
    Réponses: 4
    Dernier message: 14/03/2008, 16h20
  3. accéder à la classe 'parent'
    Par ioRekzor dans le forum Langage
    Réponses: 8
    Dernier message: 15/04/2007, 16h45
  4. [VB.Net 2.0] Comment organiser mes classes ?
    Par arno2000 dans le forum Accès aux données
    Réponses: 1
    Dernier message: 26/06/2006, 15h28
  5. [Obfuscateur] Comment crypter mes .class en java
    Par ferma dans le forum EDI et Outils pour Java
    Réponses: 1
    Dernier message: 01/01/2006, 23h36

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