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

PHP 8.2版本发布

php  /  管理员 发布于 2年前   605

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扩展包实现图片的旋转验证、滑块验证示例
  • 昵称:

    邮箱:

    2条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 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
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

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

    侯体宗的博客