Composer的使用與原理

思維導(dǎo)圖

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 文件捺萌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末档冬,一起剝皮案震驚了整個濱河市膘茎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酷誓,老刑警劉巖披坏,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盐数,居然都是意外死亡棒拂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門玫氢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帚屉,“玉大人,你說我怎么就攤上這事漾峡」サ” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵生逸,是天一觀的道長牢屋。 經(jīng)常有香客問我,道長槽袄,這世上最難降的妖魔是什么烙无? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮遍尺,結(jié)果婚禮上截酷,老公的妹妹穿的比我還像新娘。我一直安慰自己乾戏,他們只是感情好迂苛,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歧蕉,像睡著了一般灾部。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惯退,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天赌髓,我揣著相機與錄音,去河邊找鬼催跪。 笑死锁蠕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的懊蒸。 我是一名探鬼主播荣倾,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骑丸!你這毒婦竟也來了舌仍?” 一聲冷哼從身側(cè)響起妒貌,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铸豁,沒想到半個月后灌曙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡节芥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年在刺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片头镊。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚣驼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出相艇,到底是詐尸還是另有隱情颖杏,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布坛芽,位于F島的核電站输玷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏靡馁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一机久、第九天 我趴在偏房一處隱蔽的房頂上張望臭墨。 院中可真熱鬧,春花似錦膘盖、人聲如沸胧弛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽结缚。三九已至,卻和暖如春软棺,著一層夾襖步出監(jiān)牢的瞬間红竭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工喘落, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓窘哈,卻偏偏與公主長得像鲜棠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赌朋,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容