2019年了,PHP已再也不是當年那個「設計糟糕」的語言

以前,有一篇很是流行的博客文章是「PHP:那些糟糕的設計」,第一次讀到這篇博客的時候,我正在一個很是破舊的地方工做,處理着許多 PHP 遺留項目。這篇博客對我觸動很深,我開始思考是否要中止編程,換一份徹底不一樣的工做。文章地址:php

https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/git

幸運的是,很快我就換了一份工做,而 PHP 在 5.X 版本以後又有了不少新的改進。今天,我要向那些再也不使用 PHP 編程,或者陷入遺留項目的人致敬。github

劇透:直到今天,PHP 仍有不少糟糕的東西,例如許多核心功能仍然存在不一致的方法簽名,仍然存在使人混淆的配置設置,仍然會有一些開發者由於知識的缺少而致使寫的代碼很糟糕等等。web

可是,本文我想把目光集中在 PHP 已經改進的地方上面,以及如何寫出更加乾淨和易維護的 PHP 代碼。也許你不會改變對 PHP 的見解,但頗有可能,你會驚訝於過去幾年 PHP 的進步。編程

要   點安全

  • PHP 每一年都會推出一個新的版本;服務器

  • 自 PHP 5 代以後,其性能不斷提高;閉包

  • 有框架、包和平臺組成的活躍生態系統;app

  • 過去幾年間,PHP 添加了許多新的特性,且如今仍在持續演進;框架

  • 許多工具如靜態分析器也愈加成熟,將來也將繼續發展。

更新:不少人但願我可以展現一下實際代碼,這是我其中一個業餘項目的源代碼,它是用 PHP 和 Laravel 寫的,另外還有一個是咱們在辦公室負責維護的上百個 OSS 包的列表。

  • https://github.com/brendt/aggregate.stitcher.io

  • https://spatie.be/open-source/packages

回顧歷史

讓咱們先快速回顧一下 PHP 的版本發佈週期。如今 PHP 的版本是 7.3,預計 2019 年底將發佈 PHP 7.4,7.4 以後的版本將會是 PHP 8.0。

從 5.X 版本以後,PHP 核心團隊一直在努力每一年發佈一個新版本,而且在過去的 4 年間,這一目標一直完成得很好。

大體來講,每一個新版本都會用 2 年時間進行積極地支持,而後用一年進行「安全修補」工做。這樣作的目的是促使 PHP 開發者儘量保持最新狀態,例如每一年都升級比從 5.4 直接跳到 7.0 要簡單得多。

PHP 具體的版本發佈狀況,能夠查看:

https://www.php.net/supported-versions.php

搞清楚 PHP 的發展歷程後,咱們來談談你們對 PHP 的常見誤解。

PHP 的性能

在 5.X 版本時代,PHP 的性能平均而言是最好的。而在 7.0 時代,大部分的 PHP 核心都從零開始重寫了,其性能可以達到以前的 2-3 倍。口說無憑,幸運的是,有人花了大量時間來測量 PHP 的性能,Kinsta 提供了一個很好的更新列表。

從 7.0 版本以來,PHP 性能就只升不降。PHP web 應用的性能能夠和其餘語言 web 框架的性能相提並論,甚至更高。具體測試狀況可查看:

https://github.com/the-benchmarker/web-frameworks

固然,PHP 框架的性能還沒法超越 C 和 Rust,可是要比 Rails 或 Django 好,且可以和 ExpressJS 相媲美。

框架和生態系統

在談到框架時,PHP 已經再也不只是 WordPress 了。做爲職業的 PHP 開發者,我認爲,WordPress 沒法從任何層面表明當今的生態系統。

整體來講,有 2 個主要的 web 應用框架以及一些相對而言較小的框架,如 Symfony 和 Laravel。除此以後,還有 Zend、Yii、Cake、 Code Igniter 等等。

若是你想了解現代 PHP 開發到底是什麼樣子,那麼就須要掌握 Symfony 和 Laravel 中的一個,這 2 個框架都有龐大的生態系統,包含各類包和產品。從管理面板和客戶關係管理系統 (CRM) 到單獨的包,從持續集成 (CI) 到性能監視工具,咱們有無數的服務如 web 套接字服務器、隊列管理器、支付集成等等。

可是,這些框架都是爲實際開發而設計的。若是你須要純粹的內容管理,WordPress 和 CraftCMS 是理想選擇,並且它們還會不斷優化。

衡量 PHP 生態系統目前狀態的方法是看一看 Packagist,它是 PHP 主要的包倉庫。在過去的時間裏,它呈現出了指數式增加的態勢,天天 2500 萬左右的下載量,足以說明 PHP 生態系統已經再也不是過去那種弱者了。

