PHP5 : Héritage et variables statiques ?

PHP5 : Héritage et variables statiques ? - PHP - Programmation

Marsh Posté le 11-04-2007 à 11:13:14    

Bonjour,
 
Ne m'étant lancé que récemment dans les fonctionnalités objet de PHP5, j'y découvre de nombreux atouts mais forcément, je me vois confronté à quelques hics... En voici donc un qui m'importune particulièrement !
 
Tout d'abord, le code :

Code :
  1. class Papa {
  2. protected static $variable_genante = 'Papa';
  3. public function affiche () {
  4.  echo self::$variable_genante;
  5. }
  6. }
  7. class Fiston extends Papa {
  8. protected static $variable_genante = 'Fiston';
  9. }
  10. $t = new Fiston;
  11. $t -> affiche();


 
Ce code affiche "Papa" alors que j'aurais beaucoup apprécié qu'il m'affiche poliment "Fiston"... Bien sûr, je me doute que l'erreur est due à l'utilisation du mot clef "self" dans la classe Papa, qui n'est pas réinterprété lors de l'héritage et qui désigne donc toujours la classe "Papa" lors de l'appel à la fonction affiche() depuis une instance de Fiston !
 
Je pourrais parfaitement contourner ce problème en utilisant des variables non statiques, sauf qu'éthiquement parlant, ça me fait mal au coeur : en effet, ces variables ont pour vocation de ne pas être instanciées puisqu'elles dépendent uniquement de la classe !
 
L'autre solution serait de réécrire la fonction affiche() mot pour mot dans Fiston, mais là aussi ce serait bien moche, car en réalité, elle est de taille conséquente et Fiston n'est pas la seule classe héritant de Papa...
 
J'en viens donc à ma question : comment faire ? :D  
 
Merci d'avance pour vos réactions !

Reply

Marsh Posté le 11-04-2007 à 11:13:14   

Reply

Marsh Posté le 11-04-2007 à 12:53:35    

ZeBrian a écrit :

L'autre solution serait de réécrire la fonction affiche() mot pour mot dans Fiston, mais là aussi ce serait bien moche, car en réalité, elle est de taille conséquente et Fiston n'est pas la seule classe héritant de Papa...

tu peux peut être réécrire juste une partie puis appeler parent::affiche() ?

Reply

Marsh Posté le 11-04-2007 à 12:55:27    

En effet, c'est ce que je pense faire...
 
Apparemment, PHP5 a encore quelques lacunes niveau objet, dont celle-ci !


Message édité par ZeBrian le 11-04-2007 à 12:56:20
Reply

Marsh Posté le 12-04-2007 à 11:13:11    

C'est tout à fait normal !
 
http://fr.php.net/manual/fr/language.oop5.static.php
 
Pour contourner ça, y'a peut être plus propre mais là je vois que ça:

Code :
  1. class Papa {
  2.           protected static $variable_genante = 'Papa';
  3.           public function affiche () {
  4.                  $class=get_class($this);
  5.                  eval("\$var=$class::\$variable_genante;" );
  6.                  echo $var;
  7.           }
  8.       }
  9.       class Fiston extends Papa {
  10.           protected static $variable_genante = 'Fiston';
  11.       }
  12. $t = new Fiston;
  13. $t -> affiche();

Reply

Marsh Posté le 12-04-2007 à 11:14:50    

Merci leflos5, j'avais justement trouvé une solution très similaire mais j'avais la flemme de l'expliquer :D

Reply

Marsh Posté le 12-04-2007 à 11:58:07    

et à la place du eval, ${$class}::$variable_genante; ça marcherait?

Reply

Marsh Posté le 12-04-2007 à 12:01:27    

Malheureusement non, après une multitude d'essais, on ne peut pas utiliser une chaîne pour désigner le nom d'une classe !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed