深入學習Composer原理(四)

本系列第四篇文章,也是最後一篇

首先,我們先看看Composer的源碼從哪裏看起。當然,請您先準備好源碼。

composer init或者直接install之後,自動生成了一個vendor目錄,這時您需要在文件中手動的require這個vendor目錄下的autoload.php文件,其實這個文件又載入了vendor/composer/autoload_real.php。

在autoload_real.php中,我們發現了熟悉的spl_autoload_register函數。但這個文件最大的作用是去加載ClassLoader.php這個文件和一些目錄文件,也在同級目錄下。這個文件就值得大家好好研究下了,不過核心也無外乎前面三篇文章中的內容。但是在autoload_real.php中,大家可以發現在調用ClassLoader的register()函數前,還加載了幾個目錄相關的文件:

  • autoload_static.php,靜態加載方式,頂級類加載命名空間
  • autoload_psr4.php,遵守PSR4規範的包目錄映射數組文件
  • autoload_namespaces.php,命名空間映射,PSR0規範
  • autoload_classmap.php,類圖映射,命名空間直接映射路徑

好深奧的感覺,不過PSR4您一定已經很瞭解了。其他的其實就是對應的沒有遵守PSR4規範的一些類庫。而在ClassLoader中的register()函數就是加載的這些文件中對應的路徑文件。在這裏,最好的方式是您可以多下載一些包,然後看看這些文件發生了什麼改變。比如我安裝了一個monolog後,autoload_psr4.php的內容變成了這樣:

接下來,composer這個命令幹了什麼您應該也就瞭解了。當您進行composer require時,首先修改了composer.json文件,然後下載包,完成後根據包裏的composer.json文件中所對應的規範來修改對應的autoload_xxx.php文件。完成了文件命名空間相關內容的映射。當register()進行加載的時候,自然就得心應手了。

ClassLoader源碼中重點閱讀的一些函數內容包括:

  • findFile()
  • findFileWithExtension()
  • addPsr4()
  • add()

至此,深入學習Composer原理相關內容更新完成。其實還有更多可以學習的內容,比如安裝時的install文件其實也是個php文件。composer命令也是個phar文件,也就是完全PHP實現的,也許在將來我們可以再深入的研究研究核心composer命令行相關的源碼。到那時,再開一個系列文章再說,而這回,就先到這裏吧!!

轉載於:https://juejin.im/post/5caaa7ea5188250183647a80

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