Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/07/2011, 14h28   #1
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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 :
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.
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 14h58   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
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


Citation:
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.
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/07/2011, 15h30   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 13/07/2011, 16h04   #4
Modérateur
 
Avatar de ThomasR
 
Homme Thomas Rambaud
Développeur Web
Inscription : décembre 2007
Messages : 2 140
Détails du profil
Informations personnelles :
Nom : Homme Thomas Rambaud
Âge : 25
Localisation : France

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

Informations forums :
Inscription : décembre 2007
Messages : 2 140
Points : 2 885
Points : 2 885
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 ?
__________________
Développeur Web, accessoirement geek (ou l'inverse)
http://thomasrambaud.com
ThomasR est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/07/2011, 17h03   #5
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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 !

__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/07/2011, 08h54   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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 :
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 :
Strict standards: Static function A::hello() should not be abstract
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/07/2011, 10h26   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 11h38   #8
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 16h35   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h06.


 
 
 
 
Partenaires

Hébergement Web