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] Chuck Norris can access private method, and me too ! [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    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 [POO] Chuck Norris can access private method, and me too !
    Bonjour tous,

    Je suis tombé sur un cas étrange alors que je gérais un objet en utilisant une variante du pattern Composite.

    Dans le code suivant, j'arrive à accéder à une méthode privée du descendant à partir du parent. Comment cela s'explique-t-il ?

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    <?php
    class composite {
     
        private $_name;
     
        protected $_children = array();
     
        public function __construct($name)
        {
            $this->_name = $name;
        }
     
        public function publicRecursiveStuff()
        {
            printf ('public : %s' . PHP_EOL, $this->_name);
     
            foreach ($this->_children as $c) {
                // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                // !! ACCES A UNE METHODE PRIVEE !!
                // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                $c->_privateRecursiveStuff();
            }
        }
     
        private function _privateRecursiveStuff()
        {
            printf ('private : %s' . PHP_EOL, $this->_name);
        }
     
        public function addChild($name)
        {
            $child = new composite($name);
            $this->_children[] = $child;
            return $this;
        }
    }
     
    // init de l'objet
    $root = new composite('root');
     
    // ajout de descendants
    for ($i = 1; $i < 10; $i++) {
        $name = 'child' . $i;
        $root -> addChild($name);
    }
    J'imagine que c'est parce qu'il s'agit de la même classe, mais je ne trouve pas plus d'explications.

    D'avance merci de vos lumières.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    L'accès aux éléments privés est uniquement réservé à la classe qui les a définis.
    De plus il va aller chercher ses méthode.

    Et surtout ca :

    http://www.php.net/manual/fr/languag...-other-objects


    Les objets de même type ont un accès aux membres privés et protégés même s'ils ne sont pas dans la même instance. Ceci est dû au fait que les détails spécifiques de l'implémentation sont déjà connus en interne par ces objets.

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    On l'avait déjà relevé dans un autre thread mais c'est vrai que c'est assez déroutant... Enfin, pas tellement moins non plus qu'une méthode abstract protected static

    Les bizarreries du langage n'arrêteront jamais de nous surprendre

  4. #4
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Enfin, pas tellement moins non plus qu'une méthode abstract protected static
    Bonjour Benjamin,

    je ne vois pas de problème à forcer la définition d'une méthode statique et protégée. Ni d'un point de vue technique, ni d'un point de vue conceptuel. J'ai peut-être loupé le coche ?

  5. #5
    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 stealth35 Voir le message
    Les objets de même type ont un accès aux membres privés et protégés même s'ils ne sont pas dans la même instance. Ceci est dû au fait que les détails spécifiques de l'implémentation sont déjà connus en interne par ces objets.
    Ca m'en bouche un coin.
    Quoi qu'il en soit, j'ai décider de ne pas utiliser cette technique, même si elle est la plus directe. Trop de prise de tête en perspective.

    Quoi qu'il en soit, je vais me coucher moins con ce soir, et c'est déjà une belle performance !


  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Bonjour Benjamin,

    je ne vois pas de problème à forcer la définition d'une méthode statique et protégée. Ni d'un point de vue technique, ni d'un point de vue conceptuel. J'ai peut-être loupé le coche ?
    Avec PHP 5.3 et le late static binding c'est vrai que c'est possible mais essayez ça pour voir:
    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
    abstract class A {
     
      // si vous voulez que ça marche, mettez static
      public static function say () { echo self::hello(); }
     
      abstract protected static function hello ();
     
    }
     
    class B extends A {
     
      protected static function hello () { return 'Say hello to peter'; }
     
    }
     
    B::say();
    Cela provoque un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Strict standards: Static function A::hello() should not be abstract

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    c'est normale, c'est pas logique de faire ça, puisqu’on ne sait pas a qui appartient la méthode, il faut utiliser une interface, ou les traits

  8. #8
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    c'est normale, c'est pas logique de faire ça, puisqu’on ne sait pas a qui appartient la méthode, il faut utiliser une interface, ou les traits
    Tout à fait, mais un tel code en C++ par exemple ne devrait même pas compiler. D'ou l'aspect "étrange" de certains points du langages comme le late static binding qui permet de contourner ça.

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Tout à fait, mais un tel code en C++ par exemple ne devrait même pas compiler. D'ou l'aspect "étrange" de certains points du langages comme le late static binding qui permet de contourner ça.
    c'est parce que avant tu pouvais le faire

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

Discussions similaires

  1. [VB6]Requete sql access:max (date and time)
    Par enibris dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 05/06/2006, 10h42
  2. [POO] Problème: public, protected et private PHP5
    Par fleur_de_rose dans le forum Langage
    Réponses: 5
    Dernier message: 07/05/2006, 20h26
  3. Can't call method "mail" on an undefined value
    Par hpalpha dans le forum Modules
    Réponses: 2
    Dernier message: 18/01/2006, 11h50
  4. Réponses: 3
    Dernier message: 14/01/2006, 19h09
  5. Réponses: 13
    Dernier message: 15/11/2005, 16h47

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