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”.


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.


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ą.


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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.