Composer的意義
1.什么是Composer?
Composer 是 PHP 的一個依賴管理工具,簡單的說就是我們的項目通常會使用其它代碼庫冕杠,這時僅僅是在項目中申明依賴哪些代碼庫微姊,默認情況下它不會在全局安裝任何東西。
2.Composer的意義分预?
對于現(xiàn)代語言而言兢交,依賴管理工具基本上是標配。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又是如何工作的呢,舉個例子當我們?nèi)グ惭b一個軟件的時候配乓,一般是通過app store 去安裝仿滔。當我們開發(fā)PHP項目的時候,也會面臨同樣的問題犹芹。比如我們需要一個工具記錄業(yè)務(wù)log崎页,那這樣我們是不是可以通過一個php的應(yīng)用商店來下載我們需要的工具
Packagist 是 Composer 的默認的開發(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)效率帶來很大的負面影響。
__autoload調(diào)用堆棧 皂甘,PHP5 引入的 SPL Autoload
我們可以向這個函數(shù)注冊多個我們自己的_autoload()函數(shù)玻驻,當PHP找不到類名時,PHP就會調(diào)用這個堆棧偿枕,一個一個去調(diào)用自定義的_autoload()函數(shù)璧瞬,實現(xiàn)自動加載功能
2.自動加載映射
自動加載規(guī)范-PSR4
PSR-4 規(guī)范了如何指定文件路徑從而自動加載類定義,同時規(guī)范了自動加載文件的位置
1)完整的類名需具有以下結(jié)構(gòu): \<命名空間>(\<子命名空間>)*\<類名>
2)當根據(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標準的自動加載文件
autoload_classmap.php命名空間和文件目錄的映射
autoload_files.php用于加載全局函數(shù)的文件
初始化自動加載核心類對象-PSR4 標準的初始化接口:
初始化自動加載核心類對象-classmap的初始化接口:
注冊自動加載核心類對象-注冊
注冊自動加載核心類對象-獲取文件
鎖文件
composer.lock的重要性
在你的項目中提交 composer.lock 文件捺萌。