composer 自動載入的簡單理解

psr4 :

結合命名空間自動加載(前提是要加載的類指定了命名空間,即有namespace,否則找不到)

"APP\\":"application/"表示APP命名空間對應application目錄

(只針對類文件,類文件必須包含有命名空間,後綴必須是.php)


classmap:

自動加載指定文件(前提是後綴是.php或.inc)  或 自動加載指定文件夾裏面所有.php和.inc後綴文件的所有類

"application\libs\"表示自動加載application\libs\下的所有文件(只包括後綴.php和.inc的文件)

(只針對類文件,類文件不需要包含命名空間;

如果包含了命名空間,直接按命名空間實例化;

如果沒有命名空間,直接按類名實例化)


files :

自動加載指定文件裏面的所有函數

(只針對函數文件)


psr0:不推薦用,這裏不總結,和psr4差不多。


psr4 生成的映射在 vendor/composer/autoload_psr4.php
classmap 生成的映射在 vendor/composer/autoload_classmap.php
files 生成的映射在 vendor/composer/autoload_files.php


composer自動加載執行過程


composer核心處理類就是 vendor/composer/autoload_real.php這個類,它做的事情就是把psr-0,psr-4,classmap以及files四種方式加載的類註冊到vendor/composer/ClassLoader類下。


classMap    -> ClassLoader的classmap數組中
psr-0 psr-4 ->  namespace註冊到相應數組中
files中定義的文件全部放在全局變量$GLOBALS['_composerautoload_files']中


上面的類註冊後,會執行vendor/composer/ClassLoader類的register方法,將該類下的loadClass方法註冊到類加載隊列中,之後當new一個新的類的時候,php會在所有註冊的類加載函數中進行查找(執行註冊進來的方法)。

LoadClass方法:
執行findFile方法
1.如果ClassLoader下的classmap數組中有相應的類,直接返回;如果在missingFiles中有紀錄這個類是加載不到的,直接返回false。
2.如果apcu前綴不爲空且在php.ini配置中開啓了apc功能,則使用apcu_fetch查詢類是否存在
3.根據文件名,帶上文件後綴 .php  在psr0和psr4中進行查找。
4.如果在第三步之中找到相應class,則在第二步的前提條件下,將類路徑藉助apcu_add存起來。
5.如果以上都找不到相應的類,則將類紀錄在missFiles數組中。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章