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

如何编写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():核心处理逻辑:
    1. 判断当前函数是否为fuzzy_logic,不是则跳过
    2. 检查参数数量(你的场景均为单参数,加此判断避免意外)
    3. 返回参数节点,直接替换原函数调用节点
  • 嵌套调用场景(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:25:19