侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP 8.2版本发布

php  /  管理员 发布于 3个月前   182

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


  • 上一条:
    最新版PHP 8.2中的弃用情况
    下一条:
    在laravel中使用poster扩展包实现图片的旋转验证、滑块验证示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • windows系统中安装FFMpeg及在phpstudy环境php7.3 + php-ffmpeg扩展的使用流程步骤(0个评论)
    • 在php语言中对数组参数实现签名算法及加解密数组功能流程步骤(0个评论)
    • 在PHP语言中实现手机加密解密算法代码示例(0个评论)
    • 在PHP 8.3版本中json_validate跟json_decode函数对比浅析(0个评论)
    • 在PHP语言中class类自动加载相关文件浅析(0个评论)
    • 近期文章
    • 如何优雅处理async await错误推荐:await-to-js库(0个评论)
    • lodash工具库(0个评论)
    • 在Laravel项目中使用中间件方式统计用户在线时长功能代码示例(0个评论)
    • 在Laravel中构建业务流程模型(0个评论)
    • windows系统中安装FFMpeg及在phpstudy环境php7.3 + php-ffmpeg扩展的使用流程步骤(0个评论)
    • 在go语言中对浮点的数组、切片(slice)进行正向排序和反向排序(0个评论)
    • 在go语言中对整数数组、切片(slice)进行排序和反向排序(0个评论)
    • 在go语言中对字符串数组、切片(slice)进行排序和反向排序(0个评论)
    • 最新国内免注册ChatGPT体验站_ChatGPT镜像站访问链接地址2023/3/28持续更新(0个评论)
    • 在Laravel项目中的实现无密码认证之:发送邮箱链接授权(0个评论)
    • 近期评论
    • 博主 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 @ xiaoB 你只管努力,剩下的叫给天意;天若有情天亦老,..
    • xiaoB 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 会不会春节放假后又阳一次?..
    • BUG4 在

      你翻墙过吗?国内使用vpn翻墙可能会被网警抓,你需了解的事中评论 不是吧?..
    • 博主 在

      go语言+beego框架中获取get,post请求的所有参数中评论 @ t1  直接在router.go文件中配就ok..
    • Jade 在

      如何在MySQL查询中获得当月记录中评论 Dear zongscan.com team, We can skyroc..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客