使用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
}
答案 0 :(得分:9)
使用ReflectionMethod::getPrototype
。
$foo = new \ReflectionMethod('Subclass', 'doFoo');
$declaringClass = $foo->getDeclaringClass()->getName();
$proto = $foo->getPrototype();
if($proto && $proto->getDeclaringClass()->getName() !== $declaringClass){
// overridden
}
如果类匹配,则不会被覆盖,否则就是。
或者,如果您知道两个类名,只需将$declaringClass
与其他类名进行比较。