PHP 8.1 發(fā)布,帶來諸多創(chuàng)新
PHP 8.1 正式發(fā)布,帶來了諸多創(chuàng)新,例如枚舉、Fibers和性能改進(jìn)。
PHP 是一種服務(wù)器端腳本語言,用于開發(fā) Web 應(yīng)用程序。根據(jù) W3Techs 的數(shù)據(jù),78.2% 的網(wǎng)站使用 PHP 并使用已知的服務(wù)器端編程語言。換句話說,您在 Internet 上訪問的每 10 個(gè)網(wǎng)站中幾乎有 8 個(gè)以某種方式使用 PHP。
在宣布成立PHP 基金會幾天后,該語言通過發(fā)布最新的 PHP 8.1 更新而不斷發(fā)展。這個(gè)新版本于 2021 年 11 月 25 日發(fā)布,包含許多新功能,包括枚舉、只讀屬性、First-class 可調(diào)用語法、Fibers、交集類型、性能改進(jìn)等。
讓我們快速瀏覽一下您應(yīng)該遷移到 PHP 8.1 的一些新功能、性能調(diào)整和其他原因。
PHP 8.1 亮點(diǎn)
對于每一個(gè)新的 PHP 版本,我們通??梢云诖阅艿男》嵘?,這次似乎也不例外。這個(gè)最新版本還提供了幫助開發(fā)人員編寫更簡潔代碼的功能。
枚舉(Enumerations)
PHP 8.1 引入了一種名為Enums的新數(shù)據(jù)類型。它基本上是在一個(gè)實(shí)體中聲明的一組預(yù)定義值。枚舉是應(yīng)用程序建模中的重要工具,因?yàn)樗试S您定義自己的允許狀態(tài)的微觀世界。
現(xiàn)在您可能已經(jīng)在代碼中以一種或另一種方式使用了枚舉,但現(xiàn)在 PHP 8.1 將原生支持枚舉。這對每個(gè)人來說都是個(gè)好消息。在最基本的形式中,枚舉看起來像這樣:
- enum Animal {
- case Dogs;
- case Cats;
- case Birds;
- case Reptiles;
- }
與其他語言類似,這是一種允許預(yù)定義值的枚舉類型。上面的示例創(chuàng)建一個(gè)新的名為枚舉類型Animal,它采用下列四個(gè)值:Animal::Dogs,Animal::Cats,Animal::Birds和Animal::Reptiles??梢詫⒆兞糠峙浣o這些值。
Enums 的優(yōu)點(diǎn)是它們代表了一組常量值,但最重要的是,這些值可以被鍵入。
Fibers
到目前為止,PHP 僅用于編寫同步代碼。PHP 8.1 附帶了一項(xiàng)激動(dòng)人心的新功能,用于將異步代碼構(gòu)建到語言Fibers 中。
Fiber的引入旨在消除異步和同步函數(shù)之間的區(qū)別。
您可以使用 Fibers 開發(fā)全棧、可中斷的 PHP 函數(shù),然后您可以使用這些函數(shù)在 PHP 中實(shí)現(xiàn)協(xié)作多任務(wù)處理。
Fiber 會暫停整個(gè)調(diào)用堆棧,因此函數(shù)的直接調(diào)用者無需更改其調(diào)用函數(shù)的方式。執(zhí)行可以在調(diào)用堆棧中的任何地方使用 Fiber::suspend().
- $fiber = new Fiber(function (): void {
- $value = Fiber::suspend('fiber');
- echo "Value used to resume fiber: ", $value, "\n";
- });
- $value = $fiber->start();
- echo "Value from fiber suspending: ", $value, "\n";
- $fiber->resume('test');
輸出
- Value from fiber suspending: fiber
- Value used to resume fiber: test
First-class 可調(diào)用語法
First-Class callables是一種引用閉包和函數(shù)的新方法。雖然以前您已經(jīng)可以通過將它們的名稱用作字符串或通過創(chuàng)建可調(diào)用數(shù)組來引用它們,但現(xiàn)在有這種正確的語法可以從任何給定函數(shù)創(chuàng)建可調(diào)用對象,以便您以后可以調(diào)用它。
- $fn = Closure::fromCallable('strlen');
- $fn = strlen(...);
- $fn = Closure::fromCallable([$this, 'method']);
- $fn = $this->method(...)
- $fn = Closure::fromCallable([Foo::class, 'method']);
- $fn = Foo::method(...);
在這個(gè)例子中,每對表達(dá)式都是等價(jià)的。該strlen(...)語法創(chuàng)建一個(gè)Closure引用的strlen()功能,等等。
PHP 8.1 中的其他改進(jìn)
數(shù)組和打包現(xiàn)在支持字符串鍵,并且可以創(chuàng)建類常量,final這樣它們就不會被子類覆蓋。此外,還有一個(gè)新array_is_list()函數(shù)可以確定數(shù)組是否只有從 0 開始并以 1 遞增的數(shù)字鍵,但它是否是實(shí)際列表。
PHP 8.1 引入了一種寫八進(jìn)制整數(shù)的新方法,我們現(xiàn)在也有 Pure Intersection 類型。這與聯(lián)合類型相反,它允許任何聲明的類型。如果您經(jīng)常在代碼中使用接口,Pure Intersection 類型很有用。
最后是never類型。它是一種返回類型,表示函數(shù)永遠(yuǎn)不會返回。這意味著它將退出或始終拋出異常。
- function redirect(string $url): never {
- header('Location: ' . $url);
- exit();
- }
never 返回類型的目標(biāo) 是指示和強(qiáng)制執(zhí)行一個(gè)函數(shù),以防止執(zhí)行其余被調(diào)用的代碼。
最后但并非最不重要的一點(diǎn)是,PHP 8.1 圖像處理和 GD 擴(kuò)展增加了對 AVIF 圖像的支持。與 JPEG、PNG 和 WebP 相比,AVIF 圖像可顯著減小文件大小,目前Google Chrome和Mozilla Firefox 支持。
PHP 8.1 性能改進(jìn)
每個(gè) PHP 版本都在性能方面不斷改進(jìn),PHP 8.1 為現(xiàn)實(shí)生活中的應(yīng)用程序帶來了巨大的性能改進(jìn)。
事實(shí)上,PHP 8.1 上的 Symfony 演示應(yīng)用程序比 PHP 7.4 快約 23%,而 Laravel 在 PHP 8.1 上的運(yùn)行速度比 PHP 7.4 快約 21.5%。
這是 PHP 8.1 中實(shí)現(xiàn)的兩項(xiàng)新技術(shù)以及許多小的性能修復(fù)和調(diào)整的結(jié)果。所以,當(dāng)然,很高興看到 PHP 的性能如何隨著每個(gè)新的更新而不斷提高。