前瞻 PHP8.4 的新特性

php8 · 浏览次数 : 9

小编点评

**PHP 8.4 新特性** **属性钩子** * 属性钩子允许每个属性定义自己的 get 和 set 钩子。 * 属性钩子是可选的,不必同时添加两个钩子。 * 例如,只有 get 钩子的属性是虚拟属性。 **JIT 改进** * PHP 8.4 使用 JIT 优化字符串连接。 * 这降低了字符串连接的内存消耗。 **链式调用** * 在不需要额外括号的情况下,可以使用链式调用方法。 **其他改进** * 优化属性获取器。 * 改善 DOM HTML5 解析性能。

正文

前瞻 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);

原文链接

与前瞻 PHP8.4 的新特性相似的内容:

前瞻 PHP8.4 的新特性

前瞻 PHP8.4 的新特性 PHP 8.4 将于 2024 年 11 月 21 日发布。它将包括属性钩子、JIT 改进,以及在不需要额外括号的情况下链式调用方法。这是一个大变化! 属性钩子 RFC 现代 PHP 历史上最大的变化之一:定义属性钩子的能力。 class BookViewModel {

前瞻|Java 21 新特性 String Templates(字符串模版)

在日常写Java的时候,对于字符串的操作是非常普遍的,其中最常见的就是对字符串的组织。也因为这个操作非常普遍,所以诞生了很多方案,总下来大概有这么几种: - 使用`+`拼接 - 使用`StringBuffer`和`SpringBuilder` - `String::format` and `Stri

PGO前瞻

原文在[这里](https://go.dev/blog/pgo-preview)。 > 原文发布于2023年2月8日 在构建Go二进制文件时,Go编译器会进行优化,以尽可能生成性能最佳的二进制文件。例如,常量传播可以在编译时对常量表达式进行求值,避免了运行时的计算开销;逃逸分析可以避免对局部作用域对

2.如何选择go语言基础类型——Leetcode习题9

[TOC] # 本篇前瞻 欢迎来go语言的基础篇,这里会帮你梳理一下go语言的基本类型,注意本篇有参考[go圣经](https://gopl-zh.github.io/),如果你有完整学习的需求可以看一下。另外,go语言的基本类型比较简单,介绍过程就比较粗暴,不过我们需要先从一个例题开始。 # Le

3.你所不知道的go语言控制语句——Leetcode习题69

[TOC] # 本篇前瞻 好的,现在你已经来到一个新的小结,在这里你将学习到go语言的重要内容,习得go 25个关键字中的12个:var, const, if, else, switch, case, default, fallthrough, for, break, goto, continue,

番外1.ssh连接管理器

[TOC] # 本篇前瞻 学习完go语言基础的专栏,我们究竟写出怎么样的实用工具呢?我在github上开源的[ssh连接管理器](https://github.com/Breeze0806/ssh-mgr)就是一个比较好的样例。 # 项目背景 这个项目的背景是之前我在上班时连接生产机器时只能使用“s

5.go语言函数提纲

1 本篇前瞻 前端时间的繁忙,未曾更新go语言系列。由于函数非常重要,为此将本篇往前提一提,另外补充一些有关go新版本前面遗漏的部分。 需要恭喜你的事情是本篇学完,go语言中基础部分已经学完一半,这意味着你可以使用go语言去解决大部分的Leetcode的题,为此后面的1篇,将带领大家去巩固go语言的

4.go语言复合类型简述

[TOC] # 1. 本章前瞻 很好,经过很长的时间,你终于来到go语言的复合类型中,这里会介绍go语言的3种复合结构:切片(slice,可变数组),映射(map)和字符串(string)。 有些老手可能会问: 1.那结构体(struct)呢,你怎么不介绍? 答:现在还没法完整地介绍结构体(stru

[转帖]“高密度核心”的角逐 —— AMD Bergamo SoC & Zen 4c 前瞻

https://zhuanlan.zhihu.com/p/585469720 最近这段时间一直在关注Bergamo和Zen 4c,但遗憾的是Genoa的发布会并没有提到太多的Bergamo细节。不过这并不妨碍我们借助已发布的硬件偷瞄它到底有几斤几两,提前解馋。 Bergamo SoC为何物 从目前各

兼容sentry协议的轻量级监控,glitchtip

前言 上一篇文章说了重启 sentry 的事 因为过程太折腾了,一度想过放弃 sentry 换成其他比较轻量级的开源监控系统 这不就给我找到了另外俩个 https://glitchtip.com/ https://www.highlight.io/ 这次就来试试这个 glitchtip 用了之后才发