PHP在2019年:缺點還有,但會變得更好
選自stitcher.io
作者:Brent
機器之心編譯
參與:王子嘉、shooting
PHP 是一種開源的通用計算機腳本語言,適用於網路開發並可嵌入 HTML 中使用。它的語法借鑒吸收 C 語言、Java 和 Perl 等流行計算機語言的特點,易於一般程序員學習。但是由於太難用,也是被很多人吐槽的一種語言。下面,來看看這位曾經覺得 PHP 槽點滿滿的作者怎麼說……
2012 年有一篇很火的博客:PHP: a fractal of bad design。作者在文中對 PHP 大張撻伐,幾乎就差說這是反人類的設計了。第一次讀到此文時,我正在一個噁心的地方處理很多遺留的 PHP 項目。讀完文章時,我開始思考是否要辭職去做一些與編程完全不同的事情。
幸運的是,此後不久我就換了工作,而且 PHP 從 5.* 開始也成長了很多。今天,我想對那些不再使用 PHP 編程,或者被遺留項目困擾的人說點什麼。
Spoiler:PHP 跟其他編程語言一樣,都有點自己的小毛病。很多核心函數的方法簽名不一致,配置設置仍然不清不楚,仍然有很多開發人員在寫蹩腳的代碼——因為他們必須這樣做,或者說,他們沒有更好的方法。
但今天,我想說的是 PHP 好的一面:看看 PHP 的成長,共同探討一下如何編寫乾淨且可維護的 PHP 代碼。希望大家可以暫時把偏見放進肚子里,哪怕只有幾分鐘。等我說完,你可以把它們再拿出來,但是你一定會驚訝於過去幾年裡 PHP 的成長。
快速閱讀
PHP 每年都在積極開發新版本
自 PHP 5 時代以來,性能至少翻了一番,甚至有可能是曾經的三倍
有極其活躍的框架、包和平台生態系統
過去幾年增加了很多新特性,語言也在不斷發展中
像靜態分析器這樣的工具已經成熟,並且會越來越多
更新:有人讓我展示一些代碼示例,這當然可以!下面有兩個例子:一個是我比較喜歡的項目,是用 PHP 和 Laravel 語言編寫的;還有一個是我們辦公室維護的幾百個 OSS 包的列表。代碼地址如下:
https://github.com/brendt/aggregate.stitcher.io
https://spatie.be/opensource/packages
那我們開始吧。
歷史背景
首先,我們快速回顧一下 PHP 的發布周期。現在的 PHP 版本是 7.3,預計 2019 年底將發布 7.4,然後下個版本將是 PHP 8.0。
自 5.* 時代之後,其核心團隊努力保持著一年一版本的發布周期,並在過去四年中成功做到了這一點。
一般來說,每一個新版本都有兩年的有效支持期,然後再用一年來做「安全修復」。這麼做的目的是鼓勵 PHP 開發人員儘可能使用最新版本,因為每年的小升級比從 5.4 跳到 7.0 版本要容易得多。
PHP 的版本時間表如下:
其中,PHP 5.6 是 5.*時代的最新版本,它的下一個版本就是 7.0。如果您想知道 PHP 6 發生了什麼,可以收聽 PHP 圓桌播客 :
https://www.phproundtable.com/episode/what-happened-to-php-6
了解這些之後,我們可以進一步探討關於 PHP 的常見誤解了。
PHP 性能
5.* 時代的 PHP 性能充其量也不過是平均水平,但是在 7.0 中,PHP 核心的大部分內容都被完全重寫,性能也因此提高了兩到三倍。
光說不練假把式,我們用基準測試結果說話。有人對 PHP 的性能進行過基準測試,這些測試被很好地記錄在了 Kinsta 上:
https://kinsta.com/blog/php-benchmarks/
自從 7.0 出現以後,PHP 的性能一直處於上升期。PHP web 應用的性能與其他語言的 web 框架相當 (在某些情況下甚至更好)。不信可以看看這個通用基準測試包:
https://github.com/thebenchmarker/webframeworks
PHP 框架雖然沒辦法做到比 C 和 Rust 更好,但是它比 Rails 或 Django 要好得多,並且可以與 ExpressJS 相媲美。
框架和生態系統
說到框架,PHP 已經不再只是 WordPress 了。作為一名專業的 PHP 開發人員,我想說的是:WordPress 根本不能代表現在的生態系統。
一般有兩個主要的 web 應用程序框架和一些小框架,比如 Symfony 和 Laravel。當然,還有 Zend、Yii、Cake、Code Igniter 等,但是只有這兩種主要的框架才能代表如今的 PHP。
這兩個框架都有一個包含大量包和產品的生態系統。從管理面板和 CRM 到獨立的軟體包、CI、profiler,眾多如 web sockets 伺服器、隊列管理器、支付集成這樣的服務...... 可以拿得出手的東西太多了。
不過,這些框架是用於實際開發的。如果你需要純粹的內容管理,像 WordPress 和 CraftCMS 這樣的平台只會越來越好。
測試 PHP 生態系統當前狀態的一種方法是查看 Packagist,它是 PHP 的主要 package 存儲庫。它呈指數級增長,每天大約有 2500 萬次的下載量。公平地說,PHP 生態系統已經不再是過去的小輸家了。
下面的圖表,列出了包和版本的數量隨時間的變化。
除了應用程序框架和 CMS,近年來非同步框架也逐步興起。
這些框架和伺服器是用 PHP 或其他語言編寫的,通過這些框架,用戶可以實現真正的非同步 PHP。Swoole、Amp 和 ReactPHP 都是很好的例子。
自從我們進入非同步世界以來,像 web sockets 和具有大量 IO 的應用程序之類的東西已經與 PHP 世界息息相關。
在內部郵件列表(內核開發人員討論如何開發該語言的地方)上也有關於將 libuv 添加到內核的討論。
語言本身
雖然 async 和 await 功能都還不能用,但是在過去幾年裡,PHP 語言本身已經做了很多改進。下面列出了 PHP 的部分新特性:
Short Closures
Null coalescing operator
Trait
Typed properties
Spread operator
JIT compiler
FFI
Anonymous classes
Return type declarations
Contemporary cryptography
Generators
除了語言特性,我們也應該看一下語言的發展過程。雖然社區也會提出 RFCs,但一個活躍的核心志願團隊才是推動語言的發展的根本。
這些 RFCs 會在「內部」郵件列表中進行討論。在添加新的語言特性之前,必須進行投票,獲得至少 2/3 支持的 RFC 才能被寫入內核。
大概有 100 個人有投票權,雖然他們不必對每個 RFC 都進行投票。這些人中必須包括核心團隊的成員,因為他們要維護代碼庫。剩下的投票者主要是從 PHP 社區中挑選出來的,這些人包括 PHP 文檔的維護者、整個 PHP 項目的貢獻者以及 PHP 社區中的傑出開發人員。
雖然大多數核心開發都是在自願的基礎上完成的,但是作為核心 PHP 開發人員之一,Nikita Popov 最近已被 JetBrains 聘用,成為了全職的 PHP 開發者。另外,Linux 基金會最近也決定投資 Zend framework。這樣的僱傭和收購確保了 PHP 未來發展的穩定性。
工具包
除了程序內核本身,PHP 工具包的數量也在不斷增加。靜態分析器 Psalm(由 Vimeo 創建)、Phan 和 PHPStan 都是很好的例子。
這些工具可以對 PHP 代碼做靜態分析,並會報告任何類型的錯誤、可能的 bug 等。在某種程度上,它們的功能幾乎可以趕上 TypeScript 了,不過目前這種語言還無法實現源到源編譯,因此不允許使用自定義語法。
儘管這意味著我們需要依賴 docblock,但 PHP 的最初創建者 Rasmus Lerdorf 確實提到了向內核添加靜態分析引擎的想法。這個想法潛力巨大,但這是一項艱巨的任務。
為了像 JavaScript 那樣實現源到源編譯,PHP 開發者們也一直努力在用戶端擴展 PHP 語法。一個名為 Pre 的項目就在做這樣的事:將新的 PHP 語法轉換為普通的 PHP 代碼。
雖然 JavaScript 中已經實現了這個想法,但是只有提供合適的 IDE 和靜態分析支持,它才能在 PHP 中工作。這個想法很有意思,但它還需要不斷成長,才有可能成為「主流」。
結語
說了這麼多,你仍然可以吐槽說 PHP 是一種蹩腳的語言。雖然它還是有一些缺點和 20 年的遺留問題,但我仍然熱愛這門語言。
以我的經驗來看,我能夠寫出可靠易維護且高質量的軟體。我和客戶對最終的結果也都是滿意的。
雖然使用 PHP 還會有一些亂七八糟的事情,但如果使用得當,我認為它還是一個不錯的網路開發選擇。
本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。
------------------------------------------------
※一個高階張量搞定整個全卷積網路
※陳天奇:深度學習編譯技術的現狀和未來
TAG:機器之心 |