views:

24

answers:

3

Is there any way, in PHP, to call methods from a parent class using the arbitrary-argument call_user_func_array? Essentially, I want to write a little bit of boilerplate code that, while slightly less optimal, will let me invoke the parent to a method arbitrarily like this:

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?
}

Is this an odd hack? Yeah. I will be using this boilerplate in many places, though, where there's likely to be error in transcribing the method args properly, so the tradeoff is for fewer bugs overall.

Thanks!

A: 

PHP's reflection class might get you the information you need. Specifically http://www.php.net/manual/en/reflectionclass.getparentclass.php

threendib
+1  A: 

Try either one of

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

or

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

... depending on your PHP version. Older ones tend to crash slightly, careful :)

Denis 'Alpheus' Čahuk
A: 

You can call any method on a parent class, as long as it is not overloaded closer to the class of the instance. Just use $this->methodName(...)

For slightly more advanced magic, here's a working example of what you seem to want:

Please note that i do not believe this to be a good 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);

Basically, this looks up the method MathStuff::multiply in the method lookup table, and executes its code on instance data from a DangerousCode instance.

Kris