昔日輝煌不再,PHP老矣,尚能飯否?

導語 | 近期 TIOBE 最新指數顯示,PHP 的流行度降至了歷史最低,排在第 17 名,同時,在年度 Stack Overflow 開發者調查報告中,PHP 在開發者中的受歡迎程度已經從之前的約 30% 萎縮至現在的 18%。“PHP 是世界上最好的語言”已成爲承載程序員黑色幽默的熱梗。在滿是唱衰的市場環境中,究竟 PHP 是否真的沒有前景,是否已經不值得學習了?今天,我們特邀了識沃科技 CEO 韓天峯老師,他將爲我們深入解讀 PHP 的發展現狀和未來發展趨勢。

 

作者簡介

 

 

 

韓天峯,識沃科技 CEO,Swoole 開源項目創始人,PHP 官方 PECL 開發組成員。曾任好未來學而思網校首席架構師,在騰訊朋友網、淘寶搜索、虎牙直播等互聯網企業擔任架構師和技術負責人。

 

一、PHP從輝煌到走向沒落?

 

衆所周知,PHP 語言誕生於 1995 年,它最初只是一個處理 HTTP 表單的腳本工具。在後續的版本中增加了 MySQL 數據庫查詢的支持,才逐漸成爲一門獨立的 Web 項目開發語言。隨着互聯網的迅猛發展,因PHP易學易用和強大的開發社區而備受青睞,成爲了互聯網應用開發的主要語言之一。與 Linux、MySQL、Apache 合併稱爲 LAMP 技術棧,LAMP 對互聯網的影響巨大,逐漸成爲構建動態網站和應用程序的主要技術架構,據 W3C 的統計,全球有接近 78% 的 Web 網站是基於 PHP 開發構建的。

值得一提的是,PHP 以其低成本、易用、靈活性和可擴展、繁榮的 Web 技術生態,一度在編程開發領域佔據着重要的地位,與 Java 語言並駕齊驅。

而隨着移動互聯網、雲計算、人工智能等新技術的興起,互聯網軟件系統變得越來越複雜。大型網站系統對於高併發、可用性的要求也越來越高。Java 相比 PHP 擁有類型安全、更好的性能、多線程連接池技術、更嚴格的編程規範,並且在服務治理方面擁有更成熟的解決方案和生態。很多技術團隊更傾向於使用 Java 構建 Web 系統,而非 PHP。

 

除此之外,伴隨如 Node.js、Golang 等新編程語言的出現,它們在某些方面具有 PHP 不具備的優勢,例如靜態編譯、更好的性能和異步編程。這些編程語言也在蓬勃發展,被越來越多的開發者使用。

 

雖然 PHP 社區也在不斷努力改進語言本身,但 PHP 在某些領域的競爭地位逐漸被其他語言所取代,隨着時代的發展,一些重要的網站和應用開始轉向其他語言和框架,這導致了一些人對 PHP 的未來產生了質疑,很多開發者認爲 PHP 正在走向沒落。近期 TIOBE 最新指數顯示,PHP 的流行度降至了第 17 名,也說明了這一點,開發者正在對 PHP 失去信心,轉向其他編程語言。

 

二、PHP流行度下降的原因

 

 

外因是時代的變化,互聯網的熱潮已退去,現在是人工智能的時代,Python 現在是最流行的編程語言,其他的編程語言的關注度都在下降。內因有以下 3 個:

● PHP 生態過於單一,沒有在 Web 之外進入新的領域;

● PHP 語言在類型系統、編譯器、併發編程方面迭代更新力度不夠,沒能及時趕超 Java、Golang、JavaScript(v8) 這些語言和技術;

● 解決歷史包袱的魄力不足,至今依然保留着 20 年前的包袱,例如 $_GET/$_POST 等超全局變量、混亂的函數命名等。

 

儘管如此,PHP 仍然是一門不錯的編程語言技術,許多網站和 Web 應用仍然在使用它。PHP 社區和開發者們也在不斷努力改進 PHP,使其能夠適應新的技術趨勢和市場需求,儘管可能會經歷了一段時間的沒落,但 PHP 仍然會在編程開發領域中扮演着重要角色,這無疑得益於其強大的生態系統。

 

三、PHP編程語言生態

 

 

其實,生態對於編程開發的重要性是不可忽視的,包括開發工具、庫、框架、社區、文檔、教程、第三方服務和支持等。生態系統的健康與發展直接影響着開發者的工作效率、項目的成功和技術的發展。

 

