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 :

Attribut privé accessible depuis une classe enfant [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 14
    Points : 15
    Points
    15
    Par défaut Attribut privé accessible depuis une classe enfant
    Bonjour,

    Je tombe sur un cas qui me laisse perplexe.
    A partir d'un exemple tiré de php.net (http://www.php.net/manual/fr/languag...visibility.php), je n'arrive pas à vérifier ce commentaire :
    "On peut redéclarer les éléments publics ou protégés, mais pas ceux privés".
    Cela me paraît logique.

    Et pourtant...

    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
    <?php
    class MyClass
    {
        private $private = 'Private';
     
        function printHello()
        {
            echo $this->private;
        }
    }
     
    class MyClass2 extends MyClass
    {
        // On peut redéclarer les éléments publics ou protégés, mais pas ceux privés
        private $private = 'Private 2';
     
        function printHello()
        {      
          echo $this->private;
        }
    }
     
    $obj2 = new MyClass2();
    $obj2->printHello();
     
    ?>
    Cet exemple affiche "Private 2" alors que je me serais attendu à une erreur à la ligne 15 (redéclaration d'un attribut privé) et à la ligne 19 (appel à un attribut privé).


    Quelqu'un aurait une idée du pourquoi du comment ?

    Merci de votre aide,
    Sly DeMusli

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    c'est normal.
    il faut comprendre comment les noms sont "résolu". D'abord php recherche dans la portée de la méthode, de la classe, puis des classes mères.

    Or MyClass2->$private est clairement défini dans la classe fille, on peut donc l'appeler. le symbole existe dans la classe MyClass2, donc pas de problème.

    Puisque tu te poses la question, vérifie que tu ne peux pas utiliser parent::$private (il me semble que dans le cas particulier de parent on écrive toujours :: et pas -> https://bugs.php.net/bug.php?id=42016), ni conserver ton fonctionnement en supprimant la déclaration de $private dans la classe fille.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  3. #3
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    J'ajouterai que rendre priver permet de ne pas montrer une variable, pas exposée donc pas documentée dans l'API publique. Si le symbole n'est plus disponible mais réservé pour des raisons internes alors on est dans le caca pour dériver des classes d'objets un peu complexes.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Merci pour ta réponse

    Je te confirme que parent::$private n'est pas accessible et qu'une erreur est générée en supprimant la déclaration de $private dans la classe fille.

    Je pensais que redéclarer un attribut privé existant n'était pas possible et générait une erreur. Mais ce n'est pas une redéclaration qui est faite mais une nouvelle déclaration tout court d'un nouvel attribut qui (malheureusement) peut porter le même nom qu'un attribut privé de la classe parente (si j'ai bien compris et si je m'exprime bien ).

    Merci de ton aide

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/03/2013, 13h23
  2. Réponses: 2
    Dernier message: 18/09/2012, 14h58
  3. Problème accès Textbox depuis une classe enfant
    Par Moutmouth dans le forum C#
    Réponses: 1
    Dernier message: 31/01/2011, 12h34
  4. [Cocoa] Accès à un attribut d'AppController depuis une autre classe
    Par valleix007 dans le forum Apple
    Réponses: 8
    Dernier message: 18/08/2010, 20h50
  5. Référence à un objet existant depuis une classe
    Par Adrenalys dans le forum ASP
    Réponses: 2
    Dernier message: 21/07/2005, 00h44

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