从PHP 7.4升级到8.x时Rector强制与可选规则咨询
从PHP 7.4升级到8.x时Rector强制与可选规则咨询
嗨,针对你提到的Rector共有39条PHP 8.x升级规则(8.0占21条、8.1占9条、8.2占4条、8.3占4条、8.4占1条)的问题,我来帮你区分哪些是强制必须执行的,哪些是可选优化的:
一、强制规则(必须执行,否则会触发E_NOTICE/E_WARNING/E_DEPRECATED/E_ERROR)
这些规则对应的代码在PHP 8.x环境下运行会直接产生运行时错误或废弃通知,是升级过程中必须修复的:
PHP 8.0相关强制规则
- 修复
__autoload函数废弃问题:Rector\Php80\Rector\FuncCall\ReplaceAutoloadWithSplAutoloadRector—— PHP 8.0已废弃__autoload,不修复会触发E_DEPRECATED - 修复无参数
get_class()调用:Rector\Php80\Rector\FuncCall\GetClassToSelfClassRector—— PHP 8.0中在非类方法内调用无参数get_class()会直接抛出E_ERROR - 修复
token_get_all()返回值兼容:Rector\Php80\Rector\FuncCall\TokenGetAllToObjectRector—— PHP 8.0中该函数默认返回对象数组,旧代码处理字符串数组会触发类型错误 - 注解转属性(框架依赖场景):
Rector\Php80\Rector\Class_\AnnotationToAttributeRector—— 多数主流框架(如Symfony、Doctrine)在PHP 8.x版本已逐步废弃注解支持,不转换会触发警告
PHP 8.1相关强制规则
- 修复
array_key_exists()检查对象属性:Rector\Php81\Rector\FuncCall\ArrayKeyExistsOnObjectPropertyRector—— PHP 8.1中用该函数检查对象属性会触发E_WARNING - 修复
mb_strimwidth()参数顺序:Rector\Php81\Rector\FuncCall\MbStrimwidthEncodeRector—— PHP 8.1调整了该函数的编码参数位置,传参错误会导致逻辑异常或报错 - 修复mysqli连接相关废弃参数:
Rector\Php81\Rector\FuncCall\MysqliConnectErrorRector—— 相关参数在PHP 8.1中被废弃,不修复会触发E_DEPRECATED
PHP 8.2相关强制规则
- 修复动态属性禁用问题:
Rector\Php82\Rector\Class_\AddAllowDynamicPropertiesAttributeRector—— PHP 8.2默认禁用动态属性,未声明的动态属性赋值会触发E_ERROR - 修复
utf8_encode()/utf8_decode()废弃:Rector\Php82\Rector\FuncCall\Utf8EncodeDecodeToMbConvertEncodingRector—— 这两个函数在PHP 8.2中被废弃,不替换会触发E_DEPRECATED
二、可选规则(语法糖/代码优化,不修复不会触发运行时错误)
这些规则主要是帮你将代码升级为PHP 8.x的现代写法,提升代码可读性和简洁度,属于可选优化项:
PHP 8.0可选规则
Rector\Php80\Rector\Identical\StrEndsWithRector:用原生str_ends_with()替代自定义的字符串后缀判断逻辑Rector\Php80\Rector\FuncCall\NullCoalescingOperatorRector:用??空合并运算符替代冗余的isset()+三元判断Rector\Php80\Rector\Class_\StringableForToStringRector:给实现__toString()的类添加Stringable接口(仅语法规范优化)
PHP 8.1可选规则
Rector\Php81\Rector\FuncCall\FirstClassCallableRector:用第一类可调用语法($obj->method(...))替代Closure::fromCallable()Rector\Php81\Rector\Class_\EnumRector:将符合枚举特征的类转换为PHP 8.1原生枚举类型
PHP 8.3+可选规则
Rector\Php83\Rector\FuncCall\ArrayIsListRector:用原生array_is_list()替代自定义判断数组是否为列表的逻辑- PHP 8.4的唯一规则:多为新语法糖优化(如特定场景下用
str_in_array()替代in_array()),属于代码风格层面的优化
备注:内容来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

