在我的一个客户的代码库中,我看到许多对限定类名称的引用为字符串;
[
'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的自动加载文件并尝试匹配类映射和命名空间。也不是很可靠和干净。
有人提出另一个我们没想过的建议吗?!
答案 0 :(得分: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
欢迎并告诉我它是如何运作的。
如果出现任何问题,请create an issue here。我很乐意尽可能地改进这个工具。