PHP 7.4 老站迁到 8.2,先别急着改代码,我把函数签名扫了一遍

上个月接了个本地小厂的活:一台跑了五年的下单站,PHP 7.4 + MySQL 5.7,代码没有框架,全是手写 include。客户说主机商要停 7.4,让我直接升 8.2。你先别急,我第一件事不是改代码,是扫签名。

环境是这样的:代码 6 万多行,入口文件二十来个,第三方库只有两个老的 PDF 和 Excel 包,Composer 都锁在 1.x 的旧版本上。直接切 8.2 起不来,白屏,日志里全是 deprecated 和 TypeError。

我的做法是先在旧版本上把问题全挖出来,别升级后一个个撞。装个 PHPStan,不追求查全,只开签名相关的级别:

composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse app/ \
  --level 5 \
  --error-format=raw \
  > /tmp/sig.txt

6 万行跑一遍大概两分多钟。然后拿 grep 把和参数、返回类型相关的挑出来:

grep -E "Parameter|return type|expects" /tmp/sig.txt | sort | uniq -c | sort -rn

结果前三条很典型:一个是给 strlen() 传了 null,一个是自定义函数默认参数写在必填参数前面,还有一个是 implode() 参数顺序反了。这三类在 7.4 里只是警告,8.x 直接报错。

为什么先扫而不是先跑?因为白屏会把你带到第一个错,修完再白屏,再修,一个下单流程能来回七八次。静态扫一遍,把同一类问题一次性清掉,代价是要额外配半小时环境,还得忍受误报。我一般把 level 卡在 5,再高误报多得没法看。

哪里会失效:动态调用多的代码 PHPStan 看不出来,比如 call_user_func_array 拼参数、${$var} 这种,扫完照样在运行时报错。还有个坑我自己踩过——扫的时候把 vendor 也带进去了,一堆第三方老包的签名错误混进来,白改了三天。后来加了 --exclude=vendor 才干净。另外那个老 PDF 包本身不兼容 8.2,扫代码没用,只能换包或者锁在旧版本。

你们迁 8.x 的时候,implode() 参数反了这种,是全局搜出来改,还是等报错再改?

0
赞同度 100% · 0 条评论 · 7 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。