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