Bir Sınıfın Tanımlandığı PHP Dosyasını (çalışma zamanında) bulma


111

PHP'de, belirli bir sınıfın (veya işlevin) tanımlandığı PHP dosyasını bulmanızı sağlayacak herhangi bir yansıma / iç gözlem / büyü var mı?

Başka bir deyişle, bir PHP sınıfının veya başlatılmış bir nesnenin adına sahibim. Bunu , sınıfın tanımlandığı dosya sistemi yolunu döndürecek bir şeye (işlev, Yansıma sınıfı, vb.) Aktarmak istiyorum.

/path/to/class/definition.php

get_included_files())Şimdiye kadar dahil edilen tüm dosyaların bir listesini almak ve ardından hepsini manuel olarak ayrıştırmak için kullanabileceğimi fark ettim , ancak bu, tek bir girişim için çok fazla dosya sistemi erişimi.

Ayrıca __autoload mekanizmamızda bu bilgiyi bir yerde önbelleğe alan bazı ek kodlar yazabileceğimi de fark ettim. Ancak, aklıma gelen durumda mevcut __autoload'u değiştirmek sınırlar dışında.

Bunu yapabilen uzantılar hakkında bir şeyler duymak ilginç olurdu, ancak nihayetinde "stok" kurulumunda çalışabilen bir şey istiyorum.


2
Magento beni buraya getirdi: -]
Alan

@alan orada bazı mülk adlarının yazılışını görmek güzel.
Alan Storm

Yanıtlar:


225

Deneyin ReflectionClass

Misal:

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

Bu false, dosya adı bulunamadığında, örneğin yerel sınıflarda dönecektir .


10

Ad alanlı bir dosyadaki ReflectionClass için, aşağıdaki gibi global hale getirmek üzere bir "\" öneki ekleyin:

$ reflektör = new \ ReflectionClass ('FOO');

Ya da tanımlanmamış bir ad alanında ReflectionClass adı verilen bir hata oluşturacaktır. Yukarıdaki cevap için yorum yapma hakkım yoktu, bu yüzden bunu ek cevap olarak yazıyorum.


0

Eğer bir içerme klasörünüz varsa, şunu yaparak "class $ className" için "grep" yapmak için bir kabuk komut dosyası çalıştırabilirdiniz: $filename = ``grep -r "class $className" $includesFolder/*\ve içinde bulunduğu dosyayı döndürecektir. Bunun dışında, herhangi bir sihir olduğunu düşünmüyorum PHP'nin bunu sizin için yapması için bir işlev.


3
Dürüst, pislik olmayan merak burada. Bu cevabın daha önce düşündüğüm ve reddettiğim fikirden daha iyi olduğunu düşünmenize ne sebep oldu? "Şimdiye kadar dahil edilen tüm dosyaların bir listesini almak için (get_included_files ()) kullanabileceğimi ve ardından hepsini manuel olarak ayrıştırabileceğimi fark ettim, ancak bu tek bir deneme için çok fazla dosya sistemi erişimi."
Alan Storm

çünkü PHP'de bir ayrıştırıcı yazmak için gereken birçok satırın aksine tek satırı ve grep işlevi C derlenmiştir, sanırım ve muhtemelen yazılanlardan çok daha hızlıdır.
Seaux

Ah, anladım. Asıl endişem, bunu yapmak için her dosyaya tekrar tekrar disk erişimiydi (bu, oluşturduğum araçta çok sık olacak bir şey) ve daha sonra bunu daha net hale getirmeye çalışacağım kod miktarı değil zaman. (Bilginize: Saldırıya bakmalısınız. Grep'ten çok daha iyi!)
Alan Storm

ack veya awk? Awk'ı seviyorum, aslında benim favori programlama dilim, ancak daha fazla insan düzenli olarak grep kullanıyor ... bu kadar basit şeyler için "daha temiz"
Seaux

Awk değil, ack: betterthangrep.com Arama kodu tabanlı projeler için optimize edilmiş perl back grep değişimidir. Bu harika.
Alan Storm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.