Znajdowanie pliku PHP (w czasie wykonywania), w którym zdefiniowano klasę

111

Czy w PHP jest jakaś refleksja / introspekcja / magia, która pozwoli ci znaleźć plik PHP, w którym zdefiniowano określoną klasę (lub funkcję)?

Innymi słowy, mam nazwę klasy PHP lub obiekt, którego instancja została utworzona. Chcę przekazać to do czegoś (funkcji, klasy odbicia itp.), Co zwróci ścieżkę systemu plików, w której zdefiniowano klasę.

/path/to/class/definition.php

Zdaję sobie sprawę, że mógłbym użyć ( get_included_files())aby uzyskać listę wszystkich plików, które zostały do ​​tej pory uwzględnione, a następnie przeanalizować je wszystkie ręcznie, ale to dużo dostępu do systemu plików za jedną próbę.

Zdaję sobie również sprawę, że mógłbym napisać dodatkowy kod w naszym mechanizmie __autoload, który gdzieś przechowuje te informacje. Jednak modyfikowanie istniejącego __autoload jest poza zasięgiem w sytuacji, o której myślę.

Słyszenie o rozszerzeniach, które to potrafią, byłoby interesujące, ale ostatecznie chciałbym coś, co można uruchomić w ramach instalacji „standardowej”.

Alan Storm
źródło
2
Magento przywiózł mnie tutaj: -]
Alan
@alan dobrze, aby zobaczyć tam pisownię nazw właściwości.
Alan Storm,

Odpowiedzi:

225

Próbować ReflectionClass

Przykład:

class Foo {}
$reflector = new \ReflectionClass('Foo');
echo $reflector->getFileName();

Zwróci to, falsegdy nie można znaleźć nazwy pliku, np. W klasach natywnych.

Gordon
źródło
10

W przypadku ReflectionClass w pliku z przestrzenią nazw dodaj przedrostek „\”, aby był globalny w następujący sposób:

$ reflector = new \ ReflectionClass ('FOO');

W przeciwnym razie wygeneruje błąd o treści ReflectionClass w niezdefiniowanej przestrzeni nazw. Nie miałem prawa komentować powyższej odpowiedzi, więc piszę to jako odpowiedź uzupełniającą.

Jevin
źródło
0

jeśli masz folder include, możesz uruchomić polecenie skryptu powłoki „grep” dla „class $ className”, wykonując polecenie: $filename = ``grep -r "class $className" $includesFolder/*\i zwróci to plik, w którym się znajduje. Poza tym nie sądzę, aby istniała jakakolwiek magia funkcja dla PHP, aby zrobić to za Ciebie.

Seaux
źródło
3
Szczera, nie-dupkowa ciekawość. Co sprawiło, że pomyślałeś, że ta odpowiedź była lepsza niż pomysł, który już rozważałem i odrzuciłem? „Zdaję sobie sprawę, że mógłbym użyć funkcji (get_included_files ()), aby uzyskać listę wszystkich plików, które zostały do ​​tej pory uwzględnione, a następnie przeanalizować je wszystkie ręcznie, ale to dużo dostępu do systemu plików za jedną próbę”.
Alan Storm,
ponieważ jest to jedna linia, w przeciwieństwie do liczby linii potrzebnych do napisania parsera w PHP, a funkcja grep jest skompilowana w C, jak sądzę, i prawdopodobnie znacznie szybciej niż cokolwiek, co byłoby napisane.
Seaux
Ach, rozumiem. Moim prawdziwym zmartwieniem był wielokrotny dostęp do dysku do każdego z plików, aby to zrobić (jest to coś, co będzie się często działo w narzędziu, które buduję), a nie ilość kodu, który spróbuję wyjaśnić w następnej kolejności czas. (FYI: Powinieneś zajrzeć do środka. Jest o wiele lepszy niż grep!)
Alan Storm
Ack czy awk? Uwielbiam awk, w rzeczywistości jest to mój ulubiony język programowania, ale więcej osób regularnie używa grepa… jego „czystsze” rzeczy są tak proste
Seaux
Nie awk, Ack: betterthangrep.com Jest to zamiennik grepa z powrotem Perl, zoptymalizowany pod kątem projektów opartych na kodzie wyszukiwania. Wspaniale.
Alan Storm,