前瞻 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);
原文連結