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

时间:2010-06-15 15:32:13

标签: php

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

public function func() {
    if (function_exists('parent::func')) {
        return parent::func();
    }
}

但是function_exists永远不会计算为true。

3 个答案:

答案 0 :(得分:26)

public function func() 
{
    if (is_callable('parent::func')) {
        parent::func();
    }
}

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

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

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);
    }
}

像这样使用它:

callParentMethod($this, __CLASS__, __FUNCTION__, func_get_args());

答案 1 :(得分:5)

这样做的方法是:

if (method_exists(get_parent_class($this), 'func')) {
    // method exist
} else {
   // doesn't
}

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

答案 2 :(得分:0)

<?php
class super {
    public function m() {}
}

class sub extends super {
     public function m() {
        $rc = new ReflectionClass(__CLASS__);
        $namepc = $rc->getParentClass()->name;
        return method_exists($namepc, __FUNCTION__);
    }
}

$s = new sub;
var_dump($s->m());

给出bool(true)。如果方法是在super的超类中定义的,那么不确定这是否有效,但这将是一个引入简单循环的问题。