在调用之前检查是否存在重写的父方法

Nat*_*gar 18 php

在调用之前,如何确保覆盖的父方法存在?
我试过这个:

public function func() {
    if (function_exists('parent::func')) {
        return parent::func();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,function_exists永远不会计算为true.

Oli*_*nig 27

public function func() 
{
    if (is_callable('parent::func')) {
        parent::func();
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用它来调用父构造函数,如果存在,工作正常.

我还使用以下作为通用版本:

public static function callParentMethod(
    $object,
    $class,
    $methodName,
    array $args = []
) {
    $parentClass = get_parent_class($class);
    while ($parentClass) {
        if (method_exists($parentClass, $methodName)) {
            $parentMethod = new \ReflectionMethod($parentClass, $methodName);
            return $parentMethod->invokeArgs($object, $args);
        }
        $parentClass = get_parent_class($parentClass);
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样用它:

callParentMethod($this, __CLASS__, __FUNCTION__, func_get_args());
Run Code Online (Sandbox Code Playgroud)

  • `if (is_callable('parent::func'))parent::func();` 解决方案很棒,如果 C 扩展 B 并且 B 扩展 A 并且 C::Foo 检查parent::Bar 并且 Bar 声明在A 但不在 B 中,它仍然按预期工作。 (2认同)

Mik*_*ike 7

这样做的方法是:

if (method_exists(get_parent_class($this), 'func')) {
    // method exist
} else {
   // doesn't
}
Run Code Online (Sandbox Code Playgroud)

http://php.net/manual/en/function.method-exists.php
http://php.net/manual/en/function.get-parent-class.php

  • 在那种情况下,我不确定你要做什么.也许你可以将它与get_parent类结合起来 - 类似这样:method_exists(get_parent_class($ this),'func')我可能正在咆哮错误的树. (6认同)