Aller au contenu

PHP5 : Héritage et variables statiques ?


Sujets conseillés

Posté

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 !

Posté

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.

Posté

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 !

Posté

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.

Posté (modifié)

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
Posté

une méthode uniquement destinée à accéder à une des propriétés de ta classe.

Posté (modifié)

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

Veuillez vous connecter pour commenter

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



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