PHP 8.2版本发布

2023-06-01 00:00:00 php 版本 发布

PHP 8.2是PHP语言现代化进程中的一个重要里程碑。

除了令人振奋的新功能和改进之外,PHP 8.2 还通过取消对动态类属性的支持,在遇到某些非最佳 INI 配置值时发出警告,以及修复一些影响 PHP 对数组排序和某些类型的字符串转换/编码操作的传统 PHP 行为来简化语言。


最新版php8.2带来了类型系统的改进,以实现表达式和细粒度的类型安全、只读类、敏感参数编辑支持、新的随机扩展,以及许多新的功能,还有一些简化和现代化的PHP语言的变化。


类型系统的改进

PHP 8.2 解决了 PHP 类型系统的一些缺点和限制,使 PHP 应用程序享有更好的类型安全。

这包括增加对 true 类型的支持,允许 null 和 false 类型作为独立的类型使用,以及对 DNF 类型的支持。


PHP 8.2 支持 Disjoint Normal Form (DNF) 类型 - 现在可以结合 Union Types (PHP 8.0) 和 Intersection Types (PHP 8.1),使得声明精确和富有表现力的参数、返回和属性类型成为可能。

function process((HTMLRequest & RequestInterface) | APIRequest $request) {
  // ...
}

(HTMLRequest & RequestInterface) | APIRequest类型声明确保$request值是APIRequest的实例,或者是实现/扩展/实例HTMLRequest和RequestInterface的类对象。


支持true和false作为独立的类型,这使得在布尔值总是相同的情况下替换布尔类型声明成为可能。

function alwaysReturnsFalse(): false {}
function alwaysReturnsNull(): null {}
function alwaysReturnsTrue(): true {}

在旧的PHP版本中,已经可以声明nullable类型或带有null的联合类型。

从 PHP 8.2 开始,也允许将 null 作为一个独立的类型进行声明。


只读类

PHP 8.1 增加了对只读属性的支持。

一个只读属性只能被设置一次,而且PHP会主动防止该值被修改,即使是在类的范围内。

PHP 8.2 通过只读类使只读属性更上一层楼。

当一个类被声明为只读时,它的所有属性都被自动声明为只读。此外,它还防止了只读类的动态属性,并确保所有属性都是类型化的。

readonly class User {
    public string $username;
    public string $uid;
}

所有只读用户类的属性都被自动声明为只读。

//PHP 8.1 和 PHP 8.2

class User {
    public readonly int $uid;
    public readonly string $username;
}

readonly class User {
    public int $uid;
    public string $username;
}


新的随机扩展

在PHP的历史上,它支持各种随机数生成器(RNG),其性能、用例和对安全应用的适应程度各不相同。PHP 8.2更进一步,将所有与RNG相关的功能重构到一个名为随机的新扩展。

随机扩展在不破坏任何API的情况下提供了相同的功能,因此现有的rand、mt_rand、random_bytes和random_int函数可以继续工作而不需要改变。它还提供了一个新的OOP API来生成具有可插拔架构的随机数,所以现在很容易模拟RNG并提供新的RNG,使PHP应用安全且易于测试。


特质中的常量

在 PHP 8.2 中,现在可以在 traits 中声明常量。特质不能被直接访问,但当一个类使用该特质时,这些常量会成为类的常量。

trait FooBar {
    const FOO = 'foo';
    private const BAR = 'bar';
    final const BAZ = 'baz';
    final protected const QUX = 'qux';
}
class Test {
    use FooBar;
}
echo Test::BAZ; // 'bar'

这在 PHP 8.1 及以前的版本中是不允许的。

特质常量不能被直接访问(例如:FooBar::FOO是不允许的)。

特质常量也不能与其他特质或使用它们的直接类发生冲突。


敏感参数值重新处理支持

PHP 8.2 增加了一个新的内置参数属性,名为 #[\SensitiveParameter],PHP 确保在堆栈跟踪和错误信息中对实际值进行编辑。

接受密码、私钥或其他敏感信息的函数可以用 #[\SensitiveParameter] 属性声明参数。如果其中的函数调用导致PHP错误或异常,传递给该参数的实际值将被替换为一个 \SensitiveparameterValue 对象。


PHP的内置函数如password_hash和password_verify已经用#[\SensitiveParameter]属性声明。

 function passwordHash(string $password)  {
 function passwordHash(#[\SensitiveParameter] string $password)  {
       debug_print_backtrace();
 }
 passwordHash('hunter2');

在#[\SensitiveParameter]属性存在的情况下,所有的堆栈跟踪都会主动编辑传递给参数的实际值:

array(1) {
[0]=> array(4) {
  ["file"]=> string(38) "..."
  ["line"]=> int(9)
  ["function"]=> string(3) "foo"
  ["args"]=> array(1) {
     [0]=> string(38) "hunter2"
     [0]=> object(SensitiveParameterValue)#1 (0) {}
  }
}
}


新的函数和类

除了主要的新特性外,PHP 8.2 还带来了一系列新的函数和类。

解析 INI 数量值:

ini_parse_quantity

ini_parse_quantity 函数解析了 PHP INI 值所认可的任何数据大小(如 56K、256M 或 1G),并以字节为单位返回数据大小。

ini_parse_quantity('256M'); // 268435456


保持一个Curl连接的活力:

curl_upkeep

在 PHP 8.2 Curl 扩展中的 curl_upkeep 函数会触发底层的 Curl 库来运行必要的任务以保持 Curl 连接的活力。这个函数最常见的使用情况是通过定期调用 curl_upkeep 函数来保持一个 HTTP 持久连接(Keep-Alive)。


检索密码密钥长度:

openssl_cipher_key_length

在 PHP 8.2 OpenSSL 中,有一个名为 openssl_cipher_key_length 的新函数,用于返回任何支持的 OpenSSL 密码所需的密钥长度(字节)。


这个函数消除了为OpenSSL密码操作硬编码所需的密钥长度的需要。

openssl_cipher_key_length("CHACHA20-POLY1305"); // 32
openssl_cipher_key_length("AES-128-GCM"); // 16
openssl_cipher_key_length("AES-256-GCM"); // 32

重置记录的内存使用峰值:

memory_reset_peak_usage

PHP 8.2 增加了一个名为 memory_reset_peak_usage 的新函数,用来重置 memory_get_peak_usage 函数返回的峰值内存使用量。


这对于多次调用或迭代一个动作,并需要记录每次调用的峰值内存使用量的应用程序很有帮助。如果没有新的memory_reset_peak_usage函数重置内存使用的能力,memory_get_peak_usage就会返回整个运行过程中的绝对峰值内存使用。


相关文章:PHP 8.2中的弃用情况

https://www.zongscan.com/demo333/96086.html

相关文章