溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎樣學(xué)composer

發(fā)布時(shí)間:2021-01-22 10:36:22 來(lái)源:億速云 閱讀:127 作者:小新 欄目:軟件技術(shù)

這篇文章主要介紹了怎樣學(xué)composer,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

當(dāng)系統(tǒng)有不同的web應(yīng)用,但是需要共用很多代碼怎么辦
當(dāng)系統(tǒng)需要一個(gè)擴(kuò)展功能而這個(gè)擴(kuò)展功能網(wǎng)上剛好有人提供了怎么用
PHP代碼如何升級(jí),降級(jí),回滾
如何分配任務(wù),如何讓多個(gè)工程師一起進(jìn)行開(kāi)發(fā)任務(wù)

我在2011年接觸PHP,那時(shí)候剛發(fā)布V5.3.5。從語(yǔ)言層面,我不認(rèn)為PHP有過(guò)于明顯的缺陷,我們?cè)谟胸S富面向web的函數(shù)庫(kù)的基礎(chǔ)上,還有了類、SPL、匿名函數(shù)、etc。這些特性(一點(diǎn)都不“特”好吧)足夠支撐一個(gè)大型項(xiàng)目的編碼需求。

怎樣學(xué)composer
PHP5.3

可是,真當(dāng)我們實(shí)際開(kāi)發(fā)的時(shí)候,真的想用PHP寫(xiě)代碼的時(shí)候,卻經(jīng)常會(huì)碰到一些抓狂的問(wèn)題,這些問(wèn)題和PHP倒是沒(méi)太多的關(guān)系。可是還是讓人很頭疼的。我們想寫(xiě)一個(gè)網(wǎng)站的時(shí)候,我們可能會(huì)需要一個(gè)驗(yàn)證碼,可是大部分的情況下,我不會(huì)自己想去寫(xiě)一個(gè)驗(yàn)證碼。網(wǎng)上有那么一大把的驗(yàn)證碼類,我自然想直接用??墒钱?dāng)我想直接用,我要做的有:

  1. 去搜索引擎搜索,然后看每一個(gè)結(jié)果有沒(méi)有合適的代碼,可以給我用。

  2. 我找到了一個(gè)類,這時(shí)候我需要把這個(gè)類引入我的項(xiàng)目,放在哪個(gè)目錄?怎么autoload?它有沒(méi)有依賴什么擴(kuò)展?它會(huì)不會(huì)需要使用在比我現(xiàn)在更高版本的PHP上?這都是我要解決的問(wèn)題。

  3. 如果我要解決2說(shuō)的所有問(wèn)題,那么我為什么不直接寫(xiě)一個(gè)?

  4. f**k it

就算用我自己的代碼,當(dāng)我 有多個(gè)web應(yīng)用(電腦端、wap端 、api接口很正常吧),我當(dāng)然希望它們不在一個(gè)項(xiàng)目(目錄)里活稀泥,會(huì)增加我查看指定文件的難度,從而也增大我的維護(hù)成本??墒钱?dāng)我把這些web應(yīng)用都分開(kāi)以后,有那么多的通用的代碼(model、logic、auth。。。),這些代碼我應(yīng)該如何處理,我修改了一個(gè)web應(yīng)用的一個(gè)小邏輯,我還要去其他應(yīng)用修改,要么我記不住,要么再小的一個(gè)改動(dòng)也會(huì)變的讓人想砸電腦、辭職、出去散心。

好吧,我把這些代碼進(jìn)行拆分,通過(guò)autoload來(lái)互相使用,這樣還可以讓更多的人參與開(kāi)發(fā),可線上的情況那么復(fù)雜,萬(wàn)一有哪段代碼出問(wèn)題了,萬(wàn)一有哪個(gè)web應(yīng)用比較特殊,新的代碼對(duì)它來(lái)說(shuō)不適用。維護(hù)起來(lái)也是個(gè)問(wèn)題,接手了這樣一個(gè)依賴于很多其他項(xiàng)目的web應(yīng)用,也許稍微改一下代碼都會(huì)有很多麻煩,因?yàn)槟切゛utoload的代碼也很難讓人有很直觀的知道這個(gè)web應(yīng)用到底用了哪些其他項(xiàng)目的哪些代碼。

