首页
/ Rector自定义规则中处理除法运算的安全转换

Rector自定义规则中处理除法运算的安全转换

2025-05-24 10:42:31作者:毕习沙Eudora

在Rector项目中创建自定义规则时,处理PHP语法树节点需要特别注意节点的类型和结构。本文将深入分析一个将除法运算转换为安全除法函数调用的自定义规则实现,并解释其中的关键点。

问题背景

开发者尝试创建一个自定义Rector规则,目的是将普通的除法运算$a / $b转换为更安全的函数调用形式Functions::safeDivide($a, $b)。虽然规则逻辑看似正确,但在测试阶段遇到了PHPStan分析错误。

核心问题分析

错误信息表明PHPStan在分析转换后的代码时,试图访问不存在的value属性。这源于两个关键问题:

  1. 参数节点类型不正确:直接使用了除法运算的左右操作数作为函数参数,而没有将它们包装为Node\Arg类型
  2. 类名引用方式不标准:使用了简单的Name类而不是FullyQualified来表示完全限定的类名

解决方案实现

正确的实现应该如下:

private function processDivision(Div $node): ?Node
{
    if (!($node->left instanceof Expr) || !($node->right instanceof Expr)) {
        return null;
    }

    $staticCall = new StaticCall(
        new Name\FullyQualified('Functions'),  // 使用完全限定名称
        'safeDivide',
        [
            new Node\Arg($node->left),  // 将表达式包装为参数节点
            new Node\Arg($node->right)
        ]
    );

    return $staticCall;
}

技术要点解析

  1. 参数节点包装

    • 函数调用参数必须是Node\Arg类型
    • 直接使用表达式节点会导致PHPStan分析失败
    • Arg节点包装了实际表达式并可以包含参数传递方式等信息
  2. 类名引用方式

    • 对于完全限定的类名,应使用Name\FullyQualified
    • 这确保了类名解析的正确性,特别是在命名空间上下文中
    • 普通的Name类更适合相对名称或当前命名空间下的类
  3. 类型安全

    • 保持严格的类型检查,确保只处理有效的表达式节点
    • 使用instanceof验证节点类型,避免潜在的类型错误

最佳实践建议

  1. 在创建函数调用时,总是将参数表达式包装在Node\Arg
  2. 对于完全限定的类名引用,优先使用Name\FullyQualified
  3. 在节点转换前后保持类型一致性
  4. 编写测试用例时,注意覆盖各种边界情况
  5. 利用Rector提供的调试工具检查生成的AST结构

通过遵循这些原则,可以创建出健壮、可靠的自定义Rector规则,有效地进行代码转换和重构。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
openHiTLS-examplesopenHiTLS-examples
本仓将为广大高校开发者提供开源实践和创新开发平台,收集和展示openHiTLS示例代码及创新应用,欢迎大家投稿,让全世界看到您的精巧密码实现设计,也让更多人通过您的优秀成果,理解、喜爱上密码技术。
C
53
468
kernelkernel
deepin linux kernel
C
22
5
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
7
0
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
878
517
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
336
1.1 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
180
264
cjoycjoy
一个高性能、可扩展、轻量、省心的仓颉Web框架。Rest, 宏路由,Json, 中间件,参数绑定与校验,文件上传下载,MCP......
Cangjie
87
14
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
349
381
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
612
60