作為多年 PHP 的開發(fā)者,在使用了 Go 語言之后......
行業(yè)資訊
發(fā)布者:cya
2020-01-13 08:36
訪問量:255
作者 | Dan Gurgui
譯者 | 彎月,責(zé)編 | 屠敏
出品 | CSDN(ID:CSDNnews)
Go 是一種功能強(qiáng)大的編程語言,具有獨(dú)特的功能組合。而 PHP 是在服務(wù)器端執(zhí)行的腳本語言,與 C 語言類似,是常用的網(wǎng)站編程語言,同時(shí)適用于所有微服務(wù)、小型、中型乃至大型應(yīng)用程序。對(duì)于開發(fā)者而言,兩者在使用過程中,有哪些不同的體驗(yàn)?本文即將為大家揭曉。16歲的時(shí)候,我發(fā)現(xiàn)了PHP。這是我學(xué)習(xí)的第一門編程語言。當(dāng)時(shí),我利用PHP來檢查用戶提交的表單并發(fā)送電子郵件,大多數(shù)表單都是“聯(lián)系我們”。多年以來,我始終將PHP作為我的強(qiáng)項(xiàng),且堅(jiān)持不懈地發(fā)展壯大自己的PHP知識(shí)和技能。雖然我覺得自己算不上PHP高手,但這是我最了解的編程語言。以前,我曾有機(jī)會(huì)在小型項(xiàng)目中使用Ruby、Java、Python和NodeJS。我通過這些經(jīng)驗(yàn)比較PHP和其他編程語言,了解如何更好地利用PHP的優(yōu)點(diǎn)并克服它的缺點(diǎn)。6個(gè)月前,我成為了 MessageBird 的一名工程師。申請(qǐng)工作的時(shí)候,我填寫了PHP,但是我沒想到入職后我就開始使用 GoLang,而且與PHP漸行漸遠(yuǎn)。這種一次很好的經(jīng)歷,在這段時(shí)間里,我學(xué)習(xí)了一種新的編程語言,而如今我又回到了PHP,同時(shí)我還擁有6個(gè)月的Go編程經(jīng)驗(yàn)。 Go是一種功能強(qiáng)大的編程語言,具有獨(dú)特的功能組合。我很遺憾沒能更深入地學(xué)習(xí)Go。我返回PHP的原因與編程語言本身無關(guān),但是,我想總結(jié)一下這6個(gè)月的經(jīng)驗(yàn),并比較一下這兩種語言。GoLang是一種靜態(tài)編程語言,不像PHP那樣是動(dòng)態(tài)的。因此,你需要在初始化變量和對(duì)象時(shí)提前想清楚。在PHP中,你永遠(yuǎn)不會(huì)初始化變量,需要時(shí)當(dāng)場(chǎng)使用就可以了。因此,在聲明一個(gè)新變量之前,對(duì)于GoLang而言你需要三思而后行,我發(fā)現(xiàn)這比在PHP中檢查變量的做法更有效率。PHP 7添加了類型聲明,這是一個(gè)更好的實(shí)踐,但是在編寫代碼之前三思而后行是一種更健康的做法。GoLang 非常神奇的功能之一就是goroutine。這個(gè)功能支持異步運(yùn)行功能。PHP中沒有任何功能與Goroutines的簡(jiǎn)單性和易用性相提并論。每當(dāng)需要在PHP中進(jìn)行并行處理時(shí),你都需要添加外部的排隊(duì)機(jī)制(Beanstalk、RabbitMQ等)。這會(huì)加劇基礎(chǔ)架構(gòu)的復(fù)雜性,并增加項(xiàng)目的復(fù)雜性。GoLang的并行處理遠(yuǎn)遠(yuǎn)超越了PHP。自從編程問世以來,面向?qū)ο蟮母拍钜恢睋碛幸幌亍?0年代,面向?qū)ο笤贑++中得到了廣泛應(yīng)用,也因此成為了主流范式。面向?qū)ο笞钗业牡胤皆谟冢试S工程師使用代碼創(chuàng)建業(yè)務(wù)邏輯圖,事實(shí)證明,當(dāng)不斷發(fā)展的系統(tǒng)發(fā)生變化時(shí),這種做法提供的價(jià)值無可限量。PHP和GoLang都提供面向?qū)ο蟮墓δ?,但是,這兩種語言之間存在很大差異。我花了很長(zhǎng)時(shí)間才習(xí)慣了隱式接口。在GoLang中,在實(shí)現(xiàn)所有方法后,類型就會(huì)滿足接口要求。但在PHP中,你需要顯式地定義類型所需的接口,然后開始實(shí)現(xiàn)。有了Go的這一功能,你不需要提前思考應(yīng)用程序的接口,這一點(diǎn)與我對(duì)靜態(tài)類型語言的認(rèn)知正好相反。不斷發(fā)展的模型具有復(fù)雜的需求,而領(lǐng)域驅(qū)動(dòng)的設(shè)計(jì)可以滿足這種需求。為此,你需要許多面向?qū)ο蟮墓δ?,PHP也的確提供了許多這樣的功能:trait、抽象方法和類,final方法和類,魔術(shù)方法等等。GoLang缺少這些功能,這是一個(gè)難以克服的限制條件。因此,我認(rèn)為GoLang僅適用于微服務(wù)或小型應(yīng)用程序,而PHP適用于所有微服務(wù)、小型、中型乃至大型應(yīng)用程序。我認(rèn)為,在決定項(xiàng)目質(zhì)量方面,測(cè)試是最重要的工作:?jiǎn)卧獪y(cè)試、集成測(cè)試、功能測(cè)試、UI測(cè)試、性能測(cè)試等等,項(xiàng)目擁有的測(cè)試越多,交付的質(zhì)量就越好。GO和PHP的單元測(cè)試框架都很出色,Go擁有嵌入式測(cè)試包,而PHP有 PHPUnit,它們都提供了一組豐富的功能,可用于測(cè)試你的代碼。PHPUnit的功能比GoLang測(cè)試包更多,因?yàn)镻HP的功能更多。這兩種工具都可以完成編程語言的工作。然而, 在進(jìn)行高級(jí)測(cè)試時(shí),PHP和Go就會(huì)表現(xiàn)出很大的不同。首先,對(duì)于性能測(cè)試,Go的測(cè)試包中擁有很多性能測(cè)試的功能。pprof 等許多庫都可以使用這些功能來創(chuàng)建華麗的數(shù)據(jù)報(bào)告。雖然PHP也有一套可用于性能測(cè)試的庫和技術(shù),但Go的更加易于使用。我相信這是靜態(tài)類型語言的優(yōu)勢(shì)之一。其次,對(duì)于高級(jí)測(cè)試技術(shù)(例如BDD、TDD和A/B測(cè)試),PHP擁有更多支持、更多庫,還有一個(gè)更大的社區(qū)。例如,兩種語言都實(shí)現(xiàn)了Cucumber(或Gherkin),但是PHP 的 BEHAT 實(shí)現(xiàn)支持40多種語言,是完全基于獨(dú)立組件構(gòu)建的,而且在GitHub上的支持比Cucumber更多(更多分支、更多給星等等)。 最后,對(duì)于功能測(cè)試或UI測(cè)試,PHP的庫更多,且對(duì)現(xiàn)有工具的支持更好。Selenium 擁有非常強(qiáng)大的PHP支持(3000多個(gè)跨瀏覽器測(cè)試、視頻記錄、文本和可視日志等),而對(duì)于Go來說,只有一個(gè)沒有良好維護(hù)的驅(qū)動(dòng)程序 tebeka / selenium(最后一次提交發(fā)生在5個(gè)月前)。兩種語言之間還有許多其他差異,重點(diǎn)包括:
- GoLang 的性能比PHP更好。我們有數(shù)百種基準(zhǔn),可以在各種情況下測(cè)試 PHP 和 GoLang,但大多數(shù)時(shí)候明顯都是 GoLang 勝出。最重要的是,Go的開發(fā)速度很快:測(cè)試運(yùn)行速度更快、內(nèi)存使用效率更高、CPU使用率更低。
- PHP社區(qū)的人數(shù)遠(yuǎn)遠(yuǎn)超過了 GoLang,而且支持非常出色。我發(fā)現(xiàn) GoLang 使用了許多糟糕的東西,例如代碼生成器,這都是PHP社區(qū)幾年前拋棄的東西。
- 打包維護(hù)也很不相同。在GoLang中,打包維護(hù)是內(nèi)部管理的;而PHP有兩層不同的實(shí)現(xiàn)方式:第一,PHP擴(kuò)展級(jí)別;第二,每個(gè)人都使用的庫級(jí)別。PHP的情況更為復(fù)雜,而go則將兩層管理放到了一起。
這兩種語言有明顯的區(qū)別,在兩者之間做選擇非常容易。GoLang 的性能更好,擁有原生異步功能以及其他基本功能,非常適合需要頻繁使用的小型應(yīng)用程序和微服務(wù)。然而,隨著應(yīng)用程序的不斷增長(zhǎng),業(yè)務(wù)邏輯復(fù)雜度加劇的情況下,PHP是很自然的選擇,因?yàn)槟憧梢猿浞掷肞HP的面向?qū)ο蠊δ芎蜕鐓^(qū)支持。