PHP Codesniffer自定义规则:constant :: class而不是string

时间:2016-08-25 20:55:46

标签: php phpcodesniffer

在我的一个客户的代码库中,我看到许多对限定类名称的引用为字符串;

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

而不是使用:

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

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

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

另一种选择是先收集'所有类名(基于T_CLASS标记)并根据收集的类列表分析之后的所有字符串。实现IMHO并不容易,因为CodeSniffer基于每个文件工作。

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

有人提出另一个我们没想过的建议吗?!

1 个答案:

答案 0 :(得分:2)

好消息! 我创建了此修复程序 - you can find it here

最好是将它与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

欢迎并告诉我它是如何运作的。

如果出现任何问题,请create an issue here。我很乐意尽可能地改进这个工具。