使用call_user_function访问PHP中的父方法

时间:2010-06-22 18:17:00

标签: php polymorphism

在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时可能会出错,所以权衡是为了减少整体错误。

2 个答案:

答案 0 :(得分:25)

尝试其中一个

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

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

...取决于您的PHP版本。老年人往往会轻微崩溃,小心:)

答案 1 :(得分:-2)

您可以在父类上调用任何方法,只要它不会在靠近实例类的位置重载。只需使用$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实例的实例数据上执行其代码。