PHP 是 Web 開(kāi)發(fā)的絕佳選擇,使用 PHP,他可以創(chuàng)建可靠、可維護(hù)和高質(zhì)量的應(yīng)用,并且自己與客戶對(duì)最終結(jié)果都滿意。
關(guān)注于 PHP 這些年來(lái)發(fā)展得更好的一面,以下幾點(diǎn)足以說(shuō)明PHP發(fā)展又上了一個(gè)新的臺(tái)階:
- PHP 正在積極開(kāi)發(fā),每年都會(huì)發(fā)布新版本
- PHP 5 之后性能在不斷提高
- 有非?;钴S的框架、包和平臺(tái)組成的語(yǔ)言生態(tài)
- PHP 在不斷發(fā)展,過(guò)去幾年中添加了許多新功能
- 各種開(kāi)發(fā)工具在過(guò)去幾年中已經(jīng)成熟,并且保持增長(zhǎng)
PHP 正在積極開(kāi)發(fā),每年都會(huì)發(fā)布新版本
當(dāng)前 PHP 版本是去年 12 月份發(fā)布的 7.3,7.4 預(yù)計(jì)在今年年底發(fā)布,而 PHP 8.0 將是 7.4 之后的下一個(gè)版本。
Branch | Initial Release | Active Support Until | Security Support Until | |||
---|---|---|---|---|---|---|
7.1 | 1 Dec 2016 | 2 years, 5 months ago | 1 Dec 2018 | 5 months ago | 1 Dec 2019 | in 6 months |
7.2 | 30 Nov 2017 | 1 year, 5 months ago | 30 Nov 2019 | in 6 months | 30 Nov 2020 | in 1 year, 6 months |
7.3 | 6 Dec 2018 | 5 months ago | 6 Dec 2020 | in 1 year, 6 months | 6 Dec 2021 | in 2 years, 6 months |
自從 5.X 時(shí)代以來(lái),核心團(tuán)隊(duì)希望每年發(fā)布一個(gè)新版本,在過(guò)去四年中他們成功維護(hù)了這么一個(gè)發(fā)布周期。通常每個(gè)新版本都會(huì)得到官方兩年時(shí)間的積極支持,之后有一年僅提供安全修復(fù),其目的是激勵(lì) PHP 開(kāi)發(fā)人員盡可能保持更新。
更加具體的發(fā)布與維護(hù)周期可以查看 PHP 官網(wǎng)的介紹:
看到上邊這個(gè)表,你可能會(huì)發(fā)現(xiàn)版本號(hào)從 5 跳到了 7,那 PHP 6 去哪里了?
順便科普一下。其實(shí)早在 2005 年,PHP 社區(qū)就發(fā)起了 PHP 6,但由于實(shí)現(xiàn) Unicode 面臨的困難太大,項(xiàng)目最終流產(chǎn),PHP 官方?jīng)]有發(fā)布 PHP 6 GA,并且在 2010 年將 PHP 6 取消。雖然 PHP 6 項(xiàng)目取消了,但其大量已實(shí)現(xiàn)功能集成到了 PHP 5.X 中,包括 OOP 方面的改進(jìn),使得 PHP 從面向過(guò)程跨越到面向?qū)ο蟆?/span>
PHP 6 被取消了,但是之前對(duì)這個(gè)主要版本的研發(fā)都是以 PHP 6 的名義進(jìn)行的,所以許多參考資料與書(shū)籍都是用“PHP 6”來(lái)指代該版本。官方擔(dān)心這在放棄 PHP 6 之后會(huì)引起混亂,于是干脆不使用 PHP 6.X 版本號(hào),直接從 5 跳到 7。
詳情可以查看官方說(shuō)明:https://wiki.php.net/rfc/php6
PHP 5 之后性能在不斷提高
PHP 7.0 中,PHP 核心部分完全重寫(xiě),帶來(lái)了最新的 Zend 引擎,使得 PHP 性能提升了兩到三倍。
作者引用了 https://kinsta.com/blog/php-benchmarks 的基準(zhǔn)測(cè)試來(lái)說(shuō)明這一點(diǎn),指出自 7.0 以來(lái),PHP 性能一直在提升,PHP Web 應(yīng)用與其它語(yǔ)言的 Web 框架相比在一些情況下性能好很多。但他也表示:“當(dāng)然 PHP 框架不會(huì)勝過(guò) C 與 Rust,但比 Rails 或 Django 好得多,與 ExpressJS 相當(dāng)?!?/span>
有非?;钴S的框架、包和平臺(tái)組成的語(yǔ)言生態(tài)
提到 PHP 的框架,不得不說(shuō) WordPress,但是作者表示 WordPress 絕對(duì)不代表當(dāng)前的 PHP 生態(tài):“PHP 框架再也不僅僅只有 WordPress 了”。
當(dāng)前 PHP 中有兩個(gè)主要的 Web 應(yīng)用開(kāi)發(fā)框架:Symfony 與 Laravel,還有 Zend、Yii、CakePHP 與 Code Igniter 等,此外還有不少較小的框架。
Symfony 與 Laravel 都擁有龐大的包和軟件生態(tài),包括 admin 面板和 CRM、獨(dú)立軟件包、CI、分析器、Web socket 服務(wù)器、隊(duì)列管理器與支付集成等。
此外,近幾年 PHP 異步框架也興起了,Swoole、Amp 與 ReactPHP 是其中的佼佼者,它們是用 PHP 或其它語(yǔ)言編寫(xiě)的框架和服務(wù)器,用來(lái)運(yùn)行真正的異步 PHP。
作者認(rèn)為衡量 PHP 生態(tài)當(dāng)前狀況的一種方法是查看 Packagist 這個(gè) PHP 主要軟件包存儲(chǔ)庫(kù)的數(shù)據(jù)。通過(guò)以下趨勢(shì)圖,可以發(fā)現(xiàn)軟件包數(shù)量呈指數(shù)增長(zhǎng),并且當(dāng)前錄入軟件包有 223?217 個(gè),總的安裝量達(dá)到了 14?827?204?847,PHP 生態(tài)已不再像以前那么弱小。
各種版本的可用軟件包的數(shù)量
每月包被安裝數(shù)
此外,還可以看看這個(gè) PHP 使用統(tǒng)計(jì)與市場(chǎng)定位最新數(shù)據(jù):
PHP 在不斷發(fā)展,過(guò)去幾年中添加了許多新特性
盡管 async 與 await 這兩個(gè)呼聲極高的特性還沒(méi)有實(shí)現(xiàn),但是 PHP 這幾年新特性不斷出現(xiàn),語(yǔ)言本身得到了各方面的改進(jìn)。
下邊列出了一些關(guān)注度比較高的 PHP 新特性:
短閉包,也稱(chēng)為箭頭函數(shù),這是一種在 PHP 中編寫(xiě)較短函數(shù)的方法。將閉包傳遞給 array_map 或 array_filter 等函數(shù)時(shí),它可以發(fā)揮極大的作用。
// A collection of Post objects $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts);
空合并運(yùn)算符,它類(lèi)似于三元運(yùn)算符,但左邊的操作數(shù)行為類(lèi)似于 isset,而不是僅使用其布爾值。這使得此運(yùn)算符對(duì)數(shù)組特別有用。它同時(shí)可在未設(shè)置變量時(shí)分配默認(rèn)值。
$undefined ?? 'fallback'; // 'fallback' $unassigned;
$unassigned ?? 'fallback'; // 'fallback' $assigned = 'foo';
$assigned ?? 'fallback'; // 'foo' '' ?? 'fallback'; // '' 'foo' ?? 'fallback'; // 'foo' '0' ?? 'fallback'; // '0' 0 ?? 'fallback'; // 0 false ?? 'fallback'; // false
Trait 是一種重用代碼的機(jī)制,它可以減少單繼承的某些限制。Traits 與類(lèi)組合的語(yǔ)義定義了降低復(fù)雜性的方式,并避免了與多重繼承和 Mixins 相關(guān)的典型問(wèn)題。
Trait 類(lèi)似于類(lèi),但僅用于以細(xì)粒度和一致的方式對(duì)函數(shù)進(jìn)行分組,它是對(duì)傳統(tǒng)繼承的補(bǔ)充,可以實(shí)現(xiàn)行為的橫向組合,類(lèi)成員應(yīng)用不需要繼承。
<?php trait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ }
} class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* ... */ } class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* ... */ } ?>
屬性類(lèi)型化,類(lèi)變量可以定義類(lèi)型,比如:
class A { public string $name; public Foo $foo;
}
擴(kuò)展運(yùn)算符,這是一種新語(yǔ)法,可以直接在調(diào)用中解壓縮參數(shù),比如:
call_user_func_array([$db, 'query'], array_merge(array($query), $params));
直接用新語(yǔ)法可擴(kuò)展出數(shù)組 $params:
$db->query($query, ...$params);
- JIT compiler:PHP 8 確認(rèn)支持 JIT
JIT 是一種編譯器策略,它將代碼表述為一種中間狀態(tài),在運(yùn)行時(shí)將其轉(zhuǎn)換為依賴于體系結(jié)構(gòu)的機(jī)器碼,并即時(shí)執(zhí)行。在 PHP 中,這意味著 JIT 將為 Zend VM 生成的指令視為中間表述,并以依賴于體系結(jié)構(gòu)的機(jī)器碼執(zhí)行,也就是說(shuō)托管代碼的不再是 Zend VM,而是更為底層的 CPU。
Foreign Function Interface,外部函數(shù)接口,它允許從純腳本語(yǔ)言調(diào)用 C 函數(shù)、使用 C 數(shù)據(jù)類(lèi)型,從而更有效地開(kāi)發(fā)“系統(tǒng)代碼”。對(duì)于 PHP,F(xiàn)FI 開(kāi)辟了一種使用純 PHP 編寫(xiě) PHP 擴(kuò)展和綁定到 C 庫(kù)的方法。
匿名類(lèi),用于創(chuàng)建簡(jiǎn)單的一次性對(duì)象:
<?php // Pre PHP 7 code class Logger { public function log($msg) { echo $msg;
}
}
$util->setLogger(new Logger()); // PHP 7+ code $util->setLogger(new class { public function log($msg) { echo $msg;
}
});
聲明返回類(lèi)型:
<?php function sum($a, $b): float { return $a + $b;
} // Note that a float will be returned. var_dump(sum(1, 2)); ?>
嚴(yán)格模式:
<?php declare(strict_types=1); function sum($a, $b): int { return $a + $b;
}
var_dump(sum(1, 2));
var_dump(sum(1, 2.5)); ?>
使 Libsodium 成為核心擴(kuò)展,Libsodium 是一個(gè)現(xiàn)代加密庫(kù),由安全專(zhuān)家精心選擇的加密算法組成,以避免側(cè)信道漏洞。
生成器,提供了一種簡(jiǎn)單、無(wú)樣板實(shí)現(xiàn)迭代器的方法。
各種開(kāi)發(fā)工具在過(guò)去幾年中已經(jīng)成熟,并且保持增長(zhǎng)
最后一部分,作者分析了當(dāng)前 PHP 開(kāi)發(fā)工具也在不斷成熟,并且保持增長(zhǎng)。
他以靜態(tài)分析器為例,比如 Psalm、Phan 與 PHPStan,這些工具將靜態(tài)分析 PHP 代碼并報(bào)告任何類(lèi)型錯(cuò)誤與可能存在的 bug。在某種程度上,它們提供的功能可以與 TypeScript 的相媲美,但是因?yàn)?PHP 現(xiàn)在不提供轉(zhuǎn)換(transpile),所以不允許使用自定義語(yǔ)法。這意味著 PHP 開(kāi)發(fā)需要依賴文檔,但其實(shí) PHP 的創(chuàng)造者 Rasmus Lerdorf 曾經(jīng)提到了向核心添加靜態(tài)分析引擎的想法。
受到 JavaScript 社區(qū)的啟發(fā),目前 PHP 也有在進(jìn)行轉(zhuǎn)換的相關(guān)研發(fā),比如項(xiàng)目 Pre,它允許新的 PHP 語(yǔ)法轉(zhuǎn)換為普通的 PHP 代碼。雖然這個(gè)想法已經(jīng)在 JavaScript 中被證明可行,但作者認(rèn)為在 PHP 中,只有先提供了適當(dāng)?shù)?IDE 和靜態(tài)分析支持,它才有可能實(shí)現(xiàn)。
講完了 PHP 當(dāng)前的這些變化,作者最后沒(méi)有以“PHP 是世界上最好的語(yǔ)言”作結(jié)語(yǔ),相反,他是這樣說(shuō)的:
All that being said, feel free to still think of PHP as a crappy language... I can say in confidence that I enjoy working with it.
話雖如此,但是還要繼續(xù)認(rèn)為 PHP 是蹩腳的語(yǔ)言那也是可以的。我可以很自信地說(shuō)我喜歡 PHP。
原文地址:https://stitcher.io/blog/php-in-2019
南昌雅騰教育專(zhuān)注PHP培訓(xùn),堅(jiān)持小班授課、一對(duì)一輔導(dǎo)、理論與項(xiàng)目實(shí)戰(zhàn)的方式培養(yǎng)優(yōu)秀的PHP工程師,助力學(xué)員高薪就業(yè)。