Использование call_user_function для доступа к родительскому методу в PHP - PullRequest
10 голосов
/ 22 июня 2010

Есть ли в PHP способ вызывать методы из родительского класса, используя произвольный аргумент call_user_func_array? По сути, я хочу написать немного стандартного кода, который, хотя и будет несколько менее оптимальным, позволит мне вызывать родителя для метода произвольно подобного этому:

function childFunction($arg1, $arg2, $arg3 = null) {
    // I do other things to override the parent here...

    $args = func_get_args();
    call_user_func_array(array(parent, __FUNCTION__), $args); // how can I do this?
}

Это странный хак? Да уж. Я буду использовать этот шаблон во многих местах, хотя там, где есть вероятность ошибки при правильной расшифровке аргументов метода, так что компромисс заключается в меньшем количестве ошибок в целом.

Ответы [ 2 ]

26 голосов
/ 22 июня 2010

Попробуйте либо один из

call_user_func_array(array($this, 'parent::' . __FUNCTION__), $args);

или

call_user_func_array(array('parent', __FUNCTION__), $args);

... в зависимости от версии PHP.Старшие, как правило, терпят крах, осторожно:)

0 голосов
/ 22 июня 2010

Вы можете вызывать любой метод в родительском классе, если он не перегружен ближе к классу экземпляра.Просто используйте $this->methodName(...)

Для немного более продвинутой магии, вот рабочий пример того, что вы, кажется, хотите:

Обратите внимание, что я не считаю это хорошей идеей

class MathStuff
{
    public function multiply()
    {
        $total = 1;
        $args = func_get_args();
        foreach($args as $order => $arg)
        {
            $total = $total * $arg;
        }
        return $total;
    }
}
class DangerousCode extends MathStuff
{
    public function multiply()
    {
        $args = func_get_args();

        $reflector = new ReflectionClass(get_class($this));
        $parent = $reflector->getParentClass();
        $method = $parent->getMethod('multiply');
        return $method->invokeArgs($this, $args);
    }
}


$danger = new DangerousCode();
echo $danger->multiply(10, 20, 30, 40);

По сути, это ищет метод MathStuff::multiply в таблице поиска методов и выполняет его код на данных экземпляра из экземпляра DangerousCode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...