PHP 8.2 预计将于今年 11 月发布,最新的稳定版本是 PHP 8.1.5。虽然仍处于早期阶段,但人们对 PHP 8.2 和 WordPress 核心、插件和主题兼容性的接受程度参差不齐。
但是,知道会发生什么可以帮助您为最新的 PHP 版本做好准备。通过了解新功能和不推荐使用的功能,您可以了解更新可能如何影响开发。这些知识还可以帮助您为最终发布做好准备。
在这篇文章中,我们将回顾最新的 PHP 版本。然后我们将介绍 PHP 8.2 中的新功能并讨论发布时间表。让我们跳进去!
PHP 版本概述
PHP是 WordPress 的主要编程语言。它在将数据库中的数据转换为站点访问者的 HTML 网页方面起着至关重要的作用。
作为网站所有者或开发人员,您可能已经熟悉保持 WordPress 核心、主题和插件更新的重要性。但是,让您的 PHP 保持最新也很重要。
目前,WordPress 建议至少使用PHP 7.4。旧版本的 PHP 不再获得对安全更新和错误修复的积极支持。因此,升级到 PHP 的最新稳定版本可以带来更好的站点安全性、增强的性能和更高级别的支持(我们强调稳定是因为 WordPress 的 60,000 多个插件中的一部分还没有完全兼容 PHP 8.0,所以它是一个谨慎处理这些更新的好主意)。
PHP 7.4 引入了类型化属性、下划线数字分隔符和各种改进。从那时起,已经发布了更多的 PHP 迭代。
2020 年 11 月发布的 PHP 8.0 带来了一些基本功能。除了语法和性能增强之外,该版本还包括:
- 命名参数
- 匹配语法
- 联合类型
- 建设者物业促销
- JIT(影响 PHP 执行源代码的方式)
一年后出现了 PHP 8.1,这是最新的主要 PHP 版本。此更新包括重要功能,例如:
- 交叉口类型
- 只读属性
- 枚举
- 纤维
- 从不返回类型
掌握最新版本的 PHP 有助于提高网站的性能和安全性。但是,重要的是要知道在升级之前会发生哪些变化。如果您有兴趣测试 PHP 8.2 的当前状态,可以通过GitHub进行。
PHP 8.2 中的新功能
PHP 8.2 预计将于 2022 年底发布。这是当前的发布时间表,计划于 2022 年 11 月 24 日发布通用版本 (GA):
- 6 月 9 日:阿尔法 1
- 6 月 23 日:阿尔法 2
- 7 月 7 日:阿尔法 3
- 7 月 19 日:功能冻结
- 7 月 21 日:测试版 1
- 8 月 4 日:Beta 2
- 8 月 18 日:Beta 3
- 9 月 1 日:候选版本 1
- 9 月 15 日:候选版本 2
- 9 月 29 日:候选版本 3
- 10 月 13 日:候选版本 4
- 10 月 27 日:候选版本 5
- 11 月 10 日:候选版本 6
- 11 月 24 日:GA
根据PHP 网站上的官方文档,应该有一些新特性和不推荐使用的功能。让我们来看看其中的一些吧!
析取范式 (DNF) 类型
PHP 8.2 将引入一个新的析取范式 (DNF)类型特性。DNF 是一种组织布尔表达式的标准化方法——特别是,组织成 ORed 系列的 AND。当 DNF 应用于类型声明时,它启用了一种标准方法来编写解析器可以处理的联合和交集类型。
新的 mysqli_execute_query 函数和 mysqli::execute_query 方法
由于新的mysqli_execute_query($sql, $params)函数和mysqli::execute_query方法,在 PHP 8.2 中运行参数化 MySQLi 查询将更容易。
这将进一步降低使用参数化查询的复杂性,从而使开发人员更容易摆脱mysqli_query()以及用户值的危险/风险转义。
在 const 表达式中获取枚举属性
根据 RFC,“该 RFC 提议允许使用->/?->来获取常量表达式中枚举的属性。此更改的主要动机是允许在不允许枚举对象的地方获取名称和值属性,例如数组键。”
新的随机扩展
PHP 8.2 引入了一个名为random的新 PHP 扩展。它组织和整合了与随机数生成相关的现有 PHP 功能。它还引入了一系列 PHP 类结构和异常类,为随机数生成器和异常处理提供粒度选项。
随机扩展与 PHP 捆绑在一起,并且没有编译时或运行时配置选项来禁用随机扩展。随机扩展将始终在 PHP 8.2 及更高版本中可用。
新的 curl_upkeep 函数
PHP 8.2向 Curl 扩展添加了一个名为curl_upkeep的新函数。curl_upkeep 函数调用libcurl 中的curl_easy_upkeep(),这是 PHP Curl 扩展使用的底层 C 库。
curl_upkeep ()函数执行使 Curl 连接保持活动状态的工作。但并非 Curl 集成的每种连接类型都支持连接维护。目前,只有 HTTP/2 连接支持它。
新的 ini_parse_quantity 函数
ini_parse_quantity是 PHP 8.2 中将添加到 PHP 中的一个新函数。它解析 PHP INI 值识别的任何数据大小(例如 56K、256M 或 1G),然后以字节为单位返回数据大小。在解析 PHP 应用程序中现有的或提供的 INI 值时,它会很有用。但是,它无法识别 MB、MiB 或 GB 等数据大小的 IEC 后缀,也不适合将标准数据大小值转换为字节。
新的 memory_reset_peak_usage 函数
PHP 8.2 将包含一个名为memory_reset_peak_usage的新函数。它将重置memory_get_peak_usage函数返回的峰值内存使用量。
对于涉及多次调用操作并记录每次迭代的峰值内存使用情况的情况,此功能将很有帮助。开发人员将能够使用此新功能在请求的生命周期内的任何给定时间重置峰值内存使用量。
只读类
在 PHP 8.1 中引入,只读属性将在 PHP 8.2 中扩展以添加语法糖,以便所有类属性一次都是只读的:
只读类帖子 { 公共函数 __construct( 公共字符串 $title, 公共作者 $author, 公共字符串 $body, 公共日期时间 $publishedAt, ) {} }
这将防止将动态属性添加到类中。
Null、True 和 False 独立类型
在 PHP 8.2 中,false 的返回类型将作为独立类型使用,而不是严格的联合类型,用于发生错误时,这已经是可能的:
函数总是假():假 { 返回假; }
null 类型也是如此。例如,作为独立类型,与以前不同,NullPost::getAuthor() 将只能返回 null。
PHP 8.2 还允许将 true作为独立类型。
弃用动态属性
动态属性将在 PHP 8.2 中被弃用,导致 PHP 9.0 出现 ErrorException。这些属性是在对象上设置的:
类帖子 { 公共字符串 $title; } // … $post->name = '姓名';
动态属性允许在没有严格的类声明的情况下创建类(例如,值对象)时具有灵活性。对于依赖动态属性的开发人员来说,他们的弃用可能会成为一个问题,因为这会促使他们更多地进行静态分析。出于这个原因,一些开发人员对 PHP 8.2 的这种变化感到担忧。
但是,使用 __get 和 __set 的类仍将支持动态属性,stdClass 的对象也将如此。
或者,开发人员可以在这些属性的类上使用在全局命名空间中声明的新#[AllowDynamicProperties]attribute:
#[允许动态属性] 类用户(){} $user = 新用户(); $user->foo = 'bar';
虽然不建议这样做,但另一种选择是禁用弃用警告。
新的 /n 修饰符
PHP 8.2 将包含对preg_* 函数系列的/n(无捕获)修饰符的支持。使用时,除了已命名的捕获组之外,任何具有 () 元字符的组都不会捕获。本质上,结果与将每个组标记为非捕获相同。
此更改背后的原因是修饰符简化了多个组的复杂正则表达式。开发人员可以将所有组标记为非捕获,而不是将每个组都营销为非捕获。然后,他们可以选择并命名需要捕获的特定组。
在回溯中编辑参数
许多开发人员使用从代码库跟踪堆栈跟踪和生产错误的服务。这些服务可以在出现问题时通知用户。例如,在服务器上调试应用程序时跟踪调用堆栈很有帮助。
但是,有时堆栈跟踪可能包含敏感信息,例如用户名和密码。PHP 8.2 将包含一个#[SensitiveParameter] 属性,当出现问题时,该属性将防止此信息包含在堆栈跟踪中:
功能测试( $富, #[\SensitiveParameter] $bar, $baz ) { 抛出新异常('错误'); } 测试('foo','bar','baz');
PHP 8.2 将使用敏感参数从堆栈跟踪中编辑私有信息,使其更加安全。这些参数确保数据不会出现在错误日志中。请注意,此属性仅可用于参数。
弃用 ${} 字符串插值
有多种方法可以使用 PHP 在字符串中嵌入变量。但是,PHP 8.2 将弃用两种方法。第一个是在字符串中使用 ${}:
"你好 ${world}";
第二个是使用 ${} (变量):
"你好 ${(world)}";
这对开发人员来说可能不是一个重大问题,因为两种最流行的字符串插值方法仍然有效。
弃用部分支持的可调用对象
另一个不推荐使用的更改是部分支持的 callables。有多种方法可以在 PHP 中创建可调用对象。可以使用 $callable() 语法、user_call_func(/a_array) 或使用带有回调的函数调用带或不带参数的函数。
已弃用的可调用模式包括以下内容:
$callable = "self::method"; $callable = "父::方法"; $callable = "静态::方法"; $callable = ["self", "method"]; $callable = [“父”,“方法”]; $callable = [“静态”,“方法”]; $callable = ["MyClass", "MyParentClass::myMethod"]; $callable = [new MyClass(), "MyOtherClass::myMethod"];
从 PHP 8.2 开始,调用上述任何一个都将导致以下弃用通知:
类测试{ 公共静态函数 myMethod(): 无效 { 回声“被叫”; }
公共静态函数调用():无效{ $callable = 'self::myMethod'; call_user_func($callable); } }
$callable = Test::call(); // "被调用";
但是,将这些可调用对象传递给is_callable函数或将它们与可调用参数类型一起使用不会生成弃用消息。为了防止出现弃用通知,开发人员可以使用::class 魔术方法将可调用代码中的 parent、self 和 static 关键字转换为各自的类名。
更改背后的部分原因是允许将可调用对象用于类型化属性。它使它们不那么依赖于上下文。
MySQLi 不能再用 libmysql 编译
过去,PHP 支持两个库来连接 MySQL 数据库:mysqlnd 和 libmysql。自 PHP 5.4 起,前者已成为默认库。但是,可以通过扩展编译 MySQLi。
从 PHP 8.2 开始,将不支持使用 libmysql编译 MySQLi 扩展。尝试这样做会导致配置错误:
./configure --with-mysqli=FOO
不再支持将 mysqli 与外部库链接
这不太可能对开发人员造成任何重大错误。但是,通过 LDAP 和 SASL 自动重新连接和身份验证支持 libmysql 支持的两个 mysqlnd 不可用的最大功能。
使您的 WordPress PHP 版本保持最新
作为开发人员,必须针对即将发布的 PHP 版本测试您的代码。在这种情况下,开发人员应尽快开始针对 PHP 8.2 测试他们的代码,以确保您的代码在更新时不会破坏用户的站点。