【发布时间】:2011-03-30 17:40:09
【问题描述】:
我有一个抽象 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.* 中运行,因此该函数不可用。
那里有一些get_called_class() 的自定义 PHP 实现,但它们都依赖于通过 debug_backtrack(),解析文件名和行号,并运行正则表达式(因为编码人员不知道 PHP 5.2 有反射)来找到类名。此代码需要能够使用 php 运行,即。不仅来自 .php 文件。 (它需要在 php -a shell 或 eval() 语句中工作。)
理想情况下,一个解决方案不需要向子类添加任何代码就可以工作......我能看到的唯一可能的解决方案是将以下代码添加到每个子类,这显然是一个令人作呕的黑客:
class FooBar extends Foo {
static function _get_class_name() {
return 'FooBar';
}
}
编辑:等等,这似乎不起作用。这将是我最后的手段。任何人都可以想到与此解决方案类似的东西,它可以为我提供所需的功能。即,我愿意接受一个解决方案,该解决方案需要我向每个子类添加 一个 函数或变量,告诉它它的类名是什么。不幸的是,从超类调用self::_get_class_name() 似乎调用了父类的实现,即使子类已经覆盖了它。
【问题讨论】:
-
老实说,您最好的解决方案是升级到 5.3。
-
我知道,但不幸的是,这不是一个选择。
-
我们如何在 java 中做到这一点?
标签: php oop inheritance php-5.2