You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Rector规则的refactor函数中,如何将Node节点打印为PHP代码?

在Rector规则的refactor函数中打印Node节点为PHP代码的方法

要在Rector规则的refactor函数中将当前Node节点输出为PHP代码,核心是利用Rector内置的PrinterInterface组件,步骤如下:

1. 注入PrinterInterface依赖

在自定义规则类的构造函数中注入PrinterInterface,这是Rector依赖注入机制的标准用法:

use PhpParser\Node;
use Rector\Core\Contract\Rector\RectorInterface;
use Rector\Core\Printer\PrinterInterface;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;

final class YourCustomRector implements RectorInterface
{
    public function __construct(
        private readonly PrinterInterface $printer
    ) {
    }

    // 实现规则描述方法
    public function getRuleDefinition(): RuleDefinition
    {
        return new RuleDefinition('自定义规则的功能描述', []);
    }

    // 指定当前规则要处理的Node类型
    public function getNodeTypes(): array
    {
        return [Node\Expr\Assign::class]; // 示例:处理赋值表达式节点
    }
}

2. 在refactor方法中打印Node节点

拿到当前处理的Node后,调用PrinterInterface的print()方法即可将Node转换为对应的PHP代码字符串,随后直接输出即可:

public function refactor(Node $node): ?Node
{
    // 将Node节点转换为PHP代码字符串
    $nodePhpCode = $this->printer->print($node);
    
    // 打印输出,可根据环境选择合适的方式
    var_dump($nodePhpCode);
    // 若项目安装了Symfony VarDumper,可使用更美观的格式化输出
    // dump($nodePhpCode);

    // 你的重构逻辑代码...
    return $node;
}

额外说明

  • 如果需要打印包含该Node的整个PHP文件代码,可通过Node的文件信息获取路径后,使用printFile()方法:
    $filePath = $node->getStartFileInfo()->getPath();
    $fullFileCode = $this->printer->printFile($filePath);
    
  • 若你的规则继承自AbstractRector,则无需手动注入PrinterInterface,直接使用$this->printer即可调用相关方法。

内容的提问来源于stack exchange,提问作者realtebo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:26:00