Page 1 sur 1

surcharge des methodes statiques en php

Posté : 21 juin 2007, 17:34
par ritpas
Bonjour,

J'ai monté une petite application de mise à jour en PHP POO et rencontre un problème lié à la surcharge de methodes statiques. J'ai reproduit le pb de la façon simple suivante :

Code : Tout sélectionner

<?php class A { private static $nom="A"; public static function hello(){ echo self::$nom; } } class B extends A{ private static $nom="B"; } class C extends B{ private static $nom="C"; } C::hello(); ?>
Lorsque j'execute ce code, il m'affiche "A" alorsq ue je m'attends à ce qu'il m'affiche "C". Pourquoi?
Comment faire pour que la classe C prenne en compte sa propre vaiable statique $nom?

Merci

Posté : 21 juin 2007, 17:41
par Hubert Roksor
"self" est toujours égal au nom de la classe dans lequel il est utilisé. Si mes souvenirs sont bons, on nous a promis un "this::$nom" pour faire ce que tu recherches.

Ah ben non, finalement je crois que ça va s'appeler "static::". Tu peux jeter un œil du côté de la mailling list des développeurs de PHP : http://marc.info/?t=117759966500016&r=1&w=2

Ça ne répond pas à ta question, mais au moins tu sais que c'est pas un bug, et que c'est probablement impossible :o

Posté : 21 juin 2007, 17:53
par ritpas
merci mais effectivement ça ne répond pas à ma question.
Comme je surcharge la variable $nom dans ma classe C, je m'attends à ce que le résultat m'affiche "C". Ca me semble logique sinon je ne vois pas enquoi servirait l'heritage ?

Ex : pour faire marcher mon code il faudrait que je réécrive la methode hello() dans ma classe C, dans ce cas il m'affichera "C". la methode est exactement la même ce ne devrait pas être nécessaire de la surcharger, le fait d'en hériter suffirait d'afficher "C". En fait, je crois que j'ai raté qq chose...je comprends pas.

Posté : 21 juin 2007, 18:20
par Hubert Roksor
Non, t'as rien raté, c'est juste impossible à l'heure actuelle. En PHP, les trucs statiques sont apparemment très "statiques".

D'ailleurs, j'ai eu une suprise en essayant un print_r(debug_backtrace()) dans la méthode hello(), en voyant que la classe utilisée pour l'appel à la méthode était A, et non C. En gros, il n'y a aucun moyen* de différencier A::hello() de C::hello() avec ton code actuel... Donc en gros tu vas devoir dupliquer la fonction ou revoir ton design. Désolé :|


* en fait si, on pourrait utiliser debug_backtrace() pour lire la ligne du source PHP, mais c'est vraiment pour l'anecdote parce que je n'imagine pas les performances du truc

Posté : 21 juin 2007, 18:27
par ritpas
He ben, la POO en PHP c'est pas encore ça :(

Bon il y a quand même la solution :
C::$nom="C"; qu'il va falloir mettre avant chaque appel C::hello();
Ca evite de réécrire la fonction ...

Merci