PHP 8.1的新增功能

2021-01-30 03:07:15

PHP 8.1目前正在积极开发中,可能会在2021年11月下旬发布。我们已经知道一些功能,更改和不赞成使用的东西,因此让我们逐一介绍它们。

您是否想了解有关PHP 8.1开发的最新信息?订阅我的时事通讯并偶尔收到更新:

与每个版本一样,PHP 8.1添加了一些不错的新功能。请记住,该列表将在一年中增长。我还会列出尚未实现的功能,但很有可能最终使用该语言。我将确保始终标记这些功能。

数组拆包已在PHP 7.4中允许,但仅适用于数字键。之前不支持字符串键的原因是,关于如何合并数组重复项没有共识。 RFC通过遵循array_merge的语义彻底解决了这个问题:

$ array1 = [" a" => 1]; $ array2 = [" b" => 2]; $ array = [" a" => 0,... $ array1,... $ array2]; var_dump($ array); // [" a" => 1," b" => 2]

您可能不得不偶尔处理一下:确定数组的键是否从索引0开始按数字顺序。就像json_encode决定是将数组编码为数组还是对象一样。

PHP 8.1添加了一个内置函数来确定数组是否是具有这些语义的列表:

$ list = [" a&#34 ;," b&#34 ;," c"]; array_is_list($ list); // true $ notAList = [1 => " a",2 => " b",3 => " c"]; array_is_list($ notAList); // false $ alsoNotAList = [" a" => " a"," b" => " c" => " c"]; array_is_list($ alsoNotAList); //错误

现在,您可以使用0o和0O表示八进制数字。前面的表示法也可以使用以0开头的数字作为前缀。

即使还没有投票,这个增加枚举的提议还是被热情地接受了。如果您不确定它们增加的价值,可以在这里阅读有关它们的信息。

添加枚举将是PHP的重大改进,因此我非常期待看到此RFC进一步发展。为了让您快速预览它们的外观,下面是一个代码示例:

class {public function(private Status $ status = Status :: Pending;){} public function(Status $ status):{//…}} $ post-> setStatus(Status :: Active);

虽然PHP 8.1是次要版本,但从技术上讲,会有一些更改可能是重大更改,并且不建议使用。让我们一一讨论。

$ GLOBALS的用法稍作更改将对所有阵列操作的性能产生重大影响。 Nikita很好地解释了RFC中的问题和解决方案。该更改意味着$ GLOBALS无法再处理某些边缘情况。 "不再支持对$ GLOBALS进行整体写入。以下所有内容都会产生编译时错误&#34 ;:

Nikita分析了Packagist上排名前2000的软件包,仅发现23个受此更改影响的案例。 我们可以得出结论,此更改(从技术上来说是重大突破)的影响将很小,这就是内部人员决定在PHP 8.1中添加它的原因。 请记住,鉴于代码更改对代码性能的积极影响,我们大多数人都会从中获胜。 这项更改很简单:内部函数当前为不可为空的参数接受null,此RFC弃用了该行为。 例如,这目前是可能的: 在PHP 8.1中,这些类型的错误将引发弃用警告,在PHP 9中,它们将转换为类型错误。 到目前为止,请记住,我会在一年中定期更新此帖子,因此,如果您希望保持关注状态,请确保订阅。 您为PHP 8.1感到兴奋吗? 在Twitter上告诉我!