ZeBrian Posté 11 Avril 2007 Posté 11 Avril 2007 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 ? Merci d'avance pour vos réactions !
dièse Posté 11 Avril 2007 Posté 11 Avril 2007 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.
ZeBrian Posté 11 Avril 2007 Auteur Posté 11 Avril 2007 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 !
dièse Posté 11 Avril 2007 Posté 11 Avril 2007 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.
ZeBrian Posté 11 Avril 2007 Auteur Posté 11 Avril 2007 (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é 11 Avril 2007 par ZeBrian
dièse Posté 11 Avril 2007 Posté 11 Avril 2007 une méthode uniquement destinée à accéder à une des propriétés de ta classe.
ZeBrian Posté 11 Avril 2007 Auteur Posté 11 Avril 2007 (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é 11 Avril 2007 par ZeBrian
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant