PHP如何检查子类是否覆盖了超类的方法?

时间:2013-05-13 13:35:53

标签: php reflection

使用PHP,如果子类的方法是什么,如何确定子类是否覆盖了一个?

鉴于以下两个类:

class Superclass {
    protected function doFoo($data) {
        // empty
    }

    protected function doBar($data) {
        // empty
    }
}

class Subclass extends Superclass {
    protected function doFoo($data) {
        // do something
    }
}

如何将一个方法添加到Superclass中,该方法将根据覆盖的方法执行不同的操作?

例如:

if ([doFoo is overridden]) {
    // Perform an action without calling doFoo
}
if ([doBar is overridden]) {
    // Perform an action without calling doBar
}

1 个答案:

答案 0 :(得分:9)

使用ReflectionMethod::getPrototype

$foo = new \ReflectionMethod('Subclass', 'doFoo');

$declaringClass = $foo->getDeclaringClass()->getName();
$proto = $foo->getPrototype();

if($proto && $proto->getDeclaringClass()->getName() !== $declaringClass){ 
  // overridden
}

如果类匹配,则不会被覆盖,否则就是。


或者,如果您知道两个类名,只需将$declaringClass与其他类名进行比较。