前瞻 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);
前瞻 PHP8.4 的新特性的更多相关文章
- php8.0正式版新特性和性能优化学习
前言 PHP团队宣布PHP8正式GA(链接).php的发展又开启了新的篇章,PHP8.0.0版本引入了一些重大变更及许多新特性和性能优化机制.火速学习下~ JIT(Just in Time Compi ...
- Java 8新特性前瞻
快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
目录 SignalR系列目录(注意,是ASP.NET的目录.不是Core的) 前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于Signal ...
- C# 11 的新特性和改进前瞻
前言 .NET 7 的开发还剩下一个多月就要进入 RC,C# 11 的新特性和改进也即将敲定.在这个时间点上,不少新特性都已经实现完毕并合并入主分支 C# 11 包含的新特性和改进非常多,类型系统相比 ...
- Java 9和Java 10的新特性
http://www.infoq.com/cn/news/2014/09/java9 Java 9新特性汇总 继2014年3月份Java 8发布之后,Open JDK加快了开发速度, Java 9的发 ...
- Red Hat OpenStack 10的新特性
这是Red Hat有史以来最好的版本,同时也是第一个长生命周期版本(最长五年支持),这篇文章会介绍为什么这是你私有云最好的礼物. 由于要使用命令行,以前安装OpenStack是很繁重的工作.这个版本提 ...
- Red Hat Enterprise Linux 7.x新特性
Red Hat Enterprise Linux 7.x新特性 RHEL7新特性简介 1. RHEL7目前支持架构 64-bit AMD.64-bit Intel.IBM POWER.IBM ...
- SQL Server 2014 新特性——内存数据库
SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...
- ElasticSearch 5学习(10)——结构化查询(包括新特性)
之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...
- [干货来袭]C#6.0新特性
微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...
随机推荐
- 如何在OpenHarmony上使用SeetaFace2人脸识别库?
简介 相信大部分同学们都已了解或接触过OpenAtom OpenHarmony(以下简称"OpenHarmony")了,但你一定没在OpenHarmony上实现过人脸识别功能,跟着 ...
- SQL HAVING 子句详解:在 GROUP BY 中更灵活的条件筛选
SQL HAVING子句 HAVING子句被添加到SQL中,因为WHERE关键字不能与聚合函数一起使用. HAVING语法 SELECT column_name(s) FROM table_name ...
- 【FAQ】获取Push Token失败,如何进行排查?
一. 获取Push Token的方式 获取Push Token有两种方式:一种是调用getToken方法向Push服务端请求Token,当getToken方法返回为空时,Token可通过onNewTo ...
- openGauss/MogDB调用C FUNCTION
openGauss/MogDB 调用 C FUNCTION 摘要 之前写过一篇关于postgresql 自定义函数实现,通过 contrib 模块进行扩展的帖子,今天和恩墨工程师进行了一些交流,在 M ...
- 鸿蒙智联生态产品《接入智慧生活App开发指导》(官方更新版)
原文:https://mp.weixin.qq.com/s/BDC-12aiZz2EhtjYLR7QIg,点击链接查看更多技术内容. 在HarmonyOS Connect生态产品应用开发过程中,很多开 ...
- HarmonyOS自动化测试框架—Hypium
原文:https://mp.weixin.qq.com/s/nb5txfDcmGn_VZJXRPEYUQ,点击链接查看更多技术内容. 应用开发过程中,要确保应用的功能和界面能满足预期,往往需要通过测试 ...
- HTC Vive之Unity3d开发日记——手柄交互编程
目录: HTC Vive之Unity3d开发日记 You can fool all the people some of the time,and some of the people ...
- AI数字人直播优势凸显,那么该如何打造AI数字人直播间?
近年来,我们听到了很多无人直播间,数字人直播间这些名词,很多人会好奇这到底是什么意思,没人还可以直播吗?那什么是AI数字人直播? AI数字人是用真人拍摄五分钟高清视频上传到青否数字人克隆端,生成的数字 ...
- 将项目封装进docker进行迁移和使用
首先要理解docker的基本使用,本文不做过多阐述,博主也对docker没有了解透彻. 这里列一下docker的基本命令: docker info # 查看docker信息 docker -v # 查 ...
- 力扣628(java)-三个数的最大乘积(简单)
题目: 给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积. 示例 1: 输入:nums = [1,2,3]输出:6示例 2: 输入:nums = [1,2,3,4]输出 ...