PHP反思:如何知道ReflectionMethod是否被继承?

时间:2012-02-27 20:34:48

标签: php reflection php-5.3

ReflectionMethod documentation中,我找不到任何要知道方法是从其父类继承还是在反射类中定义的方法。

编辑:我使用ReflectionClass::getMethods()。我想知道每个方法是否已在被反映的类中定义,或者是否已在父类中定义。最后,我想只保留当前类中定义的方法。

class Foo {
    function a() {}
    function b() {}
}

class Bar extends Foo {
    function a() {}
    function c() {}
}

我想保留ac

2 个答案:

答案 0 :(得分:5)

您应该可以调用ReflectionMethod::getDeclaringClass()来获取声明该方法的类。然后调用ReflectionClass::getParentClass()来获取父类。最后,对ReflectionClass::hasMethod()的调用将告诉您该方法是否在父类中声明。

示例:

<?php
class Foo {
    function abc() {}
}

class Bar extends Foo {
    function abc() {}
    function def() {}
}


$bar = new Bar();

$meth = new ReflectionMethod($bar, "abc");
$cls = $meth->getDeclaringClass();
$prnt = $cls->getParentClass();

if ($cls->hasMethod($meth->name)) {
    echo "Method {$meth->name} in Bar\n";
}
if ($prnt->hasMethod($meth->name)) {
    echo "Method {$meth->name} in Foo\n";
}

$meth = new ReflectionMethod($bar, "def");
$cls = $meth->getDeclaringClass();
$prnt = $cls->getParentClass();

if ($cls->hasMethod($meth->name)) {
    echo "Method {$meth->name} in Bar\n";
}
if ($prnt->hasMethod($meth->name)) {
    echo "Method {$meth->name} in Foo\n";
}

答案 1 :(得分:4)

您可以获取您感兴趣的方法的ReflectionMethod对象,然后使用getPrototype()获取父类中方法的ReflectionMethod。如果该方法没有覆盖父方法中的方法,则会抛出ReflectionClass异常。

以下示例代码将创建一个方法名为key的数组,以及定义用于反射类的实现的类。

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
)