PHP8.2更新了,进来看看有什么改动

PHP 8.2的更新给大家带来了类型系统改进、只读 readonly 类、敏感参数隐藏支持、新的随机 random 扩展,以及包括简化和现代化 PHP 在内的多项功能,是PHP 迈入现代化的重要里程碑。除了新功能和改进之外,PHP 8.2 还通过弃用动态属性支持、对 INI 配置值发出警告和修复一系列数组排序和字符串转换的遗留行为。


PHP8.2更新了,进来看看有什么改动


PHP8.2更新了,进来看看有什么改动


改进类型系统


PHP 8.2 解决了数个原有类型系统的短处和限制,让 PHP 项目得以拥有更好的类型安全性。这包括添加对 true 类型的支持,并允许将 null 和 false 用作独立类型,同时增加了对 DNF 类型的支持。


※Disjoint Normal Form (DNF) 类型支持 - 在 PHP 8.2 中,开发者可以组合使用联合 union 类型(PHP 8.0)和交集 intersection 类型(PHP 8.1),继而允许声明更加精确的参数、返回和属性类型。


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


(HTMLRequest & RequestInterface) | APIRequest 类型声明表示 $request 必须是 APIRequest 的示例,或者实现了 HTMLRequest 和 RequestInterface 。


另一方面,在加入了 true 和 false 独立类型后,可以将固定返回值的 bool 类型更改为具体的类型。


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


在过去,我们已经可以通过 string|null 的形式来定义可以为空的参数,而在 PHP 8.2 中,我们将可以直接使用 null 作为一个独立类型。


只读 readonly 类


PHP 8.1 添加了只读属性支持,只读类型只能在初始化时被赋值一次,其后的修改会被 PHP 阻止。


而 PHP 8.2 将只读属性延申到只读类中。当一个类被声明为只读类后,它的所有属性都会被自动声明为只读。此外,它还会确保只读类中的所有属性都带有类型声明。

// PHP 8.2
readonly class User {
    public string $username;
    public int $uid;
}
 
// PHP 8.1 等效写法
class User {
    public readonly string $username;
    public readonly int $uid;
}


全新随机 random 扩展


纵观 PHP 历史,它支持了各种随机数生成器(RNG)。每种生成器都具有不同的性能、使用场景和安全性。而 PHP 8.2 将所有 RNG 相关的功能重构成名为 random 新扩展。


random 扩展与现有的 API 保持兼容,同时提供相同的功能,因此 rand mt_rand random_bytes random_int 等函数可以继续工作,没有任何变化。但 random 扩展提供了全新的面向对象的 API 来生成具有模块化架构的随机数,令模拟 RNG 和提供新的 RNG 变得更加容易,使测试项目更加安全且便利。


Trait 中的常量


PHP 8.2 允许在 Trait 中定义常量。当然,你不能直接访问 Trait,但 Trait 中的常量会在被继承时成为类常量。


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'


需要注意的是,Trait 中的常量不可以和其他 Trait 或类中的常量冲突。


支持隐藏敏感参数


PHP 8.2 新增了 #[\SensitiveParameter] 参数注解,用于在错误和堆栈信息中隐藏实际值。


接受密码、私钥或其他敏感信息的函数可以使用 #[\SensitiveParameter] 来隐藏具体值。如果发生错误或异常,对应的值会被替换为 \SensitiveParameterValue 对象。


PHP 的内置函数(如 password_hash 和 password_verify)已使用 #[\SensitiveParameter] 参数注解。

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


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) {}
        }
    }
}


新函数和类


解析 INI 容量 ini_parse_quantity


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 弃用情况


PHP 8.2 也带来了相当一部分弃用。当语法、函数或特性被弃用时,PHP 会发出弃用通知,该通知不会中断 PHP 应用,但会记录到错误日志中。


弃用动态属性

PHP 8.2 中最值得注意的弃用之一是它弃用了动态声明的类属性。虽然可以忽略错误,但建议在类中声明类属性,加上类型声明就更好了。


class User {
    public int $uid;
}
 
$user = new User();
$user->name = 'Foo';

Deprecated: Creation of dynamic property User::$name is deprecated in ... on


许多古老的 PHP 应用程序很可能会受到此更改的影响,因为它们在扩展时往往不声明类属性,或者随着变化多年来不断发展。


当然了,选择忽略或例外也是存在的:


●  匿名类及其子类(stdClass)


●  具有 __get 和 __set 魔术方法的类


●  具有 #[AllowDynamicProperties] 注解的类


弃用 utf8_encode 和 utf8_decode 函数


PHP 8.2 终于弃用这两名字跟实际效果不一致的函数,虽然名为 utf8 但实际上是 Latin 1 (ISO-8859-1)。


大多数使用这些函数的 PHP 项目往往没有意识到这个问题。推荐的替代品包括 mbstring、iconv 和 intl 扩展以提供更好的功能。


弃用 ${var} 字符串格式


PHP 一直支持使用 foo {$bar} 模式的字符串变量插值,以及将美元符号放在大括号外的替代语法 foo ${bar}。


在 PHP 8.2 中,将美元符号放在花括号外的替代语法已弃用。


此外,PHP 8.2 还弃用了一些部分支持的 callable 模式和 Mbstring 扩展对 Base64、Uuencode、QPrint 和 HTML 实体编码的处理。


关于PHP8.2更新更新改动之解析到这里就结束了,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题