Packagist 網站上列出了過去的包和版本數量:

圖片

除了應用框架和內容管理系統 (CMS) 之外,咱們還發現,在過去幾年,異步框架也崛起了。

異步框架是指用 PHP 或其它語言編寫的框架和服務器,它們可以讓用戶運行真正異步的 PHP。異步框架的例子包括:Swoole、Amp 和 ReactPHP。

因爲咱們已經進入異步領域,具備大量 IO 的 web 套接字和應用等東西在 PHP 世界中就變得很是重要。

另外,人們還談到了內部郵件列表,在郵件列表中,PHP 核心開發者討論了 PHP 語言的進一步發展,例如增長 libuv 到核心之中。對於不熟悉 libuv 的人來講,libuv 同 Node.js 用於實現其全部異步性的庫如出一轍。

語言自己

儘管異步 (async) 和等待 (await) 還未面市,但 PHP 在過去幾年已經通過了許多改進,下面即是 PHP 新特性的不徹底列表:

  • 短閉包

    https://stitcher.io/blog/short-closures-in-php

  • 空合併運算符

    https://stitcher.io/blog/shorthand-comparisons-in-php#null-coalescing-operator

  • Traits

    https://www.php.net/manual/en/language.oop5.traits.php

  • 屬性類型

    https://stitcher.io/blog/new-in-php-74#typed-properties-rfc

  • 擴散運算符

    https://wiki.php.net/rfc/argument_unpacking

  • JIT 編譯器

    https://wiki.php.net/rfc/jit

  • FFI

    https://wiki.php.net/rfc/ffi

  • 匿名類

    https://www.php.net/manual/en/language.oop5.anonymous.php

  • 聲明返回類型

    https://www.php.net/manual/en/functions.returning-values.php#functions.returning-values.type-declaration

  • 現代密碼學

    https://wiki.php.net/rfc/libsodium

  • Generators

    https://wiki.php.net/rfc/generators

  • 其餘

    https://www.php.net/ChangeLog-7.php

儘管咱們的主題是 PHP 的語言特性,但我仍是以爲須要談一下 PHP 語言的開發流程。雖然社區被容許提出 RFC,但仍有一個活躍的志願者核心團隊在推進 PHP 的發展。在添加一個新的語言特性以前,必需要進行投票。只有得到 2/3 多數選票的 RFC 才能被添加到核心中。

大約有 100 我的能夠投票,但你不須要給每一個 RFC 投票。核心團隊的成員毋庸置疑可以投票,由於他們必須維護代碼庫。除了他們之外,還有一羣人是單獨從 PHP 社區中挑選出來的,這些人員包括 PHP 文件的維護人員,PHP 總體項目的貢獻者,以及 PHP 社區中頗具威望的開發者。

雖然大多數核心開發是由志願者組成的,但其中一名核心 PHP 開發者 Nikita Popov 近期被 JetBrains 僱傭,並全職負責該語言的開發。另一個例子是 Linux 基金會決定投資 Zend 框架。上述這些僱傭和收購行爲確保了將來 PHP 開發的穩定性。

工   具

除了核心自己,咱們還目擊了過去幾年間工具的增加。首先進入我腦海的是靜態分析器如 Vimeo 發明的 Psalm,以及 Phan 和 PHPStan。

這些工具可以靜態分析 PHP 代碼,而且報告打字錯誤、可能的 bug 等等。在某些方面,它們提供的功能足以和 TypeScript 相媲美,但目前 PHP 尚未被轉編譯 (transpile),所以它並不支持定製句法。

雖然這意味着咱們必須依賴於文檔塊,但 PHP 的最初發明者 Rasmus Lerdorf 提出了將靜態分析引擎添加到核心之中的想法。這個想法潛力巨大,但任務量着實不小。

提到轉編譯,因爲受到 JavaScript 社區的啓發,有許多人試圖將 PHP 句法延伸到用戶空間中。一個名叫 Pre 的項目就作了這件事情:它支持新的已經轉編譯爲普通 PHP 代碼的 PHP 句法。

雖然這一想法已經在 JavaScript 中得以實現,但只有在提供了適當的集成開發環境 (IDE) 和靜態分析支持後,它才能在 PHP 工做。這一想法很是有趣,但還必須不斷完善,才能變成「主流」。

結束語

儘管 PHP 還有不少缺點和遺留問題,但我能夠充滿信心地說,我喜歡使用它。就個人經驗來看,它能夠建立可靠、可維護和高質量的軟件。若是使用得當,PHP 對於 web 開發來講是個很是棒的選擇。

相關文章
相關標籤/搜索