Using call_user_function to access parent method in PHP
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 o开发者_JAVA技巧f 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.
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 :)
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.
精彩评论