Composer的使用與原理

思維導(dǎo)圖

Composer的意義

1.什么是Composer?

Composer 是 PHP 的一個依賴管理工具,簡單的說就是我們的項目通常會使用其它代碼庫,這時僅僅是在項目中申明依賴哪些代碼庫,默認(rèn)情況下它不會在全局安裝任何東西。

2.Composer的意義?

對于現(xiàn)代語言而言,依賴管理工具基本上是標(biāo)配。Java 有 Maven,Python 有 pip,Ruby 有 gem,Nodejs 有 npm。PHP 的則是?PEAR,不過 PEAR 坑不少:依賴處理容易出問題,配置非常復(fù)雜,難用的命令行接口等等。

正是因為Composer的出現(xiàn),解決了項目依賴的問題,并使PHP開發(fā)工作因此變得如同堆積木一般。

一個簡單的示例

通過一個簡單的示例,讓我們了解Composer是如何使用的。

1.在項目根目錄新建composer.json文件,寫入以下內(nèi)容

2.執(zhí)行composer install指令安裝包依賴

3.目錄結(jié)構(gòu)

4.使用包進行開發(fā)

Composer工作原理

Composer又是如何工作的呢,舉個例子當(dāng)我們?nèi)グ惭b一個軟件的時候,一般是通過app store 去安裝。當(dāng)我們開發(fā)PHP項目的時候,也會面臨同樣的問題。比如我們需要一個工具記錄業(yè)務(wù)log,那這樣我們是不是可以通過一個php的應(yīng)用商店來下載我們需要的工具

Packagist 是 Composer 的默認(rèn)的開發(fā)包倉庫。你可以將自己的安裝包提交到 packagist,將來你在自己的 VCS (源碼管理軟件,比如 Github)倉庫中新建了 tag 或更新了代碼,packagist 都會自動構(gòu)建一個新的開發(fā)包。這就是 packagist 目前的運作方式,將來 packagist 將允許直接上傳開發(fā)包。

發(fā)布自己的包

1.什么是包?每一個項目都是一個包

只要你有一個 composer.json 文件在目錄中,那么整個目錄就是一個包

2.一個包都有什么?

包名稱

包版本

.....


3.如何發(fā)布自己的包?

1.在github中創(chuàng)建自己的項目


2.packagist.org中提交項目


3.composer實現(xiàn)github自動推送

自動加載映射

1.PHP 自動加載功能的由來:

在 PHP 開發(fā)過程中,如果希望從外部引入一個 Class ,通常會使用 include 和 require 方法,去把定義這個 Class 的文件包含進來

考慮一下這樣會存在的問題?這個在小規(guī)模開發(fā)的時候,沒什么大問題。但在大型的開發(fā)項目中,使用這種方式會帶來一些隱含的問題:如果一個 PHP 文件需要使用很多其它類,那么就需要很多的 require/include 語句,這樣有可能會 造成遺漏 或者 包含進不必要的類文件。如果大量的文件都需要使用其它的類,那么要保證每個文件都包含正確的類文件肯定是一個噩夢, 況且 require或 incloud 的性能代價很大。

PHP5 為這個問題提供了一個解決方案:

這就是 類的自動加載(autoload)機制。autoload機制 可以使得 PHP 程序有可能在使用類時才自動包含類文件,而不是一開始就將所有的類文件include進來,這種機制也稱為 Lazy loading (惰性加載)。

但這樣仍然存在問題?如果在一個系統(tǒng)的實現(xiàn)中,如果需要使用很多其它的類庫,這些類庫可能是由不同的開發(fā)人員編寫的, 其類名與實際的磁盤文件的映射規(guī)則不盡相同。這時如果要實現(xiàn)類庫文件的自動加載,就必須在__autoload()函數(shù)中將所有的映射規(guī)則全部實現(xiàn),這樣的話autoload()函數(shù)有可能會非常復(fù)雜,甚至無法實現(xiàn)。最后可能會導(dǎo)致autoload()函數(shù)十分臃腫,這時即便能夠?qū)崿F(xiàn),也會給將來的維護和系統(tǒng)效率帶來很大的負(fù)面影響。

__autoload調(diào)用堆棧 ,PHP5 引入的 SPL Autoload

我們可以向這個函數(shù)注冊多個我們自己的_autoload()函數(shù),當(dāng)PHP找不到類名時,PHP就會調(diào)用這個堆棧,一個一個去調(diào)用自定義的_autoload()函數(shù),實現(xiàn)自動加載功能

2.自動加載映射

自動加載規(guī)范-PSR4

PSR-4 規(guī)范了如何指定文件路徑從而自動加載類定義,同時規(guī)范了自動加載文件的位置

1)完整的類名需具有以下結(jié)構(gòu): \<命名空間>(\<子命名空間>)*\<類名>

2)當(dāng)根據(jù)完整的類名載入相應(yīng)的文件

我們來看下具體符合規(guī)范完整類名、命名空間前綴和文件基目錄所對應(yīng)的文件路徑的示例

3.以laravel框架中的自動加載映射為例:

Composer是如何實現(xiàn)的自動加載映射?

自動加載源碼分析——啟動

vendor/autoload.php

自動加載源碼分析——autoload_real引導(dǎo)類

vendor/composer/autoload_real.php,程序主要調(diào)用了引導(dǎo)類的靜態(tài)方法getLoader()

初始化自動加載核心類對象-加載的源文件:

autoload_psr4.php符合PSR4標(biāo)準(zhǔn)的自動加載文件

autoload_classmap.php命名空間和文件目錄的映射

autoload_files.php用于加載全局函數(shù)的文件

初始化自動加載核心類對象-PSR4 標(biāo)準(zhǔn)的初始化接口:

初始化自動加載核心類對象-classmap的初始化接口:

注冊自動加載核心類對象-注冊

注冊自動加載核心類對象-獲取文件

鎖文件

composer.lock的重要性

在你的項目中提交 composer.lock 文件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容