前瞻 PHP8.4 的新特性

JaguarJack發表於2024-05-17

前瞻 PHP8.4 的新特性

PHP 8.4 將於 2024 年 11 月 21 日釋出。它將包括屬性鉤子、JIT 改進,以及在不需要額外括號的情況下鏈式呼叫方法。這是一個大變化!

屬性鉤子 RFC

現代 PHP 歷史上最大的變化之一:定義屬性鉤子的能力。

class BookViewModel
{
    public function __construct(
        private array $authors,
    ) {}

    public string $credits {
        get {
            return implode(', ', array_map(
                fn (Author $author) => $author->name,
                $this->authors,
            ));
        }
    }

    public Author $mainAuthor {
        set (Author $mainAuthor) {
            $this->authors[] = $mainAuthor;
            $this->mainAuthor = $mainAuthor;
        }

        get => $this->mainAuthor;
    }
}

屬性鉤子的目標是透過允許每個屬性定義自己的 get 和 set 鉤子,去除大量的 getter 和 setter。鉤子是可選的,不必在特定屬性上同時新增兩個鉤子。例如,只有 get 鉤子的屬性是虛擬屬性。這應該是目前 PHP 8.4 最大的更新了,非常期待,又少寫了好多程式碼 😂

interface HasAuthors
{
    public string $credits { get; }
    public Author $mainAuthor { get; set; }
}

無需括號的新例項鏈式呼叫 RFC

如果屬性鉤子還不夠,PHP 8.4 還有一個功能可以節省大量程式碼, 那就是不再需要將新例項呼叫包裹在括號內才能鏈式呼叫方法。這個修改個人覺得蠻好的,想到每次都需要這樣

$name = (new ReflectionClass($objectOrClass))->getShortName();

現在(php8.4)只需要這樣做

$name = new ReflectionClass($objectOrClass)->getShortName();

JIT 改變 RFC

PHP 8.4 改變了啟用 JIT 的方式。在 PHP 8.4 之前,必須將 opcache.jit_buffer_size 設定為 0 才能禁用 JIT,但現在可以這樣禁用它:

opcache.jit=disable
opcache.jit_buffer_size=64m

使用者受到此更改影響的唯一方式是如果他們指定了 opcache.jit_buffer_size 但沒有 opcache.jit。在這種情況下,就必須新增 opcache.jit=tracing 來重新啟用 JIT

最後,還對 JIT 進行了改進,使其在某些情況下執行更快,並使用更少的記憶體。

隱式可空型別棄用

PHP 有一個奇怪的行為,帶有預設 null 值的型別化變數會自動變為可空型別:

function save(Book $book = null) {}

這種行為現在已被棄用,並將在 PHP9 中刪除。解決方案是將 Book 顯式設為可空型別:

function save(?Book $book = null) {}

新 DOM HTML5 支援 RFC

PHP 8.4 新增了一個 \Dom\HTMLDocument 類,能夠正確解析 HTML5 程式碼。舊的 \DOMDocument 類仍然可用以保持向後相容。

$doc = \Dom\HTMLDocument::createFromString($contents);

原文連結

相關文章