PHP 8.2将在今年内发布,一起来看看都有什么新特征

易航
2022-08-19 / 2 评论 / 95 阅读 / 正在检测是否收录...

PHP 8.2预计将于今年11月发布,最新的稳定版本是PHP 8.1.5。虽然现在还为时过早,但对更新的接受程度参差不齐。
但是,知道会发生什么可以帮助您为最新的PHP版本做好准备。通过了解新功能和不推荐使用的功能,您可以了解更新可能如何影响开发。这些知识还可以帮助您为最终发布做好准备。
在这篇文章中,我们将回顾最新的PHP版本。然后我们将介绍PHP 8.2中的新功能并讨论发布时间表。

PHP版本概述

PHP 7.4引入了类型化属性、下划线数字分隔符和各种改进。从那时起,已经发布了更多的PHP迭代。
2020年11月发布的PHP 8.0带来了一些基本功能。除了语法和性能增强之外,该版本还包括:

  • 命名参数
  • 匹配语法
  • Union类型
  • Constructor Property Promotion
  • JIT(影响PHP执行源代码的方式)
  • 一年后出现了PHP 8.1,这是最新的主要PHP版本。此更新包括重要功能,例如:
  • Intersection类型
  • 只读属性
  • Enums
  • Fibers
  • 从不返回类型

掌握最新版本的PHP有助于提高网站的性能和安全性。但是,重要的是要知道在升级之前会发生哪些变化。如果您有兴趣测试PHP 8.2的当前状态,可以通过GitHub进行。

PHP 8.2中的新功能

PHP 8.2预计将于2022年底发布。这是当前的发布时间表,计划于2022年11月24日发布通用版本 (GA):

根据PHP网站上的官方文档,应该有一些新特性和不推荐使用的功能。

新的 memory_reset_peak_usage 函数

PHP 8.2将包含一个名为 memory_reset_peak_usage 的新函数。它将重置 memory_get_peak_usage 函数返回的峰值内存使用量。
对于涉及多次调用操作并记录每次迭代的峰值内存使用情况的情况,此功能将很有帮助。开发人员将能够使用此新功能在请求的生命周期内的任何给定时间重置峰值内存使用量。

只读类

在PHP 8.1中引入,只读属性将在PHP 8.2中扩展以添加语法糖,以便所有类属性一次都是只读的:

readonly class Post
{
    public function __construct(
        public string $title,
        public Author $author,
        public string $body,
        public DateTime $publishedAt,
    ) {
    }
}

这将防止将动态属性添加到类中。

NullFalse 独立类型

在PHP 8.2中,false 的返回类型将作为独立类型使用,而不是严格的联合类型,用于发生错误时,这已经是可能的:

function alwaysFalse(): false
{
    return false;
}

null 类型也是如此。例如,作为独立类型,与以前不同,NullPost::getAuthor() 将只能返回 null

弃用动态属性

动态属性将在PHP 8.2中被弃用,导致PHP 9.0出现 ErrorException。这些属性是在对象上设置的:

class Post
{
    public string $title;
}
// …
$post->name = 'Name';

动态属性允许在没有严格的类声明的情况下创建类(例如,值对象)时具有灵活性。对于依赖动态属性的开发人员来说,他们的弃用可能会成为一个问题,因为这会促使他们更多地进行静态分析。出于这个原因,一些开发人员对PHP 8.2的这种变化感到担忧。
但是,使用 __get__set 的类仍将支持动态属性,stdClass 的对象也将如此。

或者,开发人员可以在这些属性的类上使用在全局命名空间中声明的新 #[AllowDynamicProperties]attribute:

# [AllowDynamicProperties]
class User{}
$user = new User();
$user->foo = 'bar';

虽然不建议这样做,但另一种选择是禁用弃用警告。

新的 /n 修饰符

PHP 8.2将包含对 preg_* 函数系列的 /n (no capture) modifier的支持。使用时,除了已命名的捕获组之外,任何具有()meta-characters的组都不会捕获。
本质上,结果与将每个组标记为非捕获相同。
此更改背后的原因是修饰符简化了多个组的复杂正则表达式。开发人员可以将所有组标记为非捕获,而不是将每个组都营销为非捕获。
然后,他们可以选择并命名需要捕获的特定组。

在回溯中编辑参数

许多开发人员使用从代码库跟踪堆栈跟踪和生产错误的服务。这些服务可以在出现问题时通知用户。例如,在调试应用程序时跟踪调用堆栈很有帮助。
但是,有时堆栈跟踪可能包含敏感信息,例如用户名和密码。PHP 8.2将包含一个 #[SensitiveParameter] 属性,当出现问题时,该属性将防止此信息包含在堆栈跟踪中:

function test($foo, #[\SensitiveParameter] $bar, $baz)
{
    throw new Exception('Error');
}
test('foo', 'bar', 'baz');

PHP 8.2将使用敏感参数从堆栈跟踪中编辑私有信息,使其更加安全。这些参数确保数据不会出现在错误日志中。请注意,此属性仅可用于参数。

弃用 ${} 字符串插值

有多种方法可以使用PHP在字符串中嵌入变量。但是,PHP 8.2将弃用两种方法。第一个是在字符串中使用 ${}:

$str = "Hello ${world}";

第二个是使用 ${}(变量)

$str = "Hello ${(world)}";

这对开发人员来说可能不是一个重大问题,因为两种最流行的字符串插值方法仍然有效。

弃用部分支持的可调用对象

另一个不推荐使用的更改是部分支持的callables。有多种方法可以在 PHP 中创建可调用对象。可以使用 $callable() 语法、user_call_func(array) 或使用带有回调的函数调用带或不带参数的函数。
已弃用的可调用模式包括以下内容:

$callable = "self::method";
$callable = "parent::method";
$callable = "static::method";
$callable = ["self", "method"];
$callable = ["parent", "method"];
$callable = ["static", "method"];
$callable = ["MyClass", "MyParentClass::myMethod"];
$callable = [new MyClass(), "MyOtherClass::myMethod"]

从PHP 8.2开始,调用上述任何一个都将导致以下弃用通知:

class Test
{
    public static function myMethod(): void
    {
        echo "Called";
    }

    public static function call(): void
    {
        $callable = 'self::myMethod';
        call_user_func($callable);
    }
}

$callable = Test::call();

// "Called"

但是,将这些可调用对象传递给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不可用的最大功能。

1

评论 (2)

取消
  1. 头像
    nb
    Android · Google Chrome

    QQ

    回复
  2. 头像
    子寒88
    Android · Google Chrome

    QQ

    回复