Aller au contenu

PHP5 : Héritage et variables statiques ?


ZeBrian

Sujets conseillés

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 :

class Papa {
protected static $variable_genante = 'Papa';
public function affiche () {
echo self::$variable_genante;
}
}

class Fiston extends Papa {
protected static $variable_genante = 'Fiston';
}

$t = new Fiston;
$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...

J'en viens donc à ma question : comment faire ? :P

Merci d'avance pour vos réactions !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Il faut réécrire la méthode affiche(). Il n'y a rien de moche à ça ;), intuitivement c'est ce qu'il y a de plus logique.

Pour faire plus élégant, tu peux peut-être éviter l'héritage, et faire implémenter une même interface à tes 2 classes. Interface dans laquelle tu définiras tes méthodes communes.

Lien vers le commentaire
Partager sur d’autres sites

En réalité, la fonction affiche() fait plus de 50 lignes et j'ai 4-5 classes qui doivent l'inclure avec pour chacune des variables statiques de valeurs différentes... S'il me faut un jour modifier légèrement la fonction affiche() - ce que je devrai forcément faire - j'aurai 5 classes à modifier !

Lien vers le commentaire
Partager sur d’autres sites

Une méthode de 50 lignes, ça c'est moche ;). Dans l'absolu une méthode doit réaliser une action unique. Tu dois pouvoir extraire un assesseur pour ta variable static.

Lien vers le commentaire
Partager sur d’autres sites

En effet j'ai un peu exagéré, elle fait 20 lignes bien aérées ^^

Sinon, qu'est-ce qu'un "assesseur" ?

Modifié par ZeBrian
Lien vers le commentaire
Partager sur d’autres sites

OK je pense que je vais faire comme ça :)

Merci à toi !

EDIT : J'ai trouvé une autre manière de faire, avec un petit appel à la fonction eval qui permet d'éviter de recopier la fonction :)

class Papa {
protected static $variable_genante = 'abc';
public static function affiche ($name = 'self') {
eval('echo '.$name.'::$variable_genante;');
}
}

class Fiston extends Papa {
protected static $variable_genante = 'def';
public static function affiche () {
parent::affiche('Fiston');
}
}

Fiston::affiche();

Modifié par ZeBrian
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...