在我看來,PHP 只在 Web 開發領域是很成熟的,而 Java 在桌面軟件、Android、大數據、金融系統、電商平臺均有成熟的生態。Python 在數據科學、人工智能、機器學習、科學計算、教育等領域有廣泛應用,尤其是隨着 AI 時代的到來,Python 成爲當下最爲炙手可熱的技術。Golang 雲原生、基礎服務器端軟件方面取代了 C/C++。而 Node.js 在前端、單頁面應用(SPA)、全棧開發方面具備優勢。

 

相比之下 PHP 的生態非常單一,這也使得 PHP 的侷限性尤爲明顯。而似乎 PHP 官方團隊似乎對於 Web 開發之外的生態支持興趣不大,主要的版本更新也依然是圍繞着 PHP-FPM/Apache 這樣的 Web 服務器進行着。

 

 

不過幸好 PHP 社區有 Swoole 這樣類似於 Golang 的異步協程方案,從而彌補了 PHP 在異步併發編程、網絡通信方面的一些不足。Swoole 的引入也爲開發者提供了更多選擇和靈活性,使他們能夠更好地應對複雜的應用場景和高併發需求。此外,在軟件開發過程中,良好的工程規範也是保證項目質量和開發效率的又一關鍵要素。

 

四、工程規範更重要

 

 

隨着項目研發的經驗越來越多,我深刻體會到工程規範比開發的速度更重要。良好的工程規範能夠確保項目的長期可維護性、可擴展性和穩定性,雖然追求快速開發可能在短期內帶來一些優勢,但長期來看,缺乏規範的項目可能會面臨諸多問題,包括但不限於以下這些:

 

 

● 代碼質量下降:沒有規範的代碼往往會變得混亂、難以理解和維護,使得團隊成員在開發、調試和修改代碼時耗費更多的時間和精力;

● 團隊協作困難:缺乏規範的項目往往意味着每個開發者都有自己的編碼風格和習慣,這會導致團隊協作時的不一致性和溝通困難;

● 代碼可讀性差:規範的代碼更易於閱讀和理解,有助於開發者快速定位問題、理解代碼邏輯和進行代碼審查;

● 維護成本增加:缺乏規範的代碼往往會增加項目的維護成本,因爲開發者需要花更多的時間和精力來理解和修改代碼,從而增加了項目的技術債務;

● 項目演進困難:隨着項目規模的擴大和需求的變更,缺乏規範的代碼可能會變得越來越難以維護和擴展,甚至需要重構或重寫部分代碼。

 

若我們不重視工程規範,隨着項目持續時間的增加,將會造成嚴重的後果,甚至導致項目研發停滯。而 PHP 社區有很多優秀的項目,可以幫助項目提高工程規範:

 

● phpunit:單元測試框架;

● composer:包依賴管理器;

● PSR:是社區制定的一系列 PHP 編碼規範,涵蓋了自動加載、編碼風格、命名規範、接口設計等方面;

● php-cs-fixer:代碼自動格式化工具;

● phpstan:靜態分析檢查工具;

● rector:語言版本兼容性檢查工具,若項目要升級 PHP 版本可以使用它。

● php-parser:PHP AST 抽象語法樹解析工具,可以分析 PHP 語法,做些安全檢查、漏洞掃描、編程語言轉換,例如 phpy 項目 py2php 就是用它實現的。

 

不過從編程語言的角度上,PHP 相比 Java 在規範上存在一些天然的缺陷,早期甚至連 namespace 都不支持,面向對象的特性支持也不夠完整。雖然在 PHP7 版本做了大量改進,但最新的 PHP 依然存在以下的問題:

 

(一)無法實現徹底的嚴格類型

 

嚴格類型更容易寫出工程規範的代碼。這一點基本上是開發者之間的廣泛共識。弱類型編程基本上就是 “開發一時爽,重構火葬場”。

 

現在的 PHP 其實已經在大部分語法上支持了類型限定,例如:

 

 

1、函數參數和返回值

 

function fun(int $a, float $b, FunClass $c, string $d, callable $e): bool {
    // code ...
}

 

 

2、對象屬性

 

class FunClass {
    public int $age;
    public string $name;
    public stdClass $attrs;
}

在開發中也建議啓用嚴格模式:

 

<?php
declare(strict_types=1);

但遺憾的是在 PHP 最常用的數組依然是一個類型黑洞:

 

$a1 = new FunClass;
$array = [$a1];
$a2 = $array[0];

 

 

由於 PHP 的數組是無類型的,將有嚴格類型的變量存入數組後再取出就出現了類型的丟失。這也是爲什麼 Facebook 實現的 HHVM 最終選擇不再兼容 PHP,而是獨立爲一門新的語言 Hack,在 Hack 語言中實現了徹底的嚴格類型。

 

