如何编写Rector规则移除PHP中的fuzzy_logic()函数调用?
自定义Rector规则移除
fuzzy_logic()函数调用并保留参数 实现思路
不用现成的RemoveFuncCallRector(它会把函数调用连参数一起删掉),我们要做的是:识别出fuzzy_logic()的调用,直接用它的参数替换掉整个函数调用节点。
完整规则代码
<?php declare(strict_types=1); namespace Rector\YourNamespace; // 替换成你项目的实际命名空间 use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; final class RemoveFuzzyLogicFuncCallRector extends AbstractRector { public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( '移除废弃的`fuzzy_logic()`函数调用,保留其内部参数', [ new CodeSample( <<<'CODE_SAMPLE' $x = (int) trim(fuzzy_logic(floor($x1 / $x2))); $t = fuzzy_logic([$title,$desc]); $z = trim(fuzzy_logic($z)); $i = fuzzy_logic($i); CODE_SAMPLE , <<<'CODE_SAMPLE' $x = (int) trim(floor($x1 / $x2)); $t = [$title,$desc]; $z = trim($z); $i = $i; CODE_SAMPLE ), ] ); } /** * @return array<class-string<Node>> */ public function getNodeTypes(): array { return [FuncCall::class]; } /** * @param FuncCall $node */ public function refactor(Node $node): ?Node { // 仅处理名为fuzzy_logic的函数调用 if (! $this->isName($node->name, 'fuzzy_logic')) { return null; } // 确保函数有且只有一个参数(适配你的代码场景) if (count($node->args) !== 1) { return null; } // 用函数的第一个参数替换整个函数调用节点 return $node->args[0]->value; } }
关键逻辑说明
getNodeTypes():告诉Rector这个规则专门处理函数调用节点(FuncCall类型)refactor():核心处理逻辑:- 判断当前函数是否为
fuzzy_logic,不是则跳过 - 检查参数数量(你的场景均为单参数,加此判断避免意外)
- 返回参数节点,直接替换原函数调用节点
- 判断当前函数是否为
- 嵌套调用场景(比如
trim(fuzzy_logic(...)))会被自动递归处理,替换后自然变成trim(...)
启用规则
在你的rector.php配置文件中添加该规则:
<?php declare(strict_types=1); use Rector\YourNamespace\RemoveFuzzyLogicFuncCallRector; use Rector\Config\RectorConfig; return RectorConfig::configure() ->withRules([ RemoveFuzzyLogicFuncCallRector::class, ]);
之后运行Rector命令即可完成代码替换:
# 先预览变更,不实际修改代码 vendor/bin/rector process src --dry-run # 确认无误后执行实际替换 vendor/bin/rector process src
内容的提问来源于stack exchange,提问作者Kim Steinhaug
相关产品推荐
相关产品推荐