可是面對(duì)PHP,我又不想破罐子破摔啊,畢竟寫(xiě)起來(lái)那么方便。我還不想脫坑。但是上述問(wèn)題不解決,反正我個(gè)人認(rèn)為寫(xiě)PHP還是一件挺崩潰的事情。我們來(lái)看其他語(yǔ)言是怎么解決這個(gè)問(wèn)題的。JAVA天然的包機(jī)制讓它可以用maven,node的npm,連比PHP還老的Perl都有cpan。難道PHP不應(yīng)該有一個(gè)包管理機(jī)制嗎?

還好這些問(wèn)題沒(méi)有陪伴我的PHP時(shí)光太久,因?yàn)楹芸?,PHP有了Composer,天亮了。

Composer 是 PHP 的一個(gè)依賴管理工具。它允許你申明項(xiàng)目所依賴的代碼庫(kù),它會(huì)在你的項(xiàng)目中為你安裝他們。

這是Composer中文官網(wǎng)自己的簡(jiǎn)介。

我試圖從使用經(jīng)驗(yàn)上來(lái)闡述一下這句話。

它允許你申明項(xiàng)目所依賴的代碼庫(kù) 就是說(shuō)當(dāng)你想用什么代碼不再需要自己復(fù)制了,而是通過(guò)聲明的方式來(lái)告訴Composer就好了,就像去餐廳吃飯一樣,你不用教廚師怎么做,更不用自己做,也不用自己端盤子自己吃,而是告訴服務(wù)員,你要吃什么,告訴它就好了,當(dāng)然,你不能告訴他我今天胃不舒服,給我做點(diǎn)方便消化清淡一點(diǎn)的菜,反正我從來(lái)不這么點(diǎn)菜,總得告訴他們你到底要吃什么菜,具體的菜名。這就是和之前在搜索引擎里找代碼的區(qū)別,你不能通過(guò)關(guān)鍵詞告訴Composer,而是要告訴它你要的代碼庫(kù)的名字,WTF?我哪里知道代碼的名字,誰(shuí)也不可能知道別人代碼的名字,除非有個(gè)地方包含了所有的代碼而且提供了搜索的功能讓我們找到他們并知道他們的名字,
packagist.org就是干這個(gè)的。我們?cè)僖膊挥萌ジ鱾€(gè)搜索引擎里憑運(yùn)氣找了,在這里搜索關(guān)鍵詞不會(huì)出現(xiàn)廣告,不會(huì)出現(xiàn)莆田也不會(huì)出現(xiàn)JD。

它會(huì)在你的項(xiàng)目中為你安裝他們:  告訴了Composer以后,Composer自然會(huì)幫我們把菜端上來(lái),這是一件任何人都可以理解的事情,我們想要的代碼不知道在哪臺(tái)服務(wù)器里放著,但是Composer會(huì)幫我們下載到本地??墒沁@里還有一個(gè)問(wèn)題,下載下來(lái)以后怎么用,我們知道PHP里想用一個(gè)文件必須得include或require,Composer下載下來(lái)以后,這盤菜怎么吃,需要自己準(zhǔn)備碗筷嗎?還好還好,還有一個(gè)好東西PHP-FIG,這個(gè)玩意它不生產(chǎn)代碼,不提供任何實(shí)際問(wèn)題的解決方案。他唯一做的事情就是BB,  那他BB一些什么呢?就像我上面說(shuō)的那樣,因?yàn)橐恍┗A(chǔ)工具(比如Composer)的缺失,PHP開(kāi)發(fā)很難有一些標(biāo)準(zhǔn),比如編碼規(guī)范,比如目錄結(jié)構(gòu),比如如何自動(dòng)加載類,比如如何打log,比如如何使用緩存,這樣就會(huì)導(dǎo)致什么呢?不同的公司、不同的PHP程序員就會(huì)開(kāi)始八仙過(guò)海各顯神通,當(dāng)然這對(duì)開(kāi)發(fā)來(lái)講短時(shí)間到也沒(méi)什么,可是長(zhǎng)久來(lái)看,這是會(huì)增加開(kāi)發(fā)成本、維護(hù)成本的,當(dāng)我們換一家公司、接手一個(gè)項(xiàng)目我們要從頭開(kāi)始理解代碼,甚至在一個(gè)團(tuán)隊(duì)里我們都會(huì)因?yàn)闆](méi)有標(biāo)準(zhǔn)而增加溝通成本。所以PHP-FIG就做了這樣的事:制定標(biāo)準(zhǔn)。他制定的標(biāo)準(zhǔn)有:

  1. 編碼規(guī)范 (psr-1 psr-2)

  2. 自動(dòng)加載規(guī)范(psr-4)

  3. 一些通用接口 log(psr-3) cache(psr-6) http(psr-7)

