PHP沒(méi)戲了?想看PHP被淘汰還早著呢!
我寫這篇文章有段時(shí)間了,這里改改那里改改,但就是不知道什么時(shí)候發(fā)表。最近PHP 8發(fā)行,讓我覺(jué)得現(xiàn)在“是時(shí)候了”。
每個(gè)月我都會(huì)看到有人說(shuō)PHP正在逐漸過(guò)時(shí),我們不應(yīng)該在使用它。如果你在一些論壇或者Stack Overflow上看到關(guān)于“學(xué)習(xí)PHP”的問(wèn)題,百分百會(huì)看到有人發(fā)類似“為什么會(huì)想要學(xué)PHP?學(xué)點(diǎn)牛的不香嗎,比如說(shuō)‘某牛語(yǔ)言’”的言論。
我寫PHP將近20年了(可能更久,我不太記得我什么時(shí)候開(kāi)始的了)。在用其他語(yǔ)言的時(shí)候,大多數(shù)情況下,我都會(huì)直接忽略對(duì)話的大部分內(nèi)容。這么多年來(lái),PHP都在漸漸“失去生命力”,我早就應(yīng)該不用它了。在任何語(yǔ)言上我都稱不上是專家,關(guān)于PHP我還有很多要學(xué)的,但是我發(fā)現(xiàn)自己一次又一次地選擇它。
偶爾讀到一些寫的不錯(cuò)的勸人不要使用PHP的文章時(shí),我也幾乎被說(shuō)服了,所以我花了很多時(shí)間去學(xué)習(xí)其他語(yǔ)言。我必須承認(rèn)這些探索使我收獲頗豐。雖然我可能在使用上永遠(yuǎn)也達(dá)不到專家級(jí)水平,但是通過(guò)學(xué)習(xí)其他語(yǔ)言,我對(duì)程序員這個(gè)職業(yè)有了更深的理解。
如果說(shuō)從這篇文章中有什么東西要學(xué)的話,那就是:去學(xué)新的語(yǔ)言。但是不是因?yàn)?ldquo;PHP失去生命力了”——這是錯(cuò)誤的觀點(diǎn)。你要學(xué)習(xí)其他的語(yǔ)言是因?yàn)檫@對(duì)于作為程序員的你有好處,如果PHP真的要沒(méi)戲了,那么你更應(yīng)該去學(xué)別的語(yǔ)言。但是此時(shí)此刻,它并沒(méi)有失去生命力。
對(duì)于很多寫PHP的程序員來(lái)說(shuō),當(dāng)他們需要捍衛(wèi)自己的選擇時(shí),他們可能最先會(huì)亮出一些表格,這些表格顯示了PHP在全網(wǎng)的歡迎程度。雖然這些數(shù)字很振奮人心,我還是有些懷疑它們帶有誤導(dǎo)性。
我們必須要認(rèn)識(shí)到PHP受歡迎,是因?yàn)槿藗儗?duì)于WordPress的喜愛(ài)。無(wú)論你喜歡不喜歡WordPress,都必須承認(rèn)它的存在至關(guān)重要。但是說(shuō)實(shí)話,WordPress還是有很多缺陷的,并且不在少數(shù)。但是我知道很多人都用WordPress完成很多了不起的事情,也賺了不少錢。
PHP不是WordPress,即使WordPress深深植根于PHP歷史的土壤中,PHP要比WordPress好得多,好得多得多的多。WordPress有很多不足的地方,PHP也有很多不足的地方,但這并不意味著它們不適用于所有項(xiàng)目。
我一般不會(huì)用C++去寫網(wǎng)絡(luò)程序,至少它會(huì)排在我選擇清單的末尾。但這不是說(shuō)C++就是種不好的語(yǔ)言,它只是不適用而已,就像我不會(huì)用PHP去寫硬件驅(qū)動(dòng)或任何和AI有關(guān)的東西,這已經(jīng)超出了它的能力范圍了。
對(duì)語(yǔ)言的選擇當(dāng)然也和你自身對(duì)它們的掌握程度緊密相連。就像老話說(shuō)的那樣:時(shí)間就是金錢,用新學(xué)的語(yǔ)言去進(jìn)行一個(gè)項(xiàng)目往往是艱巨的,這會(huì)讓本來(lái)就很緊張的時(shí)間雪上加霜。
我對(duì)PHP比較熟悉,所以我往往先選擇它。我略懂一點(diǎn)Python,但是我寫PHP要得心應(yīng)手得多。同一項(xiàng)任務(wù)我也可以選Python,但是花費(fèi)的時(shí)間可能會(huì)是兩倍(至少剛開(kāi)始是這樣的)。這并不是說(shuō)我之后都不會(huì)使用Python或者我對(duì)Python有什么不滿的,只是說(shuō)PHP是我的首選。
學(xué)習(xí)一門編程語(yǔ)言并沒(méi)有那么難,一個(gè)有經(jīng)驗(yàn)的程序員可能花上一個(gè)周末就能掌握一門語(yǔ)言的要點(diǎn)。但是這并不意味著他們懂這門語(yǔ)言。了解哪個(gè)內(nèi)置函數(shù)做什么不叫懂一門語(yǔ)言,你必須要有足夠的經(jīng)驗(yàn)知道什么時(shí)候用什么樣的特性,或者明確這整個(gè)生態(tài)系統(tǒng)如何結(jié)合在一起。
我懂PHP,但我也知道如何設(shè)置一個(gè)Nginx web服務(wù)器、如何配置FPM或opcache。我掌握的足夠多,有能力擺脫依賴的影響,做出正確的選擇。我知道如何在生產(chǎn)環(huán)境中安全地部署PHP應(yīng)用程序,而且我知道如果不小心使用某些語(yǔ)言特性,可能會(huì)帶來(lái)安全問(wèn)題。這些事情不僅僅是“了解”一門語(yǔ)言就能夠知道的。作為程序員,我們需要投入大量的時(shí)間來(lái)學(xué)習(xí)我們選擇的這些語(yǔ)言之外的東西。
這就是為什么當(dāng)有的程序員說(shuō)你選的語(yǔ)言就是“垃圾”,我會(huì)感到非常失望。我花了二十年的時(shí)間去在磨練這方面的技術(shù),現(xiàn)在卻來(lái)了個(gè)人告訴我,我的選擇是錯(cuò)誤的?
其實(shí)這并不是錯(cuò)誤的選擇,PHP給我?guī)?lái)了滿意的工作。我之所以能住上漂亮的房子,能開(kāi)著豪華的轎車,正是因?yàn)槲一?0年時(shí)間精通PHP。扯遠(yuǎn)了,應(yīng)該接著講為什么PHP不是垃圾的。
很多討厭PHP并認(rèn)為它應(yīng)該被淘汰的人,會(huì)列很多點(diǎn)來(lái)證明PHP是大錯(cuò)特錯(cuò)的選擇。有很多我們這幾年來(lái)一直聽(tīng)到的觀點(diǎn)都是針對(duì)PHP的骨灰版本(我不知道為什么每個(gè)人都還抓著PHP4不放,搞啥呢?)。
還有些點(diǎn)根本就是無(wú)稽之談甚至是錯(cuò)誤的。這不是爭(zhēng)奪“我的編程語(yǔ)言比你好”大賽,不需要歇斯底里,我打心底里認(rèn)為每一種編程語(yǔ)言都有它本身的使命。那些發(fā)明這些語(yǔ)言的人(也就是那些比我聰明得多的人)發(fā)明這些語(yǔ)言都是有原因的,編程語(yǔ)言不是隨隨便便就能被搞出來(lái)的東西。
那么,為什么要選PHP呢?
答案很明了:因?yàn)樗驮谀抢铩N沂亲詫W(xué)PHP的,沒(méi)參加過(guò)多少正規(guī)培訓(xùn),除了偶爾參加的網(wǎng)絡(luò)培訓(xùn)課程,我沒(méi)有上面蓋著“我可以教電腦做事情”的名牌大學(xué)畢業(yè)證。
我是學(xué)設(shè)計(jì)出身的,雖然我從大概七歲開(kāi)始擺弄代碼和電腦,但是我對(duì)接受這方面的教育卻沒(méi)有同樣的熱情。我甚至不知道為什么,我熱愛(ài)電腦熱愛(ài)網(wǎng)絡(luò),卻選擇了平面設(shè)計(jì)。我不想贅述這方面的內(nèi)容,因?yàn)殡m然我有這個(gè)學(xué)位,但是它在我今天的工作中卻沒(méi)有起到太大的作用。
我相信和大多數(shù)PHP程序員一樣,我開(kāi)始使用PHP是因?yàn)槲覀兿胍W(wǎng)站做更多,不僅僅是顯示一張圖片和一段文字。當(dāng)我學(xué)會(huì)了如何將數(shù)據(jù)從數(shù)據(jù)庫(kù)里提取出來(lái)顯示在網(wǎng)頁(yè)上時(shí),我萬(wàn)分激動(dòng),這太振奮人心了!這正是我想要的,所以我便一頭扎了進(jìn)去。
后來(lái),我遇到了WordPress。就像那些坐在電腦屏幕前,懂一點(diǎn)PHP基本知識(shí)的自以為是的人改變這一切一樣,WordPress也改變著一切。WordPress的成功要?dú)w于像我這樣的人,我們這些年輕人想要一個(gè)自己的博客,卻不知道怎么自己建立。
你安裝了WordPress……然后添加了一個(gè)插件,改變了主題……然后你對(duì)主題做了一些小小的改變,所以它完成一些其他的東西,或看起來(lái)有點(diǎn)不同。然后你修改了一個(gè)插件。然后你創(chuàng)造了自己的主題。然后你在想,我還能做什么?
所以我認(rèn)識(shí)了PHP,不是我選擇了PHP,而是PHP選擇了我。20年后我還在用PHP創(chuàng)造東西,早就不用WordPress了。我想我已經(jīng)是個(gè)成熟的PHP程序員,有能力來(lái)寫這篇文章了。
“PHP太簡(jiǎn)單了,你應(yīng)該學(xué)點(diǎn)有挑戰(zhàn)性的”
PHP那么受歡迎的其中一個(gè)重要的原因就是它無(wú)處不在,哪里都裝著它。就連你最普通的MacBook中也預(yù)裝了PHP,真見(jiàn)鬼。
從頭寫PHP也非常容易,通常沒(méi)有什么特別的事情需要你做。創(chuàng)建一個(gè)index.php文件,在里面放一行PHP代碼,然后上傳到幾乎所有的共享主機(jī)賬戶:
- <?php
- echo Hello, World! ;
然后就完成了。入門PHP真的特別簡(jiǎn)單,你不需要知道它的工作原理。你安安心心地干就完事了。然而,如果你相信的話,PHP的這種“易操性”實(shí)際上也可能是它的一種缺點(diǎn)。理論上講,如果PHP如此簡(jiǎn)單,那么用PHP編寫危險(xiǎn)的代碼也非常容易。
一想到這,我有點(diǎn)坐立難安。這是否意味著人們不太可能使用那些難的語(yǔ)言來(lái)編寫危險(xiǎn)的代碼?我在哪里讀到過(guò),微軟為Windows發(fā)布的修補(bǔ)程序中,大約有70%是為了解決由c++引起的內(nèi)存問(wèn)題(這話不是我說(shuō)的)。我懷疑用c++寫微軟的人都是業(yè)余的,而且我很確定他們知道自己在做什么。
是的,雖然Windows比你用的購(gòu)物車網(wǎng)站要復(fù)雜得多,但是我認(rèn)為這個(gè)觀點(diǎn)是站得住腳的。Python是公認(rèn)的新手友好型語(yǔ)言,但是卻沒(méi)有人說(shuō)它“危險(xiǎn)”。用任何語(yǔ)言寫任何危險(xiǎn)的代碼都是容易的。不是語(yǔ)言創(chuàng)造了危險(xiǎn)的代碼,而是缺乏相關(guān)的知識(shí)創(chuàng)造了危險(xiǎn)的代碼。
“簡(jiǎn)單”不是勸退新手學(xué)習(xí)PHP的理由,相反,這給了初學(xué)者們更好的工具,好讓他們?cè)趯懘a的時(shí)候做出更好的選擇。這是也是幫助他們找到合適的資源正確學(xué)習(xí)PHP的原因。我還是挺幸運(yùn)的,盡管我寫過(guò)不少“危險(xiǎn)”代碼,我的學(xué)習(xí)之路上總會(huì)有一些貴人(不一定是PHP工程師)來(lái)幫助我找出需要改進(jìn)的地方。
PHP很慢
并不。PHP 可以同步你寫代碼的速度。PHP是一種腳本語(yǔ)言,因此將其與編譯語(yǔ)言進(jìn)行比較是毫無(wú)意義的,然而出于某種原因,我看到甚至有人將PHP與Rust或Go進(jìn)行比較。這些比較沒(méi)什么意思。
把它和python或是Ruby比,可能還好一些,但是一種語(yǔ)言的“速度”是由多種因素決定的,語(yǔ)言本身,還有環(huán)境,運(yùn)行的代碼,解釋器配置方式,等等。憑空就說(shuō)PHP很慢是不夠意思的。
對(duì)于某些類型的任務(wù),PHP確實(shí)很慢。例如,如果從事機(jī)器學(xué)習(xí)領(lǐng)域的工作,可能就別首選PHP (盡管有一些很有趣的項(xiàng)目正展現(xiàn)出一些前景)。
有時(shí)你會(huì)看到一些基準(zhǔn)測(cè)試,兩種語(yǔ)言做同一件事,比如循環(huán)超過(guò)100萬(wàn)條記錄,做一些簡(jiǎn)單的計(jì)算。結(jié)果往往相差幾毫秒,這常常有時(shí)候被用來(lái)證明PHP運(yùn)作慢(有時(shí)候用來(lái)證明快)。如果你編寫的軟件,在對(duì)一百萬(wàn)條記錄進(jìn)行循環(huán)時(shí),多花幾毫秒就會(huì)造成災(zāi)難性的后果,那也無(wú)話可說(shuō)。
WordPress挺垃圾的
我還蠻同意這個(gè)觀點(diǎn)的。目前我不太喜歡WordPress,但是我也承認(rèn)沒(méi)有WordPress,我們很可能也不會(huì)有今天的PHP社區(qū)。然而,因?yàn)橐粋€(gè)軟件就說(shuō)一種語(yǔ)言不好也有點(diǎn)草率。這就好像因?yàn)槟悴幌矚gMicrosoft Windows,就說(shuō)C++是一種垃圾語(yǔ)言一樣。
PHP不是只有一種功能,WordPress也只是它的一部分。如果你想的話,有大量的框架和軟件包供你選擇。人們說(shuō)Laravel是“讓PHP再次炫酷”。我必須承認(rèn),這個(gè)框架是到目前為止我最喜歡的框架之一,并且對(duì)我來(lái)說(shuō)在大多數(shù)項(xiàng)目中選它都是最容易的。
因?yàn)閃ordPress是由PHP寫的,就說(shuō)PHP不好有失公允。有人可能會(huì)說(shuō)WordPress反映了PHP的局限性,但那是很久以前的事了,而且從那時(shí)起這門語(yǔ)言已經(jīng)成熟了很多。
PHP不適合企業(yè)使用
為什么呢?我都不知道這種言論從何而來(lái),但這種風(fēng)真的很大。那么什么才能讓一種語(yǔ)言“適合企業(yè)”呢?Java可能是最受企業(yè)歡迎的一種語(yǔ)言之一了,但是并不是因?yàn)镴ava本身是適合企業(yè)的。是因?yàn)镴ava EE平臺(tái)的存在,我不是Java開(kāi)發(fā)人員,所以有錯(cuò)歡迎糾正。
在我看來(lái),Java是一種構(gòu)建企業(yè)應(yīng)用軟件的平臺(tái)。聽(tīng)起來(lái)有點(diǎn)像一個(gè)框架,對(duì)吧?所以可能這個(gè)問(wèn)題應(yīng)該是:“我最喜歡的PHP框架是不是適合企業(yè)的呢?”
要回答這個(gè)問(wèn)題的話要再寫一篇文章了。我想說(shuō)的點(diǎn)就是PHP和其他任何語(yǔ)言一樣,都是足夠適合企業(yè)使用的。這完全取決于你怎樣用它。
順便提一下,我曾是一個(gè)小型團(tuán)隊(duì)的一員,這個(gè)團(tuán)隊(duì)在南非一家最重要的金融機(jī)構(gòu)的內(nèi)部網(wǎng)絡(luò)上構(gòu)建并部署了一個(gè)事件管理平臺(tái)(我可能會(huì)寫一些我在這方面的經(jīng)驗(yàn))。該應(yīng)用程序完全是用PHP和JavaScript編寫的。
隨著新冠疫情的全面爆發(fā),整個(gè)系統(tǒng)承受著巨大的壓力,但它幾乎應(yīng)付了所有的壓力。我們也遇到了一些問(wèn)題,但都很快解決了。
PHP不可擴(kuò)展
這可能是唯一一個(gè)有點(diǎn)理?yè)?jù)的觀點(diǎn)了,但是這比你想象的要復(fù)雜許多。事實(shí)上,如果你編寫了像樣的代碼,PHP就能很好的擴(kuò)展。當(dāng)人們說(shuō)PHP不可擴(kuò)展時(shí),他們通常指的是用PHP編寫的應(yīng)用程序可能無(wú)法處理非常大量的請(qǐng)求(比如數(shù)百萬(wàn))。
問(wèn)題是,這并不是那么簡(jiǎn)單的,我認(rèn)為很多對(duì)它的誤解來(lái)自于WordPress,最近WordPress因有擴(kuò)展性問(wèn)題而出名。
來(lái)舉個(gè)例子,Slack是一個(gè)通訊平臺(tái),曾一度想要取email,它有幾百萬(wàn)的用戶,他們每天用的這個(gè)系統(tǒng)的后端就是用PHP寫的。如果這還不能說(shuō)明PHP可擴(kuò)展,那我也無(wú)話可說(shuō)了。
很多人引用Facebook作為一個(gè)很好的例子,即使我認(rèn)為Facebook在一些形式上還使用PHP,但是大部分的應(yīng)用都不用PHP了。但是說(shuō)實(shí)話,F(xiàn)acebook這個(gè)例子有點(diǎn)特殊。
談?wù)摂U(kuò)展性繞不開(kāi)基礎(chǔ)設(shè)施。如果你在一個(gè)簡(jiǎn)單的共享主機(jī)上托管一個(gè)WordPress博客,然后你突然得到成千上萬(wàn)的點(diǎn)擊……這可能是一個(gè)問(wèn)題,你的主機(jī)會(huì)給你發(fā)一封令人討厭的郵件,或者至少會(huì)給你開(kāi)出比你預(yù)想的多得多的賬單。
擴(kuò)展應(yīng)用程序涉及的不僅僅是語(yǔ)言選擇。有很多變化的部分,每當(dāng)PHP首當(dāng)其沖受到指責(zé)時(shí),我都感到難過(guò)。在適合的環(huán)境和配置下,新版本的PHP完全能夠每秒處理大量請(qǐng)求。Laravel Vapor是一個(gè)在AWS上運(yùn)行的Laravel應(yīng)用程序的第一方無(wú)服務(wù)器平臺(tái),它有一些非常令人印象深刻的數(shù)字。
我有時(shí)候覺(jué)得擴(kuò)展性這個(gè)問(wèn)題有點(diǎn)夸張,我寫PHP20多年了,我從來(lái)都沒(méi)有遇到過(guò)每秒“數(shù)百萬(wàn)個(gè)請(qǐng)求”的情況。甚至類似的情況也沒(méi)有。我們絕大多數(shù)的人都沒(méi)有機(jī)會(huì)去建立下一個(gè)Facebook,無(wú)論我們有多想。
在現(xiàn)實(shí)中,我們建立的軟件有針對(duì)性多了。我們打交道的是特定國(guó)家里的特定行業(yè),所以我們不用擔(dān)心需要面臨每秒數(shù)百萬(wàn)個(gè)請(qǐng)求的情況。對(duì)于我們參與的許多項(xiàng)目來(lái)說(shuō),這是一個(gè)巨大的數(shù)字。這并不意味著我們所做的不重要,只是意味著我們不需要考慮那種規(guī)模,擴(kuò)展應(yīng)用程序以處理數(shù)百萬(wàn)個(gè)請(qǐng)求并不是我們?nèi)粘9ぷ鞯囊徊糠帧?/p>
PHP好丑
你怕不是在開(kāi)玩笑吧,我把最煩人的這個(gè)觀點(diǎn)留到最后說(shuō)。如果你是根據(jù)外觀來(lái)挑選技術(shù)堆棧的話,那我想說(shuō)你錯(cuò)了,你真的需要去重新評(píng)估一下你的選擇方式了。
話雖這么說(shuō),我認(rèn)為PHP一點(diǎn)也不難看。有的人覺(jué)得不好看很可能是很早之前在HTML使用PHP,HTML是真的難看。問(wèn)題是:現(xiàn)在沒(méi)人這么干了,再有人這么干會(huì)被嫌棄的。
我不是說(shuō)那些所謂的“美麗的語(yǔ)言”是不好的選擇,但是“好看不好看”不應(yīng)該成為你的評(píng)價(jià)標(biāo)準(zhǔn)。Java非常不好看,但卻是世界上最受歡迎的語(yǔ)言之一。鼓吹因?yàn)镻HP難看而不要用PHP真的太傻了。
PHP可能不是最美麗的語(yǔ)言,但是我發(fā)現(xiàn)寫得好的話還是很有可讀性的。PHP8也有一些新的工具可以讓你的代碼看起來(lái)更“美麗”。
我愛(ài)PHP
我真的愛(ài)PHP。我愛(ài)這種編程語(yǔ)言和它的生態(tài)系統(tǒng)。我愛(ài)它在過(guò)去幾年中的完善,PHP 8不僅僅是同一種語(yǔ)言的另一種迭代。隨著每個(gè)主要版本的發(fā)布,我們得到了更好和更有用的工具。
我喜歡PHP的易上手,但我也喜歡它的復(fù)雜,要成為一名專業(yè)的PHP程序員有太多要學(xué)的東西了。我喜歡Symfony 和Laravel,我認(rèn)為開(kāi)發(fā)團(tuán)隊(duì)作為PHP的核心,一直在推動(dòng)這種語(yǔ)言的進(jìn)步。
但是我最喜歡部分的還是當(dāng)一個(gè)程序員。不僅僅是寫PHP,我喜歡用任何語(yǔ)言寫。我喜歡我可以告訴電腦可以去做什么以及我教會(huì)了我自己如何去這么做。這歸功于PHP。
沒(méi)有PHP,我不知道現(xiàn)在的自己會(huì)從事什么工作。也許我會(huì)成為一個(gè)平庸的設(shè)計(jì)師,然后討厭我的工作和生活(沒(méi)有冒犯設(shè)計(jì)師朋友們的意思,我也有一些才華橫溢的設(shè)計(jì)師朋友們,他們很熱愛(ài)自己的工作)。
但是最終,我用我愛(ài)的編程語(yǔ)言從事了熱愛(ài)的工作。
本文轉(zhuǎn)載自微信公眾號(hào)「讀芯術(shù)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系讀芯術(shù)公眾號(hào)。