2010-06-22 14 views
8

Czy istnieje sposób, w PHP, wywoływania metod z klasy nadrzędnej za pomocą argumentu arbitralnego call_user_func_array? Zasadniczo chcę napisać trochę kodu boilerplate że chociaż nieco mniej optymalne, pozwolą mi powołać rodzica jest sposób arbitralny tak:Używanie funkcji call_user_function do uzyskiwania dostępu do metody nadrzędnej w 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? 
} 

Czy to dziwne Hack? Tak. Będę korzystał z tej tablicy w wielu miejscach, gdzie prawdopodobnie wystąpi błąd w przepisywaniu poprawnie metod, więc kompromis jest mniejszy niż ogólny błąd.

+0

Założę się, że taka konstrukcja może powodować błędy, ponieważ 'call_user_func_array' i przyjaciele są nieco magiczni. Coś mi mówi, że prawdopodobnie jest lepsze rozwiązanie, ale problem nie jest dla mnie wystarczająco jasny, by to zobaczyć. – Kris

Odpowiedz

-1

Możesz wywołać dowolną metodę na klasie nadrzędnej, o ile nie jest ona przeładowana bliżej klasy instancji. Wystarczy użyć $this->methodName(...)

Dla nieco bardziej zaawansowanej magii, oto przykład pracy, co wydaje się chcieć:

Należy pamiętać, że nie wierzę, że jest to dobry pomysł

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); 

Zasadniczo to wyszukuje metodę MathStuff::multiply w tabeli wyszukiwania metod i wykonuje jej kod na danych instancji z instancji DangerousCode.

20

Spróbuj jednej z

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

lub

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

... w zależności od wersji PHP. Starsze mają tendencję do niewielkich awarii, ostrożność :)

+1

[Oba będą działały w PHP 5.3 + '] (http://3v4l.org/sv4no). Jednak w starszych wersjach (zaktualizuj swój system!), Musisz [1. najpierw ustaw zmienną 'func_get_args' na zmienną (a nie bezpośrednio jako' call_user_func_array (.., func_get_args()) 'i po drugie możesz użyć tylko pierwszego przykładu.] (http://3v4l.org/iCJ3e) – h2ooooooo

+0

Pierwsza metoda ('array ($ this, 'parent ::'. __FUNCTION __)') doprowadzi do nieskończonej rekursji, jeśli rozszerzysz z klasy, w której użyjesz 'call_user_func_array' do wywołania metody parent, używając drugiej metody, działa ona poprawnie. – cronfy

Powiązane problemy