编程 PHP 8.6 弃用清单:升级前先跑一遍这行 grep

2026-10-06 21:02:57

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 之前处理完移除项。

复制全文 生成海报 PHP 8.6 弃用 升级

推荐文章

程序员茄子在线接单