2011-08-11 15 views
44

Czy mogę programowo uzyskać kod funkcji według jej nazwy?rekonstrukcja/pobranie kodu funkcji php

odczuwalna:

function blah($a, $b) { return $a*$b; } 
echo getFunctionCode("blah"); 

jest to możliwe?

Czy istnieją funkcje samopisujące php do rekonstrukcji kodu funkcji/klasy?
(średnia zamiast się kod źródłowy prawo z pliku sources)

W Javie nie istnieje: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

W PHP:
get_class_methods()
typeof
ReflectionFunction (dzięki Alin Purcaru)

+3

dlaczego te downvotes? –

+2

Nie jestem pewien, dlaczego to pytanie zostało odrzucone. Znalazłem to całkiem interesujące. –

+1

@Marek, Martin Prawdopodobnie z powodu ** bardzo nieuprzejmej uwagi Marek pozostawił naiwną odpowiedź Julesa. –

Odpowiedz

61

Rozszerzenie na sugestię wykorzystania ReflectionFunction, można użyć coś takiego:

$func = new ReflectionFunction('myfunction'); 
$filename = $func->getFileName(); 
$start_line = $func->getStartLine() - 1; // it's actually - 1, otherwise you wont get the function() block 
$end_line = $func->getEndLine(); 
$length = $end_line - $start_line; 

$source = file($filename); 
$body = implode("", array_slice($source, $start_line, $length)); 
print_r($body); 
+4

Erm ... To nie jest "rozszerzanie". To "wdrażanie". –

+1

Dobrze, chciałem zwrócić uwagę, że istnieją funkcje zwracające nazwę pliku i linie źródłowe (np .: brak parsowania), ale wspomniano o "rozwijaniu", ponieważ już wskazałeś na klasy odbicia. Jak zauważyłeś, interfejs API jest słabo udokumentowany, więc kod ułatwia to. –

+0

@MarekSebera nie chodzi o to, kto pierwszy, to o odpowiedź której użyłeś, dla rekordu – Ascherer

17

Nie ma niczego, co da ci rzeczywisty kod funkcji. Jedyną rzeczą zbliżoną do dostępnej jest klasa ReflectionFunction. Dla klas masz ReflectionClass, który daje członkom klasy (stałe, zmienne i metody) i ich widoczność, ale wciąż nie ma rzeczywistego kodu.


Obejście (to wiązać odczytu pliku źródłowego):
Zastosowanie ReflectionFunction::export aby dowiedzieć się nazwę pliku i odstęp wiersza, w którym funkcja jest zadeklarowana, a następnie odczytać zawartość z tego pliku na tych liniach. Użyj przetwarzania ciągów, aby uzyskać wartości między pierwszym { a ostatnim.

Uwaga: Interfejs API Reflection jest słabo udokumentowany.

+0

miło obejść, poświęcę temu trochę czasu, aby inni użytkownicy mogli wziąć udział przed sprawdzeniem odpowiedzi jako zaakceptowany –