5

在我的一个客户的代码库中,我看到很多对合格类名的引用作为字符串;

[
    'foobar' => 'My\Namespace\Class'
]

而不是使用:

[
    'foobar' => My\Namespace\Class::class
]

出于几个原因,我们想要添加一个 PHP CodeSniffer 规则来捕获这些字符串并添加一个警告,以便可以将字符串重构为 ::class 常量。第一部分(捕获字符串)很容易,但是因为我们正在进行静态代码分析,所以我们不能(例如)执行 class_exists 或查找 get_declared_classes() 的结果。

下一个选项可能是分析字符串本身([A-Za-z0-9]),但这不是很可靠,因为很多字符串会匹配但并不意味着是类名。

另一种选择是首先“收集”所有类名(基于 T_CLASS 令牌),然后根据收集的类列表分析所有字符串。恕我直言,实现起来不是很容易,因为 CodeSniffer 是在每个文件的基础上工作的。

我能想到的最后一个选项也很脏;因为我们总是在我们的项目中使用作曲家,所以我们可以使用作曲家的自动加载文件并尝试匹配类映射和命名空间。也不是很可靠和干净。

有人提出我们没有考虑过的其他建议吗?

4

1 回答 1

2

好消息!我创建了这个修复程序-你可以在这里找到它

最好的办法是像这样与EasyCodingStandard一起使用它:

# ecs.yml
services:
    Symplify\CodingStandard\Fixer\Php\ClassStringToClassConstantFixer: ~

安装:

composer require --dev symplify\easy-coding-standard

跑:

vendor/bin/ecs check src

使固定:

vendor/bin/ecs check src --fix

享受并让我知道它是如何为您工作的。

如果出现任何问题,只需在此处创建问题即可。我很高兴尽可能地改进这个工具。

于 2017-07-15T16:13:51.033 回答