PHP 8.5升级指南:废弃功能及迁移方案,助你轻松应对

检测维修 0 40

升级指南关于PHP 8.5,知道即将废弃的11个功能,明白有如何完整迁移的方案, 。

PHP 8.5打算在2025年11月20日发布,它带来了新的功能,有着语法方面的改进,当然也有着废弃功能。废弃意味着告知你某些语言特性、函数或者行为会在未来版本(通常是PHP 9.0)中被移除或者变得更加严格。早点进行升级能够避免代码出现问题,能够保持兼容性,还能让你使用上更具现代感、更加安全的PHP。

这篇文章我会讲:

原文链接,PHP 8.5 升级指南,知晓即将要被废弃的 11 个功能,还有完整的迁移方案 。

PHP 8.5 中被废弃的功能

下边这些,是 PHP 8.5 里头最为关键的一部分被废弃掉的功能,主要是从 PHP RFCs 以及变更日志那儿来的。

__sleep() 和 __wakeup() 魔术方法

这一些方法不可以再被使用了,需要改换为 __serialize() 以及 __unserialize()。

非标准的类型转换/标量转换名称

把 integer 这种转换名称用不了啦,double 这种转换名称也不行了,boolean 这种转换名称同样不行了,binary 这种转换名称还是不行了。如今得用标准形式,那就是 int,float,bool,string。

使用反引号(`)作为 shell_exec() 的别名

反引号语法去执行 shell 命令,现在已经没办法使用了,要替换成 shell_exec()。

使用null当作数组偏移,于array_key_exists()里进行操作,。

传 null 作为键不行了。要传有效的键类型。

常量重复声明

同一个常量定义多次不行了。

某些 INI 指令的废弃

以下指令被废弃或移除:

标准库函数的 null 参数

给readdir这个函数,传null当作目录句柄,不行了,给rewinddir这个函数,传null当作目录句柄,不行了,给closedir这个函数,传null当作目录句柄,不行了。

资源关闭/释放函数

手动将函数关闭这一行为没办法使用了,当下资源全部都是对象,这些对象是要由析构函数来实施自动处理操作的。举例说明如下:

MHASH_* 常量

过去的 MHASH_* 常量已不可使用,现需改用现代哈希 API,也就是 hash() 以及 openssl,。

用户输出处理器返回非字符串

自定义输出缓冲处理器必须返回字符串。返回其他类型不行了。

从自定义输出缓冲处理器中发出输出

在自定义输出处理器里面直接输出内容不行了。

还有一些废弃,这些废弃与边界情况下的魔术方法相关,另外还有对 Directory 类的更改,这种更改比如不允许 new Directory(),不存在动态属性,不能够克隆,也不能序列化。

php代码检测工具_PHP8.5升级指南 废弃功能迁移方案 PHP8.5废弃功能替代策略

你的代码可能出现的问题

通常情况下,废弃功能自身一般不会立马致使代码处于挂掉的状态,而是PHP首先会给予你警告提示。然而,存在一些废弃功能会引发错误情况或者出现不兼容的状况,特定的状况是:。

容易踩坑的地方:

替换和替代策略

每个废弃功能怎么替换,看下面:

__sleep() / __wakeup()

替换为 __serialize() 以及 __unserialize() 来进行操作。这两者更为可靠,具备向前兼容性。要是需要对旧有的序列化数据予以处理,那就编写一个适配器用以支持两种格式。

不标准的转换,(整数、双精度浮点数、布尔值、二进制)。

变为标准类型转换:整型、浮点型、布尔型、字符串型。于代码库之中进行搜索替换。PHPStan或者Psalm这些静态分析工具能够助你找出剩余的非标准转换。

反引号别名 shell_exec()

将反引号,也就是`command`,替换为叫做shell_exec('command')的内容。如此一来,会更加清晰,更加安全,并且还能够避免出现有注入隐患的问题。

在数组偏移里出现的 null,(依靠 array_key_exists() 来判断)。

要传有效的键。如果键可能是 null,先处理一下:

常量重复声明

常量只定义一次。

废弃的 INI 指令

将这些过时的指令,从php.ini之中,或者从.user.ini里面,进行删除:

确保你的应用不再依赖这些设置。

资源释放/关闭函数

让析构函数自动处理清理,别手动调用:

若确实需手动进行释放,那就先查看对象是否具备有效性,或者采用更为新颖的API 。

MHASH 常量

把老的 MHASH_* 常量换成现代哈希 API:

这样更安全,也向前兼容。

输出缓冲处理器

更新自定义输出处理器:

Directory 类更改

不要一上来就运用那个new Directory() ,而是要转而采用dir()做这件事。

相关推荐: