升级指南关于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首先会给予你警告提示。然而,存在一些废弃功能会引发错误情况或者出现不兼容的状况,特定的状况是:。
容易踩坑的地方:
替换和替代策略
每个废弃功能怎么替换,看下面:
__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()做这件事。