0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么說PHP是最糟糕的編程語言

程序人生 ? 來源:CSDN ? 作者:Oscar Merida ? 2021-10-08 16:50 ? 次閱讀

PHP是一門有趣的編程語言。語言與利用語言構(gòu)建的程序通常屬于兩種設(shè)計理念。這里我指的不是瀑布式或敏捷之類的軟件開發(fā)生命周期,而是軟件管理的基本思想。有人將這些思想稱為“正確的方式”以及“Worse is Better”。

PHP包含一些奇怪的問題,很多人由于這些問題而貶低這門語言,但他們也沒有錯。這門語言有很多問題。有人嘲笑PHP糟糕的設(shè)計,還提出了一些正確的觀點,盡管這些觀點是九年前提出的,但它們依然是正確的。然而,開發(fā)人員卻可以利用PHP創(chuàng)建結(jié)構(gòu)“正確”的軟件,而且還引入了其他公認(rèn)好評的實踐。你可能接觸過Laminas和Symfony之類的框架,它們擁有最佳面向?qū)ο缶幊虒嵺`,開發(fā)人員可以利用這些框架編寫結(jié)構(gòu)正確的代碼。為什么會這樣?因為PHP是最糟糕的編程語言。

設(shè)計軟件

1991年,Richard P. Gabriel發(fā)表了一篇題為《Lisp: Good News,Bad News, How to Win Big”》的論文。該論文的論點是,對于軟件的設(shè)計和壽命,“Worse is Better”,也就是說越糟越好。他之所以得出這樣的觀點,是因為他意識到程序設(shè)計出現(xiàn)了兩種截然不同的流派,他稱之為“MIT/Standford Style”(學(xué)院派)和“The Right Way”(正確的方式,又稱新澤西風(fēng)格,即后來的Worse is Better)。

這兩種理念的目標(biāo)相似,但對關(guān)鍵領(lǐng)域的看法不同。兩種風(fēng)格都側(cè)重于四大關(guān)鍵思想領(lǐng)域:簡單性、正確性、一致性和完整性。學(xué)院派的風(fēng)格描述為:

簡單性:設(shè)計必須簡單,無論是實現(xiàn)還是接口。接口的簡單性比實現(xiàn)的簡單性更重要。

正確性:所有可觀察方面的設(shè)計必須都是正確的。絕對不允許錯誤。

一致性:設(shè)計不能出現(xiàn)不一致。為了避免不一致,允許設(shè)計稍微削弱簡單性和完整性。一致性與正確性同樣重要。

完整性:設(shè)計必須盡可能涵蓋重要情況。必須涵蓋所有合理預(yù)期的情況。不允許簡單性過度降低完整性。

至于新澤西風(fēng)格,Gabriel認(rèn)為的目標(biāo)是:

簡單性:設(shè)計必須簡單,無論是實現(xiàn)還是接口。實現(xiàn)的簡單性比接口的簡單性更重要。簡單性是設(shè)計中最重要的考慮因素。

正確性:所有可觀察方面的設(shè)計必須都是正確的。但是簡單性比正確性略微重要一點。

一致性:設(shè)計不能過于不一致。在某些情況下,為了簡單性,可以犧牲一致性。盡管如此,為了避免引入實現(xiàn)的復(fù)雜性或不一致,最好放棄設(shè)計中不太常見的情況。

完整性:設(shè)計必須盡可能涵蓋重要情況。必須涵蓋所有合理預(yù)期的情況。但是為了其他目標(biāo),可以犧牲完整性。事實上,一旦危及實現(xiàn)的簡單性,就必須犧牲完整性。如果可以保持簡單性,則可以犧牲一致性來實現(xiàn)完整性,接口的一致性尤其沒有價值。

爭論的關(guān)鍵是以LISP和C為例,討論為什么越糟越好。Gabriel 是一名 LISP 程序員,他認(rèn)為LISP比C更好。LISP 不僅和C一樣快,而且Common LISP花費了數(shù)年時間進行設(shè)計、開發(fā)和標(biāo)準(zhǔn)化。定義語言的規(guī)范充分利用了各種不同版本的LISP的優(yōu)點,而且LISP是最好的現(xiàn)代開發(fā)環(huán)境之一。

LISP 是正確的方式

LISP代表了軟件開發(fā)的“正確方式”。LISP易于交互,你可以通過各種方式與之交互。想通過Fortran調(diào)用 LISP?你可以通過Fortran調(diào)用LISP并傳入輸入數(shù)據(jù),反之亦然。在處理遺留代碼時,你可以奢侈地享受 LISP 的所有現(xiàn)代特性。LISP的規(guī)范保證了設(shè)計的一致性。

看一看Python之類的現(xiàn)代語言就會發(fā)現(xiàn),規(guī)范對于提供多個后端和編譯器提供了很大幫助,所有解釋或編譯代碼的方式都相同。LISP的工具是一流的,1991年的LISP就擁有我們至今仍在享受的各種“福利”,比如逐步調(diào)試、數(shù)據(jù)檢查和精美的編輯器。作為一種語言,LISP是完備的。它具有先進的面向?qū)ο缶幊虒印⒍嘀乩^承、一流的對象以及函數(shù)和類型。LISP似乎是開發(fā)人員心中所想的編程語言。

1991年是LISP這門編程語言的最佳時期。這種技術(shù)上的正確性并不是由實際使用來證實的。LISP的開發(fā)正在走下坡路。多年的負(fù)面新聞和定位失誤影響了 LISP 的外部聲譽,不再被視為向最終用戶提供軟件的一種方式。在開發(fā)方面,LISP提倡的很多思想與“預(yù)先做大量的設(shè)計”不謀而合。如果你曾使用過諸如瀑布模型之類的設(shè)計方法,就能看出一些問題?!罢_的方式”非常強調(diào)一致性、正確性,并確??紤]到所有可以想到的問題。

LISP本身也不止一種語言,它有一個語言家族。雖然 Common LISP是標(biāo)準(zhǔn),但 LISP 本身也可用于實現(xiàn)各種基本的功能。Lockless Inc網(wǎng)站上的一篇文章認(rèn)為,這種分化是LISP最終失敗的決定性原因之一。即使LISP堅持軟件設(shè)計的“正確方式”,但這種分化導(dǎo)致代碼維護和可移植性均受到了影響。

C 和 Unix 是錯誤的方式

與此同時,多虧了Unix,C成為了開發(fā)軟件的首選語言。C是為Unix設(shè)計的,而 Unix是從C設(shè)計出來的。C的開發(fā)人員采取的設(shè)計方式與LISP不同。1972年,C還是一門非常簡單的編程語言。到1991年,C發(fā)生了一些變化,但基本原理沒有改變。功能都是根據(jù)開發(fā)人員的需要和 Unix 的需要添加的。編寫編譯器和程序很容易,因為語言本身非常簡單。雖然你也可以利用C編寫復(fù)雜的程序,但與LISP相比,估計C只擁有程序員想要的50%~80%的功能。然而,C的便攜性非常驚人。

與通常用于LISP軟件和環(huán)境的硬件相比,C還可以在能力有限的硬件上運行。因此,C能夠在更廣泛的機器上編譯和運行軟件。C 軟件和Unix非常容易運行,Gabriel認(rèn)為Unix和C會像病毒一樣流傳開來。C的開發(fā)始于 Dennis Ritchie 設(shè)計和構(gòu)建Unix時。由于貝爾實驗室不被允許正式進入計算機領(lǐng)域,因此 Unix 很容易分發(fā)給其他的各種用戶。這些用戶為了滿足自己的需求給Unix打補丁。

Dennis Ritchie能夠根據(jù)需要合并這些補丁,而不必提前想好這些需求。與LISP不同,C至今仍被廣泛使用。雖然PHP、JavaScript和Python等高級語言和解釋性語言是許多開發(fā)人員的首選,但許多高級語言都是用C開發(fā)的。盡管如今出現(xiàn)了像Rust這樣的競爭對手,但在小型低功率設(shè)備上運行仍然是C的優(yōu)勢。

PHP最糟糕

首先,越糟越好的軟件會被接受;其次,用戶的期望更低;第三,這些軟件可以被改進,直到接近“正確”的程度?!?Richard Gabriel幾年后,Rasmus Lerdorf開始致力于創(chuàng)建個人主頁/表單解釋器(Personal Home Page/Forms Interpreter),即我們現(xiàn)在所說的PHP。PHP/FI的誕生是因為Lerdorf 需要維護他的主頁,并與表單和數(shù)據(jù)庫進行交互。PHP/FI的設(shè)計甚至稱不上編程語言,而是作為C之上的腳本和函數(shù)層。

PHP 很簡單

設(shè)計必須簡單,無論是實現(xiàn)還是接口。實際上,PHP底部使用了C語言,我們認(rèn)為這是“最糟糕的”。然而,這帶來了一些優(yōu)勢,最重要的是,簡單的底層語言更加方便擴展。雖然 Hack/HHVM 采用了更多的C++方法,但PHP本身仍然是C語言。

你可以在短短幾個小時內(nèi)學(xué)習(xí) PHP 語言的內(nèi)部結(jié)構(gòu)。Elizabeth Smith 曾發(fā)表過一個關(guān)于 PHP 擴展的精彩演講(https://www.slideshare.net/auroraeosrose),其中介紹了大量關(guān)于 PHP 的內(nèi)部工作原理。PHP借鑒了其他C風(fēng)格的語言,不僅方便閱讀,而且還可以切換成C風(fēng)格系列的其他語言。PHP的大部分接口或標(biāo)準(zhǔn)庫都很簡單,因為大部分核心功能只不過是對各種C庫進行了包裝,然后原封不動地公開了。雖然這會導(dǎo)致接口的不一致,但也為C或C++開發(fā)人員提供了一個熟悉的環(huán)境。

PHP語言主要用于Web開發(fā)。你可以很容易地從該語言中找到某個HTTP的概念。想要獲取請求的標(biāo)頭?可以直接使用get_headers()。想要獲取請求信息?只需讀取全局變量$_GET 和 $_POST。PHP的接口很簡單,而且內(nèi)部結(jié)構(gòu)也非常簡單。

PHP(幾乎)是正確的

所有可觀察方面的設(shè)計必須都是正確的。簡單性比正確性更好。此處,在簡單性與正確性的選擇中,PHP更傾向于“簡單”。在HHVM出現(xiàn)之前,并沒有任何關(guān)于PHP的外觀或功能的規(guī)范。Zend解釋器本身就是規(guī)范,而且該語言的行為方式始終是“正確的”(不包括實際的 bug)。

如果你想替換掉PHP 引擎,則需要實現(xiàn)該引擎的所有怪癖。許多核心函數(shù)的參數(shù)和返回類型都不是特別嚴(yán)格,主要目的是讓系統(tǒng)更易于使用。例如strpos()等函數(shù)的返回值可以是整數(shù)或布爾值,這比嚴(yán)格設(shè)計的返回整數(shù)或拋出異常的方法更容易使用??纯碢HP語言的發(fā)展,幾乎所有新功能都是以開發(fā)人員的需求為基礎(chǔ),而不是追求“正確”。更多地關(guān)注嚴(yán)格的類型和異常錯誤是一種更正確的方式。

盡管如此,短箭頭函數(shù)、屬性和枚舉之類功能才是開發(fā)人員希望簡化對代碼。

PHP 不必保持一致性

設(shè)計不能過于不一致。在某些情況下,為了簡單性,可以犧牲一致性。我從不會說PHP具有一致性,但它的一致性已經(jīng)足夠了。提及數(shù)組與字符串函數(shù),人們可能會抱怨Needle/haystack的參數(shù)順序。不過一般來說,數(shù)組函數(shù)是一致的,字符串函數(shù)是一致的。

與保持語言的一致性相比,保持與底層 C 庫的一致更簡單。PHP在其他方面也很一致。比如strpos()函數(shù),PHP的函數(shù)在遇到錯誤時,就會返回FALSE,這一點非常一致。不一定正確,但很一致。函數(shù)命名是否帶下劃線往往也是與底層庫保持一致。PHP語言為了簡單性犧牲了一致性,但即使沒有規(guī)范,它也在努力在有意義的地方保持一致。

PHP 的完整性符合一定的需求

設(shè)計必須盡可能涵蓋重要情況。在某些時候,PHP盡可能保持完備,它符合設(shè)計的需求:編寫Web應(yīng)用程序。PHP的設(shè)計目標(biāo)從來不是成為一種適用于所有編程問題的語言。盡管如此,由于簡單性,PHP也適用于Web之外的編程。PHP最初的目的就是為Web編程提供最基本的功能,而且一直延續(xù)至今。核心語言的變化主要由開發(fā)人員的需求驅(qū)動。整個社區(qū)提出修改意見,然后經(jīng)由社區(qū)投票,決定新功能被拒絕、修改還是接受。該語言中的大部分創(chuàng)新都是因為我們需要更快地完成工作。

即使我們竊取其他語言的特性,也是因為這些特性能夠減輕開發(fā)人員的負(fù)擔(dān),很少是因為另一種語言“更正確”。如今你可以利用PHP構(gòu)建Web應(yīng)用程序,而且在接下來的五年內(nèi)你還可以繼續(xù)用PHP制作Web應(yīng)用程序,只不過會添加一些新功能。然而,這種語言本身已經(jīng)達成所需。如果有需要,我們可以隨時添加新功能或修改語言。

越糟越好嗎?

Gabriel承認(rèn),“越糟越好”的思想是說設(shè)計看起來很糟糕,可能不應(yīng)該作為更好的選擇。唯一的問題是,審視這兩種設(shè)計理念,比較學(xué)院派與“正確的方法”,那么自然“越糟越好”是更靈活的選擇,還有“具有更好的生存特性”??纯?PHP,它證實了“越糟越好”的思想。在此期間,Gabriel承認(rèn)他也很猶豫哪種理念更好。作為一個社區(qū),PHP不斷爭論我們應(yīng)該正確地做事還是繼續(xù)簡單地做事。

我們有像Laminas這樣的框架,以經(jīng)典的計算機科學(xué)方式構(gòu)建的庫,還有Laravel這樣的框架關(guān)注開發(fā)人員的體驗和速度??梢哉fPHP二者兼具。下次再聽到有人批評PHP,就隨他們?nèi)グ伞?/p>

這種語言確實很糟糕,但PHP的長盛不衰以及廣泛使用證明了這樣一個事實:“正確的方式”未必比“最糟”更好。如果有人抱怨你使用的框架,也無需在意,從長遠來看這無關(guān)緊要。更重要的是,選擇一種舒服的設(shè)計理念,并告訴自己“越糟越好”。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3543

    瀏覽量

    93468
  • PHP
    PHP
    +關(guān)注

    關(guān)注

    0

    文章

    452

    瀏覽量

    26614

原文標(biāo)題:PHP 是最糟糕編程語言?

文章出處:【微信號:coder_life,微信公眾號:程序人生】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    PLC的編程方式及編程語言

    在工業(yè)自動化領(lǐng)域,PLC(Programmable Logic Controller,可編程邏輯控制器)因其強大的控制功能和靈活的編程方式而得到了廣泛應(yīng)用。PLC的編程方式和編程
    的頭像 發(fā)表于 06-27 14:08 ?492次閱讀

    PLC編程語言和C語言的區(qū)別

    在工業(yè)自動化和計算機編程領(lǐng)域中,PLC(可編程邏輯控制器)編程語言和C語言各自扮演著重要的角色。盡管兩者都是
    的頭像 發(fā)表于 06-14 17:11 ?2059次閱讀

    php是什么

    頁。 PHP不僅支持面向?qū)ο蟮?b class='flag-5'>編程方式,還提供了面向過程的編程功能,使得它在編程時具有很高的靈活性。它的這些特點使其 在全球范圍內(nèi)成為了非常受歡迎的
    發(fā)表于 01-30 16:33

    PHP中數(shù)組的使用方法!

    PHP中數(shù)組的使用方法! PHP是一種廣泛使用的網(wǎng)絡(luò)編程語言,它的數(shù)組功能非常強大且靈活。數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),它允許我們在單個變量中存儲多個值。 在本篇文章中,我將詳細解釋
    的頭像 發(fā)表于 01-12 15:11 ?456次閱讀

    php編程用什么軟件

    PHP編程過程中,有許多不同的開發(fā)軟件可供選擇。以下是一些常用的PHP開發(fā)工具,它們可以幫助程序員編寫、調(diào)試和測試PHP代碼。 PHPStorm PHPStorm是一款強大的集成開發(fā)
    的頭像 發(fā)表于 12-04 16:20 ?2537次閱讀

    php的優(yōu)點和缺點分別是什么

    PHP是一種廣泛應(yīng)用于Web開發(fā)領(lǐng)域的腳本語言,它有著許多獨有的優(yōu)點和缺點。 一、PHP的優(yōu)點: 1.易于學(xué)習(xí)和使用:PHP語法簡單易懂,類似于C
    的頭像 發(fā)表于 12-04 16:16 ?2133次閱讀

    php的源碼是什么開源語言

    PHP的源碼是用C語言編寫的,是一種開源的服務(wù)器端腳本語言。下面是關(guān)于PHP源碼的詳細介紹。 一、PHP簡介
    的頭像 發(fā)表于 12-04 16:11 ?1537次閱讀

    php的mysql無法啟動

    MySQL是一種常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),而PHP是一種廣泛應(yīng)用于服務(wù)器端的腳本語言。在使用PHP開發(fā)網(wǎng)站或應(yīng)用時,經(jīng)常會碰到MySQL無法啟動的問題。本文將詳細介紹解決MySQL無法啟動的方法
    的頭像 發(fā)表于 12-04 15:59 ?1246次閱讀

    php的源碼是開放的嗎

    PHP是一種開源的腳本語言,其源代碼完全開放并可免費獲取、使用和修改。這篇文章將詳細介紹PHP的源碼開放性。 一、PHP的源碼開放性 PHP
    的頭像 發(fā)表于 12-04 15:57 ?1116次閱讀

    php的適用范圍

    網(wǎng)頁還是復(fù)雜的Web應(yīng)用,PHP都可以勝任。它可以與HTML嵌入使用,使網(wǎng)頁內(nèi)容動態(tài)生成。與其他編程語言相比,PHP的語法相對簡單,上手難度較低,因此很多初學(xué)者選擇
    的頭像 發(fā)表于 12-04 15:54 ?464次閱讀

    php的特點有哪些

    ,如今已經(jīng)成為最流行的Web開發(fā)語言之一。以下將詳細介紹PHP的特點。 1.易學(xué)易用:PHP語法簡單易懂,與其他編程語言相比,學(xué)習(xí)和使用
    的頭像 發(fā)表于 12-04 15:50 ?1366次閱讀

    php和python一樣嗎

    PHP和Python是兩種不同的編程語言,盡管它們都用于開發(fā)Web應(yīng)用程序,但它們有許多不同之處。從語法、用途、社區(qū)到性能和生態(tài)系統(tǒng)等方面來講,PHP和Python在許多方面都有不同之
    的頭像 發(fā)表于 12-04 15:47 ?973次閱讀

    php是前端還是后端

    PHP(Hypertext Preprocessor)是一種流行的服務(wù)器端編程語言,用于開發(fā)動態(tài)網(wǎng)站和Web應(yīng)用程序。盡管在某些情況下也可以在前端使用,但PHP主要被廣泛應(yīng)用于后端開發(fā)
    的頭像 發(fā)表于 12-04 15:46 ?2138次閱讀

    php運行機制和原理

    PHP是一種在服務(wù)器端執(zhí)行的腳本語言,它被廣泛用于開發(fā)動態(tài)網(wǎng)站。它的運行機制和原理非常重要,因為它決定了PHP腳本如何被解釋執(zhí)行和與服務(wù)器進行交互。 PHP的運行機制
    的頭像 發(fā)表于 12-04 15:28 ?835次閱讀

    php運行環(huán)境的配置步驟

    PHP是一種廣泛使用的服務(wù)器端腳本語言,被用來開發(fā)Web應(yīng)用程序。為了在計算機上運行PHP代碼,我們需要配置PHP運行環(huán)境。本文將詳細介紹PHP
    的頭像 發(fā)表于 12-04 15:27 ?1070次閱讀