Пошук файлу PHP (під час виконання), де визначено клас


111

Чи є відображення / самоаналіз / магія в PHP, які дозволять вам знайти файл PHP, де визначений конкретний клас (або функція)?

Іншими словами, у мене є ім'я класу PHP або об'єкт, що створюється. Я хочу передати це до чогось (функції, класу Reflection тощо), який би повернув шлях до файлової системи там, де був визначений клас.

/path/to/class/definition.php

Я усвідомлюю, що міг би скористатися ( get_included_files())щоб отримати список усіх включених до цього часу файлів, а потім проаналізувати їх усі вручну, але це дуже багато доступу до файлової системи за одну спробу.

Я також усвідомлюю, що можу написати якийсь додатковий код у нашому механізмі __autoload, який десь кешує цю інформацію. Однак зміна існуючого __autoload є поза межами ситуації, про яку я маю на увазі.

Слухати про розширення, які можуть це зробити, було б цікаво, але я в кінцевому підсумку хотів би щось, що може працювати на "запасі".


2
Магенто привів мене сюди: -]
Алан

@alan приємно побачити там якесь правопис назви власності.
Алан Шторм

Відповіді:


225

Спробуйте ReflectionClass

Приклад:

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

Це повернеться, falseколи ім'я файлу неможливо знайти, наприклад, у рідних класах.


10

Для ReflectionClass у файл з простором імен додайте префікс "\", щоб він став глобальним таким чином:

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

Або ж це призведе до помилки зазначеного ReflectionClass у просторі імен, не визначеному. Я не мав прав коментувати вищезгадану відповідь, тому пишу це як додаткову відповідь.


0

якщо у вас була папка include, ви можете запустити команду скрипта оболонки для "grep" для "class $ className", зробивши: $filename = ``grep -r "class $className" $includesFolder/*\і вона поверне файл, у якому він був. функція для PHP зробити це для вас.


3
Чесна, неприступна цікавість тут. Що змусило вас подумати, що ця відповідь була кращою за ідею, яку я вже розглядав і відкидав? "Я розумію, що міг би (get_included_files ()) отримати список усіх включених до цього часу файлів, а потім розібрати їх усі вручну, але це дуже багато доступу до файлової системи для однієї спроби."
Алан Шторм

тому що його один рядок, на відміну від скільки б рядків не знадобилося, щоб написати парсер в PHP, і функція grep збирається C, я думаю, і, швидше за все, набагато швидше, ніж все, що було б написано.
Seaux

Ах, зрозумів. Моє справжнє занепокоєння - це повторний доступ до диска до кожного з файлів знову і знову, щоб зробити це (це щось, що трапиться багато в інструменті, який я будую), а не кількість коду, я спробую зробити це зрозумілішим далі час. (FYI: Ви повинні розібратися. Це краще, ніж греп!)
Alan Storm

хек або awk? Я люблю awk, це фактично моє улюблене мовлення програмування, але більшість людей регулярно використовують греп ... його "чистіший" для цього простого матеріалу
Seaux

Not awk, ack: betterthangrep.com Це заміна греп-версії , яка оптимізована для проектів на основі коду пошуку. Це чудово.
Алан Шторм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.