Есть ли любой способ, в 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 правильно, таким образом, компромисс будет для меньшего количества ошибок в целом.
Вы можете вызвать любой метод родительского класса, если он не перегружен ближе к классу экземпляра. Просто используйте $ 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
.
Попробуйте один из вариантов
call_user_func_array(array($this, 'parent::' . __FUNCTION__), $args);
или
call_user_func_array(array('parent', __FUNCTION__), $args);
... в зависимости от вашей версии PHP. Старые, как правило, немного ломаются, осторожно :)