J'ai une super-classe PHP abstraite, qui contient du code qui doit connaître la sous-classe dans laquelle elle s'exécute.PHP get_called_class() alternative
class Foo {
static function _get_class_name() {
return get_called_class();
//works in PHP 5.3.*, but not in PHP 5.2.*
}
static function other_code() {
//needs to know
echo self::_get_class_name();
}
}
class Bar extends Foo {
}
class FooBar extends Foo {
}
Bar::other_code(); // i need 'Bar'
FooBar::other_code(); // i need 'FooBar'
Cela fonctionnerait si j'ai appelé la fonction get_called_class()
- cependant, ce code va être exécuté dans la version PHP 5.2 *, de sorte que la fonction est disponible..
Il y a quelques implémentations PHP personnalisé de get_called_class()
là-bas, mais ils dépendent tous d'aller à travers le debug_backtrack()
, l'analyse d'un nom de fichier & numéro de la ligne et l'exécution d'un regex (comme le codeur ne sait pas que PHP 5.2 a la réflexion) à trouve le nom de la classe. Ce code doit pouvoir être exécuté avec php, ie. non seulement à partir d'un fichier .php. (Il doit fonctionner à partir d'un shell php -a
ou d'une instruction eval()
.)
Idéalement, une solution fonctionnerait sans nécessiter l'ajout de code aux sous-classes ... La seule solution potentielle que je puisse voir est d'ajouter le code suivant à chaque sous-classe, ce qui est évidemment un hack dégoûtant:
class FooBar extends Foo {
static function _get_class_name() {
return 'FooBar';
}
}
EDIT: Attendez, cela ne semble même pas travailler. Ça aurait été mon dernier recours. Quelqu'un peut-il penser à quelque chose de similaire à cette solution qui me donnerait la fonctionnalité requise. C'est à dire, je suis prêt à accepter une solution qui m'oblige à ajouter une fonction ou une variable à chaque sous-classe en lui disant ce que son nom de classe est. Malheureusement, il semble que l'appel self::_get_class_name()
de la superclasse appelle l'implémentation de la classe parente, même si la sous-classe l'a surchargée.
Votre meilleure solution, honnêtement, est la mise à niveau 5.3. – Charles
Je sais, mais malheureusement, ce n'est pas une option. –
et comment faisons-nous cela en Java? –