你不知道的Composer加載方式

我們都知道composer是現(xiàn)代php框架(yii2、laravel…)的基石,有了composer后我們開(kāi)發(fā)是一件多么的爽的事情。那么composer加載方式你知道多少呢?下面由composer使用教程欄目給大家介紹你不知道的composer加載方式。

你不知道的Composer加載方式

本文僅僅關(guān)注Composer的自動(dòng)加載。

我們以Yii2為例,當(dāng)我們通過(guò)Composer生成了一個(gè)Yii2程序后,會(huì)在vendor下建立一個(gè)autoload.php文件,它負(fù)責(zé)幫我們自動(dòng)加載vendor內(nèi)的各種庫(kù)(yii2核心庫(kù)也在vendor內(nèi),你懂得!)。

而你一定知道Yii2的入口文件index.php有一行。

require(__DIR__?.?'/../vendor/autoload.php');

由此可見(jiàn),Yii2對(duì)Composer的友好程度,也難怪~孤木不成林,Yii2也要靠無(wú)數(shù)個(gè)Composer擴(kuò)展枝干才能變成參天大樹(shù)。

下面開(kāi)始正式講解Composer的autoload,告訴你各式各樣擴(kuò)展安裝后,我們并沒(méi)有使用include / require,那么Composer是如何幫我們找到他們的那?

目前為止,Composer一共支持4種自動(dòng)加載方式

PSR-0 PSR-4 class-map 直接包含file

這四種方式足以讓Composer涵蓋地球上所有的PHP第三方擴(kuò)展庫(kù)。

PSR是一套PHP開(kāi)發(fā)標(biāo)準(zhǔn),現(xiàn)在大多數(shù)主流框架都在支持,工兵連已經(jīng)開(kāi)專(zhuān)題分享PSR干貨。

PSR-4

PSR-4是Composer推薦使用的一種方式,因?yàn)樗资褂貌⒛軒?lái)更簡(jiǎn)潔的目錄結(jié)構(gòu)。在一個(gè)擴(kuò)展的composer.json里是這樣進(jìn)行配置的:

{ ????"autoload":?{ ????????"psr-4":?{ ????????????"Foo":?"src/", ????????} ????} }

key和value就定義出了namespace以及其對(duì)應(yīng)的目錄映射。按照PSR-4的規(guī)則,當(dāng)試圖自動(dòng)加載”FooBarBaz”類(lèi)的使用,會(huì)去尋找”srcBarBaz.php”這個(gè)文件,如果它存在則加載,要注意的是此時(shí)”Foo”并不會(huì)出現(xiàn)在文件路徑中。

而composer.json這樣的配置會(huì)被Composer轉(zhuǎn)換成namespace與文件目錄的MAP形式,并存在vendor/composer/autoload_psr4.php文件中,所以如果你安裝的某個(gè)擴(kuò)展自動(dòng)加載是PSR-4形式,你可以在autoload_psr4.php找到它的真實(shí)路徑。

PSR-0

這是一個(gè)已經(jīng)過(guò)時(shí)的標(biāo)準(zhǔn),那是在遙遠(yuǎn)的PHP5.2時(shí)代,你我都知道,PHP5.3之后才有了類(lèi)似namespace這樣的高級(jí)屬性,所以PSR-0更多是考慮

有點(diǎn)蒙圈么?那我們來(lái)看代碼你就明白了。

{ ????"autoload":?{ ????????"psr-0":?{ ????????????"Foo":?"src/", ????????} ????} }

我們來(lái)分析這個(gè)擴(kuò)展的加載方式,什么是偽namespace那?當(dāng)我們用這個(gè)庫(kù)的時(shí)候

$model?=?new?Foo_Bar_Baz();

對(duì)的,PSR-0的時(shí)代,有很多以下劃線分隔的類(lèi)名,它代表。。。它代表。。。

src/Foo/Bar/Baz.php

聰明的你一定明白什么是偽namespace了吧,通過(guò)命名的下劃線來(lái)映射目錄結(jié)構(gòu)。

哎,那個(gè)時(shí)代的標(biāo)準(zhǔn)制定者們也真心不容易呀。

Class-map方式

{ ????"autoload":?{ ????????"classmap":?["src/",?"lib/"] ????} ??}

這個(gè)加載方式比較容易理解,當(dāng)Composer開(kāi)始安裝擴(kuò)展的時(shí)候,會(huì)根據(jù)composer.json里的這個(gè) autoload 告訴的方式classmap,來(lái)遍歷src、lib目錄然后將里面的類(lèi)文件和其路徑一一對(duì)應(yīng),存放到vendor/composer/autoload_classmap.php內(nèi)。

例如src/下有一個(gè)BaseController類(lèi),那么在autoload_classmap.php文件中,就會(huì)生成這樣的配置:

'BaseController'?=>?$baseDir?.?'/src/BaseController.php'

若你還不懂,去看看autoload_classmap.php吧。

File方式

有了上面這些加載方式還不夠么? 是的,還會(huì)有一些供全局使用的比如幫助等這樣函數(shù),那么好吧,我們就講這些文件直接包含進(jìn)來(lái)好了。

{ ????"autoload":?{ ????????"files":?["src/MyLibrary/functions.php"] ????} }

Composer安裝擴(kuò)展后會(huì)將其放到

vendor/composer/autoload_files.php

到此刻,世界清靜了,Composer可以加載我大PHP世界的各種庫(kù),只要你想,就可以自動(dòng)加載。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享
站長(zhǎng)的頭像-小浪學(xué)習(xí)網(wǎng)