Guest azazel Posté 7 Octobre 2004 Posté 7 Octobre 2004 Hello - Soit le code : abstract class foo { private __construct() {} public static getInstance() { static $instance = null; if (is_null($instance) == false) return $instance; else { $class = __CLASS__; return new $class(); } } } class extendedFoo extends foo { ... } $instance = extendedFoo::getInstance(); echo (get_class($instance)); Je souhaiterai que le get_class() me revoie extendedFoo. Or, il me renvoit foo. L'objet créé via new dans foo::getInstance n'est donc pas du bon type, car __CLASS__ contient "foo" et pas "extendedFoo". Quelqu'un sait il comment récupéré le nom de la classe qui a appelé la fonction statique ??? A+
Ganf Posté 7 Octobre 2004 Posté 7 Octobre 2004 Quelqu'un sait il comment récupéré le nom de la classe qui a appelé la fonction statique ??? On ne peut pas(*). Si tu veux faire ça il te faut faire une déclaration statique dan ta classe fille aussi. D'ailleurs si tu réfléchis bien ça n'a aucun sens de toutes façons : si ton truc avec __CLASS__ marchait, l'objet Foo et l'objet ExtendedFoo stockeraient tous les deux leur instance dans foo::getInstance(). Si tu as les classes extendedFoo et extendedFoo2, tu ne pourrais pas avoir une instance de chaque (vu qu'elles sont toutes les deux stockées dans une variable unique de la classe mère). D'ailleurs pendant qu'on y est, ta variable statique devrait plutot être au niveau de la classe qu'au niveau de la méthode. (*) : à vrai dire on peut, il faut ouvrir la trace avec debug_backtrace() et récupérer les différents appels, mais bon, ce n'est pas fait pour.
Guest azazel Posté 7 Octobre 2004 Posté 7 Octobre 2004 La variable statique est là pour l'exemple (je suis d'accord que ca fait au final un exemple stupide, j'avais pas tilté). En fait, l'instance est stockée en session sous un nom qui est (ou plutot qui devrait être :-() le nom de la classe appelant la fonction statique. Avec ce système, chaque classe héritant de foo a bien sa propre instance. Et ca evite de dupliquer la fonction dans toutes les sous-classes. Sauf que ca marche pas parce qu'il n'y a pas moyen de récupérer le nom de la classe appelante... A+
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant