者 | Brent
譯者 | 張蘭月
這篇文章不在于解決關于 PHP 的那個永恒話題,而是想讓你了解,PHP 在這些年的進展以及那些值得關注的特性與發展現狀。
之前,有一篇非常流行的博客文章是“PHP:那些糟糕的設計”,第一次讀到這篇博客的時候,我正在一個非常破舊的地方工作,處理著許多 PHP 遺留項目。這篇博客對我觸動很深,我開始思考是否要停止編程,換一份完全不同的工作。文章地址:
https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/
幸運的是,很快我就換了一份工作,而 PHP 在 5.X 版本之后又有了很多新的改進。今天,我要向那些不再使用 PHP 編程,或者陷入遺留項目的人致敬。
劇透:直到今天,PHP 仍有很多糟糕的東西,例如許多核心功能仍然存在不一致的方法簽名,仍然存在令人混淆的配置設置,仍然會有一些開發者因為知識的缺乏而導致寫的代碼很糟糕等等。
但是,本文我想把目光集中在 PHP 已經改進的地方上面,以及如何寫出更加干凈和易維護的 PHP 代碼。也許你不會改變對 PHP 的看法,但很有可能,你會驚訝于過去幾年 PHP 的進步。
更新:很多人希望我能夠展示一下實際代碼,這是我其中一個業余項目的源代碼,它是用 PHP 和 Laravel 寫的,另外還有一個是我們在辦公室負責維護的上百個 OSS 包的列表。
讓我們先快速回顧一下 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 的常見誤解。
在 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 新特性的不完全列表:
盡管我們的主題是 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 開發來說是個非常棒的選擇。
英文原文
https://stitcher.io/blog/php-in-2019
新浪微博是國內使用 PHP 語言的代表之一,前新浪微博首席架構師惠新宸就是 PHP 開發組的核心成員。2016 年,InfoQ 編輯約稿了新浪微博,分享了新浪微博的 PHP 7 升級實踐以及選型思路。文章年代雖然較為久遠了,但背后的思路和實踐細節依舊值得參考,感興趣的同學可以在 InfoQ 公眾號對話框回復關鍵詞:PHP,獲取文章詳情。
請在 InfoQ 公眾號對話框回復關鍵詞,留言區回復無法接收的喲!
QCon 全球軟件開發大會廣州站正在火熱進行中,我們為 InfoQ 的讀者匯總了大會 PPT,回復關鍵詞:PPT,即可下載!
hp與JavaScript的交互方式
php與JavaScript的交互答題可以分為三種,即:使用php生成JavaScript,使用cookies進行數據交換,使用臨時文件進行數據交換。
1.php生成JavaScript的方法,可以動態生成JavaScript,使得在服務器端的位置,通過客戶端的JavaScript表現出來提升用戶體驗。
在使用時注意,php生成JavaScript腳本的語法,不用與JavaScript語法混合。
2.使用Cookies進行數據交換,可以在php與JavaScript腳本交換小數據量時使用。因為Cookies與腳本代碼無關,php與JavaScript都可以設置和
讀取Cookie,使得兩種語言在交換數據庫里,變得很簡單。
3.使用臨時文件進行數據交換,原理與使用Cookie進行數據交換是一樣的,只不過是臨時文件存取的數據量更大,樣式更豐富。但使用臨時文件往往需要
更多的操作代碼。
例:使用php生成JavaScript
<?php
//使用php生成JavaScript
$var1 ="我是php變量";
$var2 ="PHP";
echo "<script>";
echo "var jsVar ='我是JavaScript變量';";
echo "var phpVar ='這是".$var2."與JavaScript組成變量';";
echo "alert(jsVar);";
echo "alert('".$var1."');";
echo "alert(phpVar);";
echo "</script>";
?>
運行結果
*請認真填寫需求信息,我們會在24小時內與您取得聯系。