深刻學習Composer原理(四)

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

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

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

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

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

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

image

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

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

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

相關參考文檔:segmentfault

深刻解析 composer 的自動加載原理數組

Composer概述及其自動加載探祕composer

Composer文檔函數

PSR規範


至此,深刻學習Composer原理相關內容更新完成。其實還有更多能夠學習的內容,好比安裝時的install文件其實也是個php文件。composer命令也是個phar文件,也就是徹底PHP實現的,源碼的Github地址:github.com/composer/co…。也許在未來咱們能夠再深刻的研究研究核心composer命令行相關的源碼。到那時,再開一個系列文章再說,而這回,就先到這裏吧!!

相關文章
相關標籤/搜索