(二)缺少二進制構建支持

 

一個軟件開發完整流程包括開發、測試、構建、部署運行,Java 和 Golang 這樣的靜態語言是比較好的,軟件開發測試完成發佈版本後,應用程序將構建爲一份二進制程序,分發和部署不再需要源碼。而 PHP 大部分是直接部署源碼運行的,就導致出現了一些列問題:

● WebShell 注入,通過上傳或其他文件寫入的攻擊行爲,將部分有害代碼注入系統中;

● 直接在線上修改 PHP 源代碼文件,導致了實際服務器上的代碼與 Git 倉庫中的代碼不一致;

● 部署系統的難題,碎片式更新,導致了部署期間出現各種邏輯錯誤;

● 源代碼泄露

 

 

雖然現在很多開發者使用 Docker 鏡像構建和部署,解決了一些問題。但PHP 依然存在一些不足,很多上古時期的 PHP 開發者認爲熱更新是 PHP 的優勢,實際上熱更新只在開發測試環境中有價值,線上部署運行的服務是不會熱更新的,而且 PHP 的核心開發者們,依然頑固地堅持着熱更新這個特性。

 

(三)混亂的內置函數命名

 

 

PHP 語言內置的函數全部是在根命名空間內的,並且部分內置函數的命名規範還是錯誤的,例如:

 

● htmlspecialchars,多個字母直接拼在一起,正確的應該是:html_encode_special_chars

● strstr, substr, str_replace 等字符串相關函數,命名相當混亂,而數組操作相關函數的命名就規範多了,均是 array_* 這樣命名

 

(四)混亂的參數順序

 

內置函數的參數順序非常混亂,以數組操作函數爲例,array_search 和 array_filter,分別是搜索數組是否存在一個元素,後者是從數組篩選出一些符合條件的元素。

 

array_filter($array, $callback);
arary_search($value, $array);

因爲數組本身不是始終爲第一個參數,所以導致開發者無法記憶,每次都需要去看文檔,以確定參數在前還是在後。

 

五、PHP語言還值得學習嗎?

 

 

 

儘管如此,我認爲 PHP 語言還是值得學習的,相比現在主流的編程語言 Java、Python、C++,以及流行的 Node.js、Rust、Golang 等新型編程語言,PHP 有其無法被取代的獨特優勢,是一個非常便捷的開發工具集,可以幫助開發者節約很多時間。

 

(一)語言的簡單性

 

 

首先,PHP 相較於大多數編程語言來說,沒有太複雜的語法,不像某些編程語言,有些語法實在難以理解,比如 C++ 的 move/forward(這在 C++ 中還算是比較簡單的,C++ 甚至有語言律師這個職業)。

 

其次,它不需要考慮整型溢出、符號之類的問題,C++ 或 Golang 中的 int8/int16/int32/int64/uint8/uint16/uint32/uint64。

 

再者,它沒有指針的概念,也不會遇到 Java 和 Golang 的空指針異常這類開發者頭痛的問題。

 

同時,它也沒有 Python 中各種眼花繚亂的語法,或 JavaScript 中 0 和 []、'\t'、'0' 三位一體的燒腦問題。

 

綜上,客觀來說 PHP 語言就是一種樸實無華,入門友好的編程語言,加上它比較簡單,學習的成本極低。

 

(二)龐大的函數庫

 

 

PHP 語言自帶一個龐大的函數庫,各種功能應有盡有。這些函數庫涵蓋了各種各樣的功能和用途,讓開發者能夠更輕鬆地實現各種軟件功能,包括字符串、數組、日期、數學、正則表達式、JSON、XML、文件操作、郵件、網絡通信、數據庫操作、密碼、加密、圖像處理、終端和進程管理、國際化與字符編碼支持等等。

相比其他語言,需要自己編寫很多代碼去實現一個功能,或者依賴各種第三方庫實現,PHP 就直接可以用內置函數實現。例如:

 

 

1、版本比較

 

要比較兩個格式爲x.y.z的版本號哪個更高,可以使用 version_compare

 

var_dump(version_compare('1.9.2', '1.10.0'));
var_dump(version_compare('1.10.0', '1.9.20'));

 

2、 通配符計算

 

var_dump(fnmatch('*.qq.com', 'qqcloud.com'));
var_dump(fnmatch('*.qq.com', 'im.qq.com'));

 

3、路徑計算

 

獲取一個文件路徑字符串的目錄、擴展名、文件名

 

$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
 
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n";

 

還有一個更有趣的擴展庫,可以在 PHP 中直接調用 Python 中的函數,藉此 PHP 也可以直接使用 PyTorch、TensorFlow 等 AI 庫,運行 AI 大模型推理、訓練,調用 transformers、Paddle NLP、modelscope 的 AI 能力

 

