PHP 8.1.0 正式釋出了

php技術社群發表於2021-11-26

PHP 8.1.0 現已釋出,該版本帶來了許多改進和新功能。

列舉

使用列舉而不是一組常量並立即進行驗證。

enum Status
{
    case draft;
    case published;
    case archived;
    public function color(): string
    {
        return match($this)
        {
            Status::draft => 'grey',
            Status::published => 'green',
            Status::archived => 'red',
        };
    }
} 
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

只讀屬性

只讀屬性不能在初始化後更改,比如,在為它們分配值後。它們可以用於對值物件和資料傳輸物件建模。

class PostData
{
    public function __construct(
        public readonly string $title,
        public readonly string $author,
        public readonly string $body,
        public readonly DateTimeImmutable $createdAt,
        public readonly PostState $state,
    ) {}
}1.2.3.4.5.6.7.8.9.10.11.12.

First-class 可呼叫語法

現在可以獲得對任何函式的引用。

function foo(int $a, int $b) { /* … */ }
$foo = foo(...);
$foo(a: 1, b: 2);1.2.3.

新的初始化器

物件現在可以用作預設引數值、靜態變數和全域性常量,以及屬性引數,這有效地使使用巢狀屬性成為可能。

class PostStateMachine
{
    public function __construct(
       private State $state = new Draft(),
    ) {
    }
}1.2.3.4.5.6.7.8.9.

純交集型別

當一個值需要同時滿足多個型別約束時,使用交集型別。注意,目前無法將交集和聯合型別混合在一起,例如 A&B|C。

function generateSlug(HasTitle&HasId $post) {
    return strtolower($post->getTitle()) . $post->getId();
}1.2.3.

Never 返回型別

使用  never 型別宣告的函式或方法表示它不會返回值,並且會丟擲異常或透過呼叫  die()exit()``、trigger_error()` 或類似的東西來結束指令碼的執行。

function dd(mixed $input): never
{
    // dump 
    exit;
}1.2.3.4.5.

never不同之處 void,在於 void仍然允許程式繼續。這似乎是一個新奇的功能,但它實際上對靜態分析器來說是一個非常有用的功能。

Final 類常量

可以宣告  final 類常量,以禁止它們在子類中被重寫。

class Foo
{
    public const X = "foo";
}
class Bar extends Foo
{
    public const X = "bar";
}1.2.3.4.5.6.7.8.9.

顯式八進位制數字表示法

您可以使用0o和0O來表示八進位制數。前面透過在數字前面加上字首的表示法0仍然有效。

16 === 0o16; // true
016 === 0O16; // true1.2.

纖程

Fibers 是用於實現輕量級協作併發的原語。它們是一種建立可以像生成器一樣暫停和恢復的程式碼塊的方法,但可以從堆疊中的任何位置進行。 Fibers 本身並沒有提供併發性,仍然需要一個事件迴圈。但是,它們允許透過阻塞和非阻塞實現共享相同的  APIFibers 允許擺脫以前在  Promise::then() 或基於生成器的協程中看到的樣板程式碼。庫通常會圍繞 Fiber 構建進一步的抽象,因此無需直接與它們互動。

$fiber = new Fiber(function (): void {
    $valueAfterResuming = Fiber::suspend('after suspending');
    // … 
});
$valueAfterSuspending = $fiber->start();
$fiber->resume('after resuming');1.2.3.4.5.6.7.8.9.

對字串鍵控陣列的陣列解包支援

PHP 以前支援透過擴充套件運算子在陣列內部解包,但前提是陣列具有整數鍵。現在也可以使用字串鍵解包陣列。

$array1 = ["a" => 1];
$array2 = ["b" => 2];
$array = ["a" => 0, ...$array1, ...$array2];
var_dump($array); // ["a" => 1, "b" => 2]1.2.3.4.5.

新array_is_list功能

可能偶爾不得不處理這個問題:確定陣列的鍵是否按數字順序排列,從索引 0 開始。就像json_encode決定陣列應該編碼為陣列還是物件一樣。

$list = ["a", "b", "c"];
array_is_list($list); // true
$notAList = [1 => "a", 2 => "b", 3 => "c"];
array_is_list($notAList); // false
$alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"];
array_is_list($alsoNotAList); // false1.2.3.4.5.6.7.8.

效能最佳化

PHP 8.1 在效能方面也有一些改動,包括:

  • ARM64 的 JIT 後端 (AArch64)

  • 繼承快取(避免在每個請求中重新連結類)

  • 快速類名解析(避免小寫和雜湊查詢)

  • timelib 和  ext/date 效能改進

  • SPL 檔案系統迭代器改進

  • 序列化/反序列化最佳化

  • 一些內部函式最佳化( get_declared_classes()explode()strtr()strnatcmp()dechex()

  • JIT 改進和修復



文章來自微信公眾號:PHP自學中心


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009696/viewspace-2844301/,如需轉載,請註明出處,否則將追究法律責任。

相關文章