PHP 8.6 弃用清单:升级前先跑一遍这行 grep
PHP 8.6 deprecations RFC 列出在 PHP 8.6 弃用、PHP 9 移除的项,除特别说明。也就是说,升级到 PHP 8.6 不会立即 fatal,但 E_NOTICE / E_DEPRECATED 会出现在日志里;PHP 9 会直接移除。PHP 8.6 已在 2026-09-24 发布 RC2,计划 2026-11-19 GA。把 CI 的 deprecation 日志打开,或者先跑下面那行 grep。
函数别名与 SPL
is_integer()、is_long()是is_int()的别名,is_double()是is_float()的别名,doubleval()是floatval()的别名。升级时统一改成后一组:is_int()、is_float()、floatval()。spl_object_hash()弃用。如果代码把它当对象唯一 ID 存缓存或数组 key,需要换实现。spl_classes()弃用。常见于调试、反射或类列表输出,检查调用点。
mbstring 与流过滤器
mb_ereg*()系列弃用。RFC 说明 Oniguruma 已 EOL,mb_regex走向结束。相关正则逻辑应迁移到preg_*,迁移时注意编码和正则语法差异。dechunk流过滤器弃用,主要用于php://filter的用户态用法,例如php://filter/dechunk/resource=...。弃用原因是攻击面考虑。
语言结构:返回值
- 从
finally块返回值弃用。finally里的return会覆盖try/catch的返回值,PHP 9 移除后行为不再可用。 - 从
__construct()/__destruct()返回值弃用。构造函数和析构函数不应返回业务值,检查是否有return $x;写法。
关键字与 define()
- 以下名字作为标识符会被弃用,为未来关键字预留:
namespace作类常量名;in、out、inout、is、readonly、下划线_作为标识符。检查类常量、方法名、函数名、属性名和变量名。 define()带$case_insensitive指定弃用,即define('FOO', 'bar', true);这种第三个参数传true的写法。
字符串、排序与类型判断
metaphone()弃用。strcoll()弃用;sort()的SORT_LOCALE_STRING标志弃用。涉及 locale 字符串排序的代码需要重新评估。is_subclass_of()/is_a()在第一个参数是字符串且$allow_string为false时弃用。
SPL 与 mysqli
ArrayIterator继承ArrayObject实现的方法弃用。不要依赖ArrayIterator从ArrayObject继承来的那套方法。SplFileObject的 CSV 方法弃用。mysqli::stmt_init、mysqli_get_charset()弃用。检查 mysqli 初始化和字符集获取逻辑。
Reflection 与参数类型
ReflectionProperty::setValue()/setRawValue()传入错误类型弃用。ReflectionMethod::invoke()/invokeArgs()对静态方法传对象弃用。- 把对象当数组传给若干参数也会弃用,包括 zlib 的 init/inflate、
mb_convert_variables()、http_build_query()等。
一行 grep 自查
grep -RInE --exclude-dir=vendor --exclude-dir=.git --exclude-dir=node_modules 'is_integer\(|is_long\(|is_double\(|doubleval\(|spl_object_hash\(|spl_classes\(|mb_ereg|dechunk|SORT_LOCALE_STRING|strcoll\(|metaphone\(|is_subclass_of\(|is_a\(|stmt_init\(|mysqli_get_charset\(|ReflectionProperty|ReflectionMethod|http_build_query\(|mb_convert_variables\(|ArrayIterator|SplFileObject|define\([^;]*,[^;]*,[[:space:]]*true' .
这行命令覆盖函数名、方法名和标志。finally 返回值、__construct() / __destruct() 返回值,以及 in / out / inout / is / readonly / _ 这类命名,grep 只能给候选,仍需人工结合语义检查。升级路径按 RFC 走:PHP 8.6 先清 E_NOTICE / E_DEPRECATED,PHP 9 之前处理完移除项。