前瞻 PHP8.4 的新特性
前瞻 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);

浙公網安備 33010602011771號