2011-07-21 12 views
5

Jeśli połączenie zostanie dokonane do metody niezdefiniowanej w klasie, magiczna metoda może __call przechwycić rozmowę, więc mogłem poradzić sobie z sytuacją jak widzę pasuje: http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methodsCzy istnieje funkcja taka jak magiczna metoda __call() dla globalnego zasięgu w php?

Czy istnieje jakiś mechanizm przewidziany w php przy czym ja może zrobić to samo z funkcjami o zasięgu globalnym. Punktem najlepiej ilustruje z kodem:

<?php 
    function return_some_array(){ 
     $a = array(); 
     //Do stuff to array 
     return array(); 
    } 

    // Now i call the function like so: 
    $give_me_array = return_some_array(); 

    // But sometimes I want the array to not contain zeroes, nulls etc. 
    // so I call: 
    $give_me_array_filtered = return_some_array_filtered(); 

    // But i haven't defined return_some_array_filtered() anywhere. 
    // Instead I would like to do something like so: 
    function __magic_call($function_name_passed_automatically){ 
     preg_match('/(.*)_filtered$/', $function_name_passed_automatically, $matches); 
     $function_name_that_i_defined_earlier_called_return_some_array = $matches[1]; 
     if($matches){ 
     $result = call_user_func($function_name_that_i_defined_earlier_called_return_some_array); 
     $filtered = array_filter($result); 
     return $filtered; 
     } 
    } 

    //So now, I could call return_some_other_array_filtered() and it would work provided I had defined return_some_other_array(). 
    //Or even Donkey_filtered() would work, provided I had defined Donkey() somewhere. 
    ?> 

Czy to w ogóle możliwe?

Odpowiedz

1

Nie jako taki.

Jeśli utworzyłeś statyczną metodę, taką jak return_some_array_filtered :: go(), możesz użyć funkcji PHP5's autoload() do dynamicznego tworzenia klasy i metody. Po utworzeniu połączenie będzie kontynuowane jak zwykle. Może chcesz zaimplementować tę klasę na callStatic(). Uważaj, dynamicznie tworząc klasę od zera (bez include()) w PHP jest nietrywialny.

+0

Dzięki! Myślę, że spróbuję. –

+0

@ V-A To oczywiście dość marnotrawny i niepotrzebnie hackowski sposób robienia rzeczy. Powinieneś definiować i wywoływać swoje funkcje w normalny sposób. – deceze

+0

Inna uwaga: czy uważasz, że można to zaimplementować jako rozszerzenie? Wyobrażam sobie, że byłoby to dość proste? –

Powiązane problemy