Проверка наличия переопределенного родительского метода до его вызова

Как я могу гарантировать, что переопределенный родительский метод существует до того, как я его назову?
Я пробовал это:

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

Однако функция_exists никогда не оценивает значение true.

Ответы

Ответ 2

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

Ответ 3

<?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, но это будет вопрос введения простого цикла.