這些標(biāo)準(zhǔn)在官網(wǎng)上都有詳細(xì)的描述。我們這里要討論的是psr-4。我在這里按照我自己的理解和使用經(jīng)驗(yàn)稍微闡述一下:psr-4的自動(dòng)加載基于文件夾和命名空間,我們需要指明一個(gè)根目錄對(duì)應(yīng)一個(gè)根命名空間,在這個(gè)基礎(chǔ)上,我們可以通過(guò)除去根命名空間以外的命名空間和類名來(lái)在根文件夾下找到這個(gè)PHP文件并加載

#根文件夾 lib#根命名空間 model#file lib/A.phpnamespace model;class A {}#file lib/entity/B.phpnamespace mode\entity;class B{}#file demo.php$a = new \model\A();$b = new \model\entity\B();

Composer就實(shí)現(xiàn)了可以根據(jù)指明標(biāo)準(zhǔn)(如psr-4)和映射關(guān)系(如代碼中的lib->model)來(lái)生成自動(dòng)加載類的功能。事實(shí)上Composer提供了這些標(biāo)準(zhǔn):

files  指明PHP文件路徑的方式,這種方式會(huì)在每次請(qǐng)求時(shí)都要載入這些文件,適合一些通用函數(shù)的PHP文件

Classmap 比f(wàn)iles智能一些,可以指明一個(gè)文件夾或一個(gè)文件來(lái)進(jìn)行自動(dòng)加載,缺點(diǎn)是即使是指明了一個(gè)文件夾,這個(gè)文件夾下增加了一個(gè)文件都需要Composer重新生成一次autoload文件,適合一些不能使用psr-4的類或類庫(kù),比如一個(gè)第三方接口的client,這個(gè)client可能在psr-4規(guī)則出現(xiàn)之前就有了,那么我們還是希望用Composer進(jìn)行管理就可以使用這種方式

psr-0 psr-4的前身,以前落伍了,就當(dāng)我沒(méi)說(shuō)過(guò)
psr-4 就像我上面介紹的,這種方式增加一個(gè)或多個(gè)文件也不需要重新生成autoload文件,因?yàn)樗前凑彰臻g和文件夾的映射關(guān)系來(lái)加載的。

那么Composer實(shí)現(xiàn)了這個(gè)有什么好處呢?

我們自己不需要寫(xiě)什么autoload文件了,同時(shí)這個(gè)標(biāo)準(zhǔn)也很好理解接受,維護(hù)和學(xué)習(xí)代碼的成本也降低了
只要我們需要的第三方庫(kù)也是使用Composer來(lái)處理自動(dòng)加載的,我們只需要require這個(gè)包,那么加載這個(gè)第三方庫(kù)的代碼Composer也會(huì)處理,我們有了一個(gè)超強(qiáng)的autoload文件

所以,我們要做的就是學(xué)習(xí)和Composer打交道然后開(kāi)始享受全球開(kāi)發(fā)者的代碼了。

就像上面描述的,Composer就像一個(gè)機(jī)器貓,你要什么它就給什么,那么交互的方式就類似于SQL語(yǔ)句那樣,告訴它你要什么然后它給你結(jié)果。所以我們要做的就是描述需求,也就是當(dāng)產(chǎn)品經(jīng)理,好過(guò)癮。

{
    "name": "fmw/test",
    "description": "fmw test",
    "authors": [
        {
            "name": "zzc",
            "email": "2272713550@qq.com"
        }
    ],
    "repositories": [
        {
            "type": "composer",
            "url": "http://package.fmw.com"
        }
    ],
    "version":"1.0.106",
    "require": {
        "fmw/other-layer":"1.*",
        "fmw/common":"1.*"
    },
    "require-dev":{
        "php-console/php-console": "^3.1",
        "phpdocumentor/phpdocumentor": "2.*"
    },
    "autoload":{
        "psr-4":{
            "model\\":"src/"
        }
    }
}