https://github.com/swoole/phpy

 

 

4、transformers

 

$transformers = PyCore::import('transformers');
 
$os = PyCore::import('os');
$os->environ->__setitem__('https_proxy', getenv('https_proxy'));
 
$distilled_student_sentiment_classifier = $transformers->pipeline(
    model: "lxyuan/distilbert-base-multilingual-cased-sentiments-student",
    top_k: null,
);
 
$rs = $distilled_student_sentiment_classifier ("I love this movie and i would watch it again and again!");
var_dump(PyCore::scalar($rs));

 

5、modelscope

 

$pipeline = PyCore::import('modelscope.pipelines')->pipeline;
$Tasks = PyCore::import('modelscope.utils.constant')->Tasks;
 
$pipe = $pipeline($Tasks->ocr_recognition, model: 'damo/cv_convnextTiny_ocr-recognition-general_damo');
$file = '/tmp/captcha.png';
file_put_contents($file, file_get_contents($captcha_url));
echo '識別結果:' . $pipe($file)['text'][0], PHP_EOL;

 

6、paddle NLP

 

$pprint = PyCore::import('pprint')->pprint;
$Taskflow = PyCore::import('paddlenlp')->Taskflow;
 
$schema = new PyList(['時間', '選手', '賽事名稱']);
$ie = $Taskflow('information_extraction', schema: $schema);
$pprint($ie("2月8日上午北京冬奧會自由式滑雪女子大跳臺決賽中中國選手谷愛凌以188.25分獲得金牌!"));

 

7、 gradio client

 

作爲 Gradio 客戶端,調用 AI 模型的能力

$gradio_client = PyCore::import('gradio_client')->Client;
$client = $gradio_client("http://192.168.1.146:8088/");
$result = $client->predict("Hello!!", api_name: "/predict");
PyCore::print($result);

強大的字符串處理能力

 

各種常用的編程語言中 PHP 的字符串處理能力是最強大的,沒有之一。PHP 除了是一個編程語言之外,還是一個模版語言。可以直接在模版中嵌入 PHP 表達式,使用起來甚至比 Vue 或 React JSX 模版更強大。

 

注意:缺點只是不能在瀏覽器中運行

 

例如下面的代碼,可以模版中使用任意 PHP 語法,沒有任何限制:

 

var json = <?= json_encode($data) ?>;
 
<?php foreach($lines as $line): ?>
    document.write(<?=$line?>);
<?php endforeach; ?>

六、PHP的未來發展趨勢

 

 

自從 PHP 基金會成立後,它每年可以收到上百萬美金的捐助,PHP 語言官方開發團隊的貢獻也越來越穩定。很多編程語言的問題,相信可以在未來都能得以解決。

 

以 Laravel、Symfony 爲代表的 PHP 框架現在也越來越成熟,逐漸拉近了與 Java Spring 框架的距離。而協程擴展項目 Swoole 在今年也推出了 v6.0 的計劃,爲 PHP 引入了多線程+協程的併發編程方案。

 

除此之外,PHP 社區中還誕生了很多有趣的新項目,例如:

 

● RoadRunner

● nativephp

● frankenphp

● phpy

 

結語

 

總而言之,在我看來,PHP 語言整體發展仍是穩中向前,在未來重新流行起來也是極有可能的。最後,我也分別給企業和開發者們一些可供參考的建議。

首先,對於企業選型 PHP 來說,在數千萬甚至上億用戶活躍的大型 Web 系統中,PHP 技術棧可能會面臨各種挑戰和難題,使用 Java 或 Golang 可以容易獲得更好的性能、工程規範、高併發和高可用性、更成熟的服務治理方案。但絕大部分項目不會有如此大規模的用戶量級和複雜度,使用 PHP 技術棧的開發團隊依然是比較有性價比的選擇。研發團隊可以以較少的人力資源投入保持更快的迭代速度,在當下開源節流的大趨勢下尤爲重要。

其次,對於 PHP 開發者們而言,第一,我們要學習 AI,使用 ChatGPT、Github Copliot 等工具提升自己的開發效率,瞭解 Transformers 等大模型的原理;第二,我們可以使用 Docker 鏡像和 Docker Swarm 容器編排工具、Docker Compose 實現本機的容器啓動管理;第三,我們也要掌握 Vue/React/ElementUI 等前端技術棧,要具備全棧開發的能力;最後,學習 C++/Golang/Java 等其他編程語言技術,不僅僅侷限於 PHP 一種編程語言也是十分必要的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章