У меня есть абстрактный суперкласс PHP, который содержит код, который должен знать, какой подкласс работает под ним.
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'
Это будет работать, если я вызову функцию get_called_class()
- однако этот код будет запущен в PHP версии 5.2. *, поэтому функция недоступна.
Там есть некоторые пользовательские реализации PHP get_called_class()
, но все они полагаются на переход через debug_backtrack()
, анализ имени файла и номера строки и запуск регулярного выражения (поскольку кодер не знает, что PHP 5.2 имеет отражение), чтобы найти имя класса. Этот код должен быть запущен с php, т.е. не только из файла .php. (Он должен работать из оболочки php -a
или оператора eval()
.)
В идеале решение будет работать без необходимости добавления какого-либо кода в подклассы... Единственное возможное решение, которое я вижу, - это добавить следующий код в каждый подкласс, что, очевидно, является отвратительным взломом:
class FooBar extends Foo {
static function _get_class_name() {
return 'FooBar';
}
}
РЕДАКТИРОВАТЬ: Подождите, это даже не работает. Это было бы моим последним прибежищем. Может ли кто-нибудь подумать о чем-то подобном этому решению, которое обеспечило бы мне необходимую функциональность. Т.е., я готов принять решение, которое требует от меня добавить одну функцию или переменную в каждый подкласс, рассказывая ей, что такое его имя класса. К сожалению, кажется, что вызов self::_get_class_name()
из суперкласса вызывает реализацию родительского класса, даже если подкласс его переопределил.