随着 PHP 生态系统的不断发展,PHP 8.4 将给开发者带来一系列新功能和增强功能,将让开发更加顺畅、安全和高效。
PHP 8.4 计划于 2024 年 11 月 21 日发布,引入了几个值得开发者们探索,但又激动人心的更新。
增强的多字节字符串处理
PHP 8.4 的一个关键改进领域是多字节字符串的处理。
在新版本中引入了诸如mb_ucfirst、mb_lcfirst、mb_trim、mb_ltrim和mb_rtrim等函数,其目标是为开发者提供更好的工具来处理包含多字节字符的字符串。
这些函数确保对多字节字符串正确执行裁剪和更改大小写等操作,解决了从前版本的限制。
// mb_ucfirst 的用法示例
echo mb_ucfirst("translation"); //输出:“Translation”
DOM 扩展支持 HTML5
DOM 扩展在 PHP 8.4 中进行了重大更新,增加了对 HTML5 解析与序列化的支持。
新的DOM\HTMLDocument类允许开发者无缝处理 HTML5 内容,简化在 JavaScript 中嵌入 HTML 任务,并能够有效地处理现代化 Web 标准。
use DOM\HTMLDocument;
$htmlDocument = HTMLDocument :: createFromString ( 'Hello, HTML5!' );
更强劲的密码哈希算法
在 PHP 8.4 中,安全性强调仍是重中之重。现在,8.4版本将默认的 bcrypt 加密级别从 10 设置为 12,即增强了密码哈希的强度,增加了破解哈希所需的计算工作量,使其更能抵抗黑客们的暴力攻击。
属性钩子
属性钩子(也称为属性挂钩)是 PHP 8.4 的最新功能之一。此特性受 Kotlin 和 C# 等编程语言的启发,属性钩子允许开发者覆盖类属性的默认获取与设置行为。此功能增加了新的灵活性,允许在访问或修改属性时执行自定义逻辑。
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钩子的属性是虚拟属性。
关于属性钩子还有很多话要说,我们计划很快写一篇关于它们的后续文章,如果你对此感兴趣,请订阅21CTO公众号。
下面的一件事我想提一下,这也是我最热衷的:属性钩子可以在接口中定义!
interface HasAuthors
{
public string $credits { get; }
public Author $mainAuthor { get; set; }
}
新的去括号能力
就好像光有属性钩子是不够的一样,PHP 8.4还有另一个功能可以节省大量的样板代码:你不必再将新调用包装在括号中,就可以在它们上链接方法。
因此,原来是这样做:
$name = (new ReflectionClass($objectOrClass))->getShortName();
现在可以这样来写:
$name = new ReflectionClass($objectOrClass)->getShortName();
我不知道大家是怎么样的,但我写了很多这样的代码,所以我非常高兴终于摆脱了那些括号们。顺便说一句,它不仅适用于方法,还可以链接属性、静态方法、常量——无论你想要什么都可以。
JIT更改
PHP 8.4 改变了 JIT 的启用方式。以前,我们必须将 opcache.jit_buffer_size 设置为0才能禁用jit,但现在可以这样禁用它:
opcache.jit=disable
opcache.jit_buffer_size=64m
用户受此更改影响的是,如果他们明确指定了opcache.jit_buffer_size,但没有指定opcache.jit,这样是没有意义的。你必须添加opcache.jit=64m,跟踪才能启用jit。
最后,PHP8.4 也对JIT也进行了一些改进,在某些情况下使其运行更快,并占用更少的内存。
隐式可为null的类型弃用
PHP有这样一种奇怪的行为,即具有默认null值的类型化变量,将自动变为null:
function save(Book $book = null) {}
// Deprecated: Implicitly marking parameter $book as nullable is deprecated,
// the explicit nullable type must be used instead
现在这种行为现在已经被弃用,并将在PHP9中删除。解决方案是使Book显式为null:
function save(?Book $book = null) {}
结语
PHP 8.4 是一个重大更新,给开发者带来了众多增强功能。从改进的多字节字符串处理到 DOM 扩展中的 HTML5 支持,还有更强大的密码哈希处理,再有引入属性钩子,可以说此版本包含诸多的新功能,这将使 PHP 开发更加强大和安全。
无论您是处理大型 XML 文档,还是简化 HTTP 响应管理,PHP 8.4 都能为您和团队提供帮助——现在开始规划如何将这些新功能集成到您的项目中了。
敬请期待 2024 年 11 月 21 日的正式发布。
作者:万能的大雄