我有一个抽象 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
shell 或eval()
语句中工作。)
理想情况下,一个解决方案不需要向子类中添加任何代码就可以工作……我能看到的唯一可能的解决方案是将以下代码添加到每个子类中,这显然是一个令人作呕的 hack:
class FooBar extends Foo {
static function _get_class_name() {
return 'FooBar';
}
}
编辑:等等,这似乎不起作用。这将是我最后的手段。任何人都可以想到与此解决方案类似的东西,它可以为我提供所需的功能。即,我愿意接受一种解决方案,该解决方案需要我向每个子类添加一个函数或变量,告诉它它的类名是什么。不幸的是,从超类调用似乎self::_get_class_name()
调用了父类的实现,即使子类已经覆盖了它。