Composer實現(xiàn)PHP中類的自動加載
來源:原創(chuàng) 時間:2017-10-25 瀏覽:0 次Composer是PHP針對PHP言語的第三方的依靠辦理東西,將工程所用到的依靠文件包括在composer.json文件中,運用composer install指令就能夠?qū)⑺\用對應庫或許文件加載進工程里邊。下面分兩部分介紹composer的根底,別離是composer的依靠辦理和主動加載。
依靠辦理
在composer呈現(xiàn)之前,如果咋PHP項目中需求第三方的依靠文件,則需求程序員將所需求的源代碼復制進工程中或許將源代碼對應的文件下載下來手動增加到工程中。如果所需求的依靠文件依靠于更多的第三方文件,則程序員會墮入復制依靠文件的黑洞中,費時吃力不說,有可能還會呈現(xiàn)一些失誤,composer就是在這種情況下呈現(xiàn)的用于減輕程序員的關(guān)于依靠辦理的擔負的東西。
Composer經(jīng)過運用裝備文件composer.json文件完結(jié)依靠辦理。composer.json文件包括了項目的簡略介紹、項目關(guān)于外界的庫或文件的依靠。從composer.json的擴展名就能夠看得出來,composer.json中的內(nèi)容是依照json標準安排的。本篇博客會集在類的主動加載機制上,因而關(guān)于composer.json中關(guān)于項目的作者等相關(guān)信息的解說疏忽不解說。
在composer中將本項目所需求的外部依靠包寫在要害字require對應的值中,require鍵能夠?qū)鄠€所需求的包,各個不同的包之間用逗號分隔。假定項目需求一個外部依靠包monolog,下面是在compose.json文件中關(guān)于monolog包的依靠裝備項:
如上所示,require要害字將會映射包的稱號monolog和包的版別1.0.*。其間,包的稱號有兩部分組成,中心以“/”分隔,“/”之前代表的包的所有者,在Github上一般是代表的Github的用戶名,“/”代表的是實踐的包的稱號。其間“/”之前的稱號有必要是僅有的,可是"/"之后的包的稱號是能夠存在重復的,例如“Jack/monolog”和“monolog/monolog”是能夠共存的。然后面的"1.0.*"代表的是所依靠的包的版別,其間“*”代表的是“1.0”之下的恣意一個版別,例如:1.0.1,1.0.2或許1.0.9等等。“@dev”代表了能夠獲取該包的開發(fā)版別。默許情況下,composer將獲取所需求的包的最新的安穩(wěn)版別,而不會考慮開發(fā)版別,由于開發(fā)版別一般是不太安穩(wěn)的版別??墒?,如果斷定開發(fā)版別沒有什么問題就能夠加上“@dev”以答應獲取開發(fā)的版別。如果沒有加上“@dev”,而除了開發(fā)版別之外不存在其他版其他話,則composer加載依靠項犯錯。
在composer中裝備好依靠的第三方的包之后,就能夠運用composer install指令獲取第三方的包了。運轉(zhuǎn)成功之后就能夠項目中就會呈現(xiàn)vendor文件夾,vendor文件夾中會包括我們在require中所列出的monolog文件。
出了生成列在composer.json中要害字require值下的文件之外,成功運轉(zhuǎn)composer install之后還會生成對應的composer.lock文件,該文件依據(jù)composer.json中的依靠項生成依靠包對應的版別。這兒需求闡明的是,在我們運轉(zhuǎn)composer install的時分會首要判別是否存在著composer.lock文件。如果原本就存在這composer.lock文件,那么就會直接依據(jù)composer.lock中的版別下載對應的包,此刻不再理睬composer.json中的裝備項。如果不存在composer.lock文件,則依據(jù)composer.json文件中的裝備下載對應的版別,并生成composer.json對應的composer.lock文件。composer.lock又稱為確定文件,生成對應的composer.lock之后,composer.json和composer.lock共同對版別進行操控。有了composer.lock之后,及時有了新的版別也不會觸發(fā)新版其他更新,除非手動運用composer update指令進行手動的更新。
開發(fā)環(huán)境下的依靠
有的時分我們只是在開發(fā)的時分才會依靠于某個詳細的包,可是在發(fā)行的版別中并不需求這樣的包,為了到達這種要求能夠運用require-dev引進開發(fā)環(huán)境下的包依靠。如下:
主動加載類
經(jīng)過composer.json或許composer.lock,所依靠的第三方庫現(xiàn)已被下載下來了,那么在我們的項目中怎樣運用這些第三方庫呢?最簡略的辦法就是經(jīng)過include或許require將所需求的類文件包括進來,可是這種辦法需求我們自己去尋覓所運用的類對應的類文件,這就存在和PHP言語中直接運用include和require加載所需求的類存在相同的壞處,一種比較簡略的辦法當然就是運用composer供給的類的主動加載機制了。類似于PHP的主動加載機制,composer供給了autoload完成類的主動加載。
成功運轉(zhuǎn)composer install之后,只需調(diào)用生成的vendor目錄下的autoload.php文件就能夠調(diào)用經(jīng)過composer.json加載的類了。以上面所述的項目中需求monolog包為例,經(jīng)過能夠經(jīng)過下面的辦法運用monolog包中的Logger類。
當然,除了運用第三方庫中供給的類之外,還能夠運用自己的界說的類。Composer供給了autoload要害字用于加載我們自己供給的類,假設(shè)我們界說了一個有關(guān)測驗的類,如下:
將該類放在lib目錄下的ClassTest.php文件夾下面,那么怎樣讓composer加載自己界說的類呢?
1. 在composer.json中參加autoload要害字
files鍵對應的值是一個數(shù)組且改值是相關(guān)于文件運用根目錄的文件的途徑。在composer.json中參加上述的要害字之后,在指令行下運轉(zhuǎn)composer dump-autoload就能夠讓composer重建加載信息,那么就能夠在其他的文件中運用這個類了。
上述所述的辦法和PHP中直接運用include和require存在一樣的壞處,每個類都需求從頭書寫加載文件,費時吃力。
2. composer.json中參加classmap要害字
比較于每個類文件都需求加載一次的做法,運用classmap要害字,能夠削減程序員的擔負,只需求將文件地點的目錄增加在classmap的值中即可,如下:
其實這需求樹立一品種名到類地點的文件的映射聯(lián)系。當需求相應的類的時分,composer經(jīng)過類名找到對應的類文件名,將相應的類include進來??墒沁@相同存在一個問題就是,每增加一個類都需求從頭運轉(zhuǎn)一次composer dump-autoload從頭創(chuàng)立類名到文件之間的映射聯(lián)系,然后將對應的類加載進來。盡管比files要害字節(jié)省了功夫,可是仍然不能徹底主動加載所需求的類。
3. 根據(jù)PHP標準的主動加載辦法
針對PHP這種編程言語,到現(xiàn)在FIG指定了五個標準,別離如下:
PSR0:主動加載;
PSR1:根本代碼標準;
PSR2:代碼款式標準;
PSR3:日志接口標準;
PSR4:主動加載標準;
看上去PSR4與PSR0是重復了,可是PSR4標準比較潔凈,能夠當作PSR0標準的升級版。二者最重要區(qū)別在于:PSR0標準中,下劃線會被轉(zhuǎn)換為目錄分隔符,可是PSR4中下劃線不具有特別的意義。二者都是經(jīng)過特定的目錄、文件名以及類名,完成快速查找到類文件,并將相應的類加載進來。
PSR0和PSR4要求有個命名的空間,對上述的ClassTest類做相應的修正如下:
那么對應的文件的途徑應該改為libClassTestLibClassTest.php,此刻修正composer.json中的autoload如下:
可能你發(fā)現(xiàn)psr0的值有一些古怪,是的。在這兒ClassTestLib代表的是命名空間,而"lib"是目錄名。加載對應的類文件的時分,查找的途徑是lib/ClassTestLib,而不是ClassTestLib/lib,這是在書寫composer.json的時分需求留意的一點。
如果命名空間中存在著“”,則在書寫對應的composer.json的時分需求在相應的“”再增加一個“”。例如,如果命名空間改為ClassTestLib,相應的對應與運用根目錄的途徑稱號應該變?yōu)閘ibClassTestLibClassTest.php,對應的composer.json中的autoload應該變?yōu)椋?/span>