【问题标题】:PHP Codesniffer custom rule: constant ::class instead of stringPHP Codesniffer 自定义规则:常量 ::class 而不是字符串
【发布时间】:2017-01-02 10:26:31
【问题描述】:

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

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

而不是使用:

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

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

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

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

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

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

【问题讨论】:

  • 对我来说看起来很棒,你走了多远?我可以帮你解决这个问题,因为这在我的问题列表中。
  • 抱歉,目前没有进展。我还没有调查,但我可以想象像 PHPStan 这样的静态代码分析工具已经能够做到这一点。
  • 没问题。随意观看或合作解决此问题:github.com/Symplify/Symplify/issues/59 我可能会帮助您构建它。 PHPStan 只分析代码,不会改变任何东西。
  • 这里正在进行的工作:github.com/Symplify/Symplify/pull/262
  • 完成:github.com/Symplify/Symplify/blob/master/packages/… :) 您可以使用 EasyCodingStandard(推荐)或 PHP-CS-Fixer

标签: php phpcodesniffer


【解决方案1】:

好消息! 我创建了这个修复程序 - 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。我很高兴尽可能地改进这个工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2019-01-28
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多