2010-06-22 15 views
8

¿Hay alguna forma, en PHP, para llamar a métodos de una clase padre usando el argumento arbitrario call_user_func_array? En esencia, quiero escribir un poco de código repetitivo que, aunque un poco menos óptimo, me deja invoco a los padres a un método arbitrariamente como esto:Usando call_user_function para acceder al método padre en PHP

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

Es este un truco extraño? Sí. Sin embargo, usaré esta repetición en muchos lugares, donde es probable que exista un error al transcribir correctamente el método, por lo que la compensación es para menos errores en general.

+0

Apuesto a que una construcción como esta sería más probable que cause errores, porque 'call_user_func_array' y sus amigos son algo mágicos. Algo me dice que probablemente haya una mejor solución, pero el problema no es lo suficientemente claro como para verlo. – Kris

Respuesta

-1

Puede llamar a cualquier método en una clase principal, siempre que no esté sobrecargado más cerca de la clase de la instancia. Sólo tiene que utilizar $this->methodName(...)

para la magia un poco más avanzado, aquí está un ejemplo práctico de lo que parece querer:

Tenga en cuenta que yo no creo que esto sea una buena 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); 

Básicamente, esto busca el método MathStuff::multiply en la tabla de búsqueda de métodos y ejecuta su código en los datos de instancia de una instancia DangerousCode.

20

Pruebe cualquiera de

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

o

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

... dependiendo de la versión de PHP. Los más antiguos tienden a colgarse ligeramente, cuidado :)

+1

[Ambos funcionarán en 'PHP 5.3 +'] (http://3v4l.org/sv4no). Sin embargo, en versiones anteriores (¡actualice su sistema!), Tiene que [1. establezca 'func_get_args' en una variable primero (y no directamente como' call_user_func_array (.., func_get_args()) ', y en segundo lugar, solo puede usar el primer ejemplo.] (http://3v4l.org/iCJ3e) – h2ooooooo

+0

Primer método ('array ($ this, 'parent ::'. __FUNCTION __)' conducirá a recursión infinita si se extiende desde la clase donde se usa 'call_user_func_array' para llamar al padre. Use el segundo método, funciona bien. – cronfy

Cuestiones relacionadas