surcharge des methodes statiques en php

Eléphant du PHP | 59 Messages

21 juin 2007, 17:34

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

21 juin 2007, 17:41

"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

Eléphant du PHP | 59 Messages

21 juin 2007, 17:53

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.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

21 juin 2007, 18:20

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

Eléphant du PHP | 59 Messages

21 juin 2007, 18:27

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