Используя call_user_function для доступа к родительскому методу в PHP

Есть ли любой способ, в 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?
}

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

10
задан Kara 15 January 2014 в 17:02
поделиться

2 ответа

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

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

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

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 .

-2
ответ дан 3 December 2019 в 16:29
поделиться

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

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

или

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

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

27
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: