У меня есть суперкласс Abstract 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()
из суперкласса вызывает реализацию родительского класса, даже если подкласс переопределил его.