Menemukan File PHP (pada waktu proses) di mana Kelas Didefinisikan

111

Apakah ada refleksi / introspeksi / keajaiban dalam PHP yang akan memungkinkan Anda menemukan file PHP di mana kelas (atau fungsi) tertentu didefinisikan?

Dengan kata lain, saya memiliki nama kelas PHP, atau objek yang dipakai. Saya ingin meneruskan ini ke sesuatu (fungsi, kelas Refleksi, dll.) Yang akan mengembalikan jalur sistem file tempat kelas itu didefinisikan.

/path/to/class/definition.php

Saya menyadari bahwa saya dapat menggunakan ( get_included_files())untuk mendapatkan daftar semua file yang telah disertakan sejauh ini dan kemudian mengurai semuanya secara manual, tetapi itu banyak akses sistem file untuk satu upaya.

Saya juga menyadari bahwa saya dapat menulis beberapa kode tambahan dalam mekanisme __autoload kami yang menyimpan informasi ini di suatu tempat. Namun, mengubah __autoload yang ada adalah terlarang dalam situasi yang saya pikirkan.

Mendengar tentang ekstensi yang dapat melakukan hal ini akan menarik, tetapi pada akhirnya saya ingin sesuatu yang dapat berjalan pada pemasangan "stok".

Alan Storm
sumber
2
Magento membawaku ke sini: -]
Alan
@alan bagus untuk melihat beberapa nama properti dieja di sana.
Alan Storm

Jawaban:

225

Mencoba ReflectionClass

Contoh:

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

Ini akan dikembalikan falseketika nama file tidak dapat ditemukan, misalnya pada kelas asli.

Gordon
sumber
10

Untuk ReflectionClass dalam file dengan namespace , tambahkan awalan "\" untuk membuatnya global sebagai berikut:

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

Atau yang lain, itu akan menghasilkan kesalahan kata ReflectionClass di namespace tidak ditentukan. Saya tidak berhak memberikan komentar untuk jawaban di atas, jadi saya menulis ini sebagai jawaban pelengkap.

Jevin
sumber
0

jika Anda memiliki folder termasuk, Anda dapat menjalankan perintah skrip shell ke "grep" untuk "class $ className" dengan melakukan: $filename = ``grep -r "class $className" $includesFolder/*\dan itu akan mengembalikan file mana itu masuk Selain itu, saya tidak berpikir ada keajaiban fungsi untuk PHP melakukannya untuk ya.

Seaux
sumber
3
Keingintahuan yang jujur ​​dan tidak brengsek di sini. Apa yang membuat Anda berpikir jawaban ini lebih baik daripada gagasan yang telah saya pertimbangkan dan tolak? "Saya menyadari bahwa saya dapat menggunakan (get_included_files ()) untuk mendapatkan daftar semua file yang telah disertakan sejauh ini dan kemudian mengurai semuanya secara manual, tetapi itu banyak akses sistem file untuk satu upaya."
Alan Storm
karena satu barisnya berlawanan dengan berapa banyak baris yang diperlukan untuk menulis parser dalam PHP dan fungsi grep dikompilasi C, menurut saya, dan mungkin jauh lebih cepat daripada apa pun yang akan ditulis.
Seaux
Ah, mengerti. Perhatian saya yang sebenarnya adalah akses disk yang berulang ke setiap file berulang kali untuk melakukan ini (ini adalah sesuatu yang akan sering terjadi di alat yang saya buat) dan bukan jumlah kode yang akan saya coba untuk membuatnya lebih jelas selanjutnya waktu. (FYI: Anda harus melihat ack. Ini jauh lebih baik daripada grep!)
Alan Storm
ack atau awk? Saya suka awk, sebenarnya ini bahasa pemrograman favorit saya, tetapi lebih banyak orang menggunakan grep secara teratur ... "lebih bersih" untuk hal-hal sederhana ini
Seaux
Tidak awk, ack: betterthangrep.com Ini adalah penggantian perl kembali grep yang dioptimalkan untuk proyek berbasis kode pencarian. Itu bagus.
Alan Storm