PHP 8.5 將(jiang)帶來什么 🚀
PHP 8.5 將帶來什么 ??
PHP 8.5 仍在開發中;首個(ge)正式版本計劃于 2025 年(nian) 11 月 20 日(ri)發布(bu)。如果你想嘗試,nightly tarballs 和 Docker 鏡像(php:8.5.0-dev)已經可用。
新特性
| 領域 | 特性 |
|---|---|
| 語言語法 | 管道操作符 |> |
| 標準庫 | array_first(), array_last(), 新的 IntlListFormatter, curl_multi_get_handles(), locale_is_right_to_left() |
| 屬性 | #[\NoDiscard] + (void) 強制轉換 |
| 核心調整 | Directory 成為不透明/最終類 |
| 性能/IO | 原生 Zstandard 和 Brotli 壓縮 |
新的語言結構
管道操作符 |>
2025 年(nian) 2 月(yue)批準,管道(dao)將左側值傳(chuan)遞給右側的可調用對象(xiang),并從左到(dao)右求值。
$result = "Hello World"
|> htmlentities(...)
|> str_split(...)
|> fn($x) => array_map(strtoupper(...), $x)
|> fn($x) => array_filter($x, fn ($v) => $v !== 'O');
var_dump($result); // ['H','E','L','L','W','R','D']
Records — 不可變值對象
record 關鍵字(RFC 正在討論中,但趨(qu)勢積極)讓你可(ke)以用幾乎零樣板代碼聲明按(an)值傳遞的(de)不可(ke)變類型。
record Point(int $x, int $y);
$origin = &Point(0, 0); // 前導的“&”表示記錄實例化
echo $origin->x; // 0
構造函數屬性提升中的 final
很快你就可以將提升的屬性標記為 final,保證它們在構造后永不改變。投票已經壓倒性地支持。
class User
{
public function __construct(
final string $id,
public string $name,
) {}
}
常量表達式中的閉包
靜態閉包現在可以在 const、屬性(xing)參數(shu)(shu)和默認屬性(xing)/參數(shu)(shu)值中(zhong)使用 — 對于默認回調非常方便。已為 8.5 實現。
const DEFAULT_FILTER = static function (mixed $v): bool {
return !empty($v);
};
#[\NoDiscard] + (void) 強制轉換
標記必須消耗其返回值的函數;如果你真的想忽略它,可以將調用強制轉換為 (void) 以消除警告。
#[\NoDiscard('You probably meant to use this')]
function compute(): array
{
return [...];
}
(void) compute(); // 顯式丟棄 – 無警告
標準庫新增內容
| ? 新的 API | 為什么你會關心 |
|---|---|
array_first() / array_last() |
在 O(1) 時間內獲取第一個或最后一個元素,而不觸及內部指針。 |
curl_multi_get_handles() |
枚舉 multi-curl 資源中的所有句柄。 |
IntlListFormatter |
支持 i18n 的人性化列表(例如“apples, pears and peaches”)。 |
locale_is_right_to_left() |
無需 ICU 查找的快速 RTL 檢查。 |
php --ini=diff |
CLI 標志,僅打印你調整過的 INI 條目。 |
PHP_BUILD_DATE |
精確的構建時間戳嵌入到二進制文件中。 |
$items = ['??','??','??'];
echo array_first($items); // ??
echo array_last($items); // ??
引擎和核心庫調整
Directory 現在是不透明的
你不能再 new Directory() 或克隆/序列化它;將(jiang)其視(shi)為真正(zheng)的資源對象。
$dir = dir('.');
clone $dir; // 致命錯誤
new Directory(); // 致命錯誤
內置現代壓縮
Zstandard 和 Brotli 加入 zlib,為你(ni)提供快速、原生的 Web 壓縮。
$zip = zstd_compress($data);
$plain = brotli_uncompress($zip);
棄用內容
所有 MHASH_* 常量都將被棄用。
隨著 8.5 的穩定,預計會有(you)一輪新的小(xiao)邊緣案例清理。
總結
PHP 8.5 不是(shi)一(yi)個(ge)革命(ming)性(xing)的(de)版本,但它帶來了大量的(de)人體工程學(xue)改進:
- 函數式管道,使數據流更清晰
- 無樣板代碼的值對象
- 更安全的 API,引導你遠離陷阱
- 以及許多小而強大的生活質量提升
引用
- ?? 管道操作符 RFC —
- ?? Records RFC —
- ?? PHP.Watch 上的完整 8.5 變更日志 —
