你可以得到你所感兴趣的方法ReflectionMethod
对象,然后用getPrototype()
得到父类的方法ReflectionMethod
。如果该方法不覆盖父级中的方法,则会抛出异常。
下面的示例代码将创建一个数组,其中包含方法名称作为键以及定义用于反射类的实现的类。
class Base {
function basemethod() {}
function overridein2() {}
function overridein3() {}
}
class Base2 extends Base {
function overridein2() {}
function in2only() {}
function in2overridein3() {}
}
class Base3 extends Base2 {
function overridein3() {}
function in2overridein3() {}
function in3only() {}
}
$rc = new ReflectionClass('Base3');
$methods = array();
foreach ($rc->getMethods() as $m) {
try {
if ($m->getPrototype()) {
$methods[$m->name] = $m->getPrototype()->class;
}
} catch (ReflectionException $e) {
$methods[$m->name] = $m->class;
}
}
print_r($methods);
这将打印:
Array
(
[overridein3] => Base
[in2overridein3] => Base2
[in3only] => Base3
[overridein2] => Base
[in2only] => Base2
[basemethod] => Base
)
什么是你想达到什么目的? – 2012-02-27 20:37:31
我想知道一个方法是从父类继承还是在“反映”类中定义(即没有继承)。你不明白的是什么? – 2012-02-27 20:43:58
@Matthieu:你必须要这样做 - 有一个原因 - 你的最终目标是什么?我不太熟悉Reflection API,但是你甚至能够访问只在父类中定义的方法吗? – 2012-02-27 20:45:00