PHP 8.4 正式发布已有一段时间,它带来了一系列现代化功能,旨在让你的代码更简洁、更安全、更高效。无论你仍在使用 PHP 8.3 还是在考虑重构技术栈,现在都应该了解这两个版本的差异以及可以立即利用的变化。
本文将深入探讨 PHP 8.3 和 PHP 8.4 之间的关键差异、对开发者的意义,以及如何规划迁移。
PHP 8.4 于 2024 年 11 月发布,在 8.3 的坚实基础上进一步推进,带来了显著的语言增强。
在深入新功能之前,让我们回顾一下 PHP 8.3 带来的特性:
类型化类常量:允许为 const 声明类型,增强一致性并提早捕获错误。
<?php
class Status {
public const int CODE = 200;
}
json_validate() 函数:轻量级 JSON 验证,无解析开销。
动态属性弃用:访问未声明属性会抛出警告,这是向更好的对象建模迈出的重要一步。
JIT 小幅改进:PHP 8.3 带来了小幅运行时性能提升,主要集中在内部性能调优。
将整个类声明为不可变的。一旦构造完成,就无法修改其属性。
<?php
readonly class Config {
public string $env;
public int $timeout;
}
重要意义:在值对象、DTO 和配置中强制数据完整性。
PHP 现在允许在属性内定义内联的 get 和 set 逻辑 — 终于实现了!
<?php
class User {
public string $name {
get => $this->firstName . ' ' . $this->lastName;
set => [$this->firstName, $this->lastName] = explode(' ', $value, 2);
}
}
重要意义:简化封装,无需样板 getter/setter 方法。
分别控制属性的读写访问权限。
<?php
class Post {
public private(set) string $slug;
}
重要意义:适用于使某些值从外部不可变但内部可修改的场景。
延迟对象初始化直到绝对必要时。
<?php
$object = (new ReflectionClass(MyService::class))
->newLazyProxy(fn() => new MyService());
重要意义:加速大型应用的启动过程,提高 DI 容器效率。
PHP 的 DOM 扩展现在支持正确的 HTML5 解析:
<?php
$html = Dom\HTMLDocument::createFromString('<section>Hello!</section>');
重要意义:现代 HTML 解析变得更加可靠和符合规范。
new 之后的更简洁链式调用:
<?php
$user = new User()->setName("John")->activate();
重要意义:语法糖,让流畅接口感觉更现代。
PHP 8.4 引入了 array_find()
、array_any()
、array_all()
和 array_find_key()
:
<?php
$result = array_find([1, 2, 3], fn($n) => $n > 1); // 2
重要意义:更简洁的函数式数组操作。
这种写法现在会触发弃用警告:
<?php
function greet(string $name = null) {} // ❌
function greet(?string $name = null) {} // ✅
重要意义:推动开发者编写显式和类型安全的代码。
PHP 8.4 带来了显著的 JIT 和内存效率改进:
基准测试显示,在实际场景中比 PHP 8.3 有 5-10% 的性能提升。
?
的 default-null 参数php -d deprecated_functions=1
提早检测和修复问题readonly class
PHP 8.4 是迄今为止最开发者友好的版本之一。通过新的语法糖、不可变性支持和运行时效率,它清楚地表明 PHP 正在发展成为一种现代、类型化和可维护的语言。
如果你在使用 PHP 8.3,升级的风险很小 — 但在开发者体验方面的提升却是巨大的。