2013-11-04 19 views
2

我還沒有能夠找到這個問題,但在其他地方在線的海峽答案,並想知道如何完全作曲家自動加載工作。當我用composer自動加載類/文件時,幕後實際發生了什麼?

當我使用自動加載PSR-0或類映射什麼是真正幕後的一類?它只是在指定路徑中的指定文件上調用include(或某些包含變體)。它實際上在瀏覽類定義的文件並構建自己的文件以包含它?它是否做了與文件不相似的事情?

提前致謝!

回答

2

甲PSR-0自動加載機是簡單地連接到全局PHP過程與spl_autoload_register()的功能。只要PHP需要實例化尚未知道的類,就會調用該註冊函數,因此這是在PHP失敗之前使類代碼已知的最後一刻。

這自動加載的執行可以是相當複雜的,還是很簡單的,但在任何情況下它會使用兩種include()require()(可能與_once,但是這是不是真的需要),使已知的類代碼PHP。你也可以實現對eval()的調用,以動態地添加一些聲明所需類的代碼,但這只是用於學術用途 - 我沒有看到它在實際情況下被使用。

這同樣適用於類加載。 classmap數組包含類的名稱作爲鍵,包含文件的文件名作爲值。這適用於類名和文件路徑之間沒有PSR-0兼容規則集映射的情況。

如果你想的作曲家如何做自動加載更多的細節,你應該看看生成的文件裏面vendor/composer。關於PHP自動加載一般如何工作的基本知識將幫助理解那裏發生的事情。

+0

好的。這是一個完美的解釋。所以php會檢查該類是否已經在當前腳本中定義。如果不是,則檢查它是否存在於自動裝載機中。你會推薦閱讀php autoload本身或嘗試通過閱讀作曲家源代碼/生成的文件學習PHP自動加載是一個更好的學習方式嗎? – echochamber

+0

您應該首先閱讀PHP自動加載。作曲家然後有一個工作示例來檢查。 – Sven

+0

謝謝Sven。我現在檢查出來。 – echochamber

1

幕後作曲使用spl_autoload_register背後註冊一個自動加載功能,其中包括你的類。

註冊的函數遵循一個標準化的命名空間/路徑解析算法(基本上考慮類名中的所有「\」或「_」作爲指定基本目錄的路徑分隔符)來查找要包含的php文件。

此外,當您運行composer install它創建的路徑和名稱空間之間的關係的緩存索引,以加快路徑解析。

您可以在Github repository挖,看看它自己。

+0

好的。這樣做更有意義。我剛剛開始通過查看作曲者正在生成的autoload_namespaces.php和autoload_classmap.php文件來看到這一點,但我仍然對它實際在做什麼感到困惑。 所以,如果我理解正確。在某處有一個用於存儲類和函數定義的自動載入堆棧,而作曲者只是簡化/更有組織地實際使用此功能。 然後是另一個問題。什麼決定哪些文件實際上具有這些功能自動加載? – echochamber

+0

當您在腳本中使用類定義時,php會嘗試加載該類。如果類定義不存在,在拋出錯誤之前,php嘗試自動加載調用您通過spl_autoload_register或__autoload函數手動註冊的所有函數的類。作曲家建立一個標準化的堆棧,但你可以創建自己的。默認情況下,在PHP中沒有可用的堆棧。 http://www.php.net/manual/en/language.oop5.autoload.php – yuri

+0

好的,很高興知道。感謝yuri的幫助。 – echochamber

相關問題