以上代碼是一個(gè)我用過(guò)的composer配置文件,可以看出這是一個(gè)標(biāo)準(zhǔn)的json。我們來(lái)看一下這段json的每個(gè)key:

name和description是你給這個(gè)php項(xiàng)目起的名字,當(dāng)這個(gè)項(xiàng)目?jī)H僅是一個(gè)web項(xiàng)目,這兩個(gè)其實(shí)不是很重要,但是這個(gè)項(xiàng)目其實(shí)是一個(gè)向外發(fā)布的代碼庫(kù),就很關(guān)鍵了,name需要獨(dú)一無(wú)二,description需要一句話來(lái)描述這個(gè)包的作用。

authors就是相當(dāng)于宣布一下主權(quán),可以有多個(gè)

repositories相當(dāng)于你需要下載的代碼庫(kù)所在的倉(cāng)庫(kù),默認(rèn)會(huì)有一個(gè)全局的倉(cāng)庫(kù),具體是什么就不在這里說(shuō)了,上面的某個(gè)網(wǎng)址有介紹,在這里添加一個(gè)是因?yàn)槿绻阌袀€(gè)私人的倉(cāng)庫(kù)(有些代碼不太適合放在公開(kāi)的倉(cāng)庫(kù)吧),則可以在這里聲明

version是版本號(hào),這個(gè)是跨時(shí)代的功能啊,有了這個(gè),PHP程序員也可以刷版本號(hào)了??!

require則是上面闡述了很多的功能,解決了我說(shuō)的那些痛點(diǎn),通過(guò)“name”:"version"聲明,可以有多個(gè),require以后使用composer install命令composer會(huì)下載代碼并自動(dòng)加載
require-dev用法一致,但是功能不同,是用來(lái)聲明一些在開(kāi)發(fā)時(shí)候才用到的包,比如測(cè)試、文檔等等

autoload 上面有介紹,就不廢話

上面工作做完以后,執(zhí)行composer install我們可以看到和composer.json同級(jí)的文件夾下生成了一個(gè)vendor文件夾,我們新建一個(gè)php文件引入vendor下的autoload.php文件就可以使用包和我們自己聲明的autoload的php文件了
#index.php

include ‘./vendor/autoload.php’;

到這里,我們就算會(huì)用了composer,至于如何使用composer的功能就不拾人牙慧了,但是還有一些問(wèn)題想討論一下。

比如有些代碼不太適合放在公開(kāi)的倉(cāng)庫(kù),但是我們還是希望包的形式來(lái)使用,畢竟這樣的話,一個(gè)公司內(nèi)部就很容易分工了,每一個(gè)PHP程序員維護(hù)若干個(gè)包,多方便,所以建立一個(gè)內(nèi)部的代碼倉(cāng)庫(kù)是很重要的。這時(shí)候Composer官方提供的工具satis就可以發(fā)揮作用了。

Simple static Composer repository generator

這是它的介紹,一個(gè)簡(jiǎn)單的Composer倉(cāng)庫(kù)生成器。使用它的步驟如下:

在合適的目錄執(zhí)行 php composer.phar create-project composer/satis --stability=dev --keep-vcs(前提是你已經(jīng)按照Composer)
新建一個(gè)satis.json 實(shí)例如下

{
    "name": "My Repository",
    "homepage": "http://packages.dev.com",
    "repositories": [
        {"type": "vcs", "url": "http://git.dev.com/maxincai/package1.git"},
        {"type": "vcs", "url": "http://git.dev.com/maxincai/package1.git"},
    ],
    "require": {
        "maxincai/package1": "*",
        "maxincai/package2": "*",
    }
}

執(zhí)行 php bin/satis build satis.json public/(public就是所有包的存放目錄)
將public目錄作為一個(gè)web服務(wù)對(duì)外發(fā)布就好了

使用的時(shí)候只需要在repositories多加一項(xiàng)(就像我在上面的composer.json做的那樣),然后引入包就好了

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“怎樣學(xué)composer”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI