在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时可能会出错,所以权衡是为了减少整体错误。
答案 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
实例的实例数据上执行其代码。