2010-03-10 39 views
81

PHP中是否有任何反射/內省/魔法讓你找到定義了特定類(或函數)的PHP文件?尋找定義類的PHP文件(在運行時)

換句話說,我有一個PHP類或實例化對象的名稱。我想通過這個(函數,反射類等),將返回文件系統路徑的類定義。

/path/to/class/definition.php 

我知道我可以使用(get_included_files())讓所有迄今已包含的文件列表,然後手動解析這些,但是這是一個很大的單個嘗試文件系統的訪問。

我也知道我可以在某處緩存此信息我們的__autoload機制,寫一些額外的代碼。但是,修改現有__autoload是關閉在我心目中的情況下限制。

聽到擴展,可以做到這一點會很有趣,但我最終會喜歡一些可以在「股票」上運行的東西,安裝。

回答

169

嘗試

實施例:

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

這將返回false時的文件名不能被發現,例如在本地班上。

0

如果你有一個includes文件夾,你可以通過執行:$filename = ``grep -r "class $className" $includesFolder/*\來運行一個shell腳本命令來爲「class $ className」「grep」,它將返回它所在的文件。除此之外,我不認爲PHP有​​任何神奇的功能來爲你做。

+2

誠實,非混蛋的好奇心在這裏。是什麼讓你認爲這個答案比我已經考慮並拒絕的想法更好? 「 我意識到我可以使用(get_included_files())獲取迄今爲止已包含的所有文件的列表,然後手動解析它們,但是對於單次嘗試來說,這是很多文件系統訪問權限。」 – 2010-03-10 20:22:31

+0

,因爲它的一行不同於它在PHP中編寫解析器所需要的許多行,而且我認爲grep函數編譯爲C,並且可能比寫入的任何內容快得多。 – Seaux 2010-03-10 20:28:26

+0

啊,明白了。我的實際擔憂是一再重複訪問每個文件的磁盤訪問權限(這是我正在構建的工具中會發生的很多事情),而不是我將嘗試使下一個更清晰的代碼數量時間。 (僅供參考:你應該看看ack,它比grep好!) – 2010-03-10 21:26:18

6

對於ReflectionClass在命名空間文件,添加前綴 「\」,使其全球如下:

$反射=新\ ReflectionClass( '富');

否則,它會在未定義的名稱空間中產生一個錯誤,表示ReflectionClass。 我沒有權利對上述答案發表評論,因此我將此作爲補充答案編寫。