2016-08-25 52 views
5

在我的客戶我看到很多引用到一個合格的類名作爲字符串中的一個代碼庫;PHP Codesniffer自定義規則:常數::類,而不是字符串

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

而不是使用:

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

的一對夫婦的原因,我們要添加一個PHP CodeSniffer規則來捕獲這些字符串,並添加警告這樣的字符串可以重構的::類不變。 第一部分(捕捉字符串)很容易,但因爲我們正在執行靜態代碼分析,所以我們不能(例如)執行class_exists或查找get_declared_classes()的結果。

下一個選項可以分析串本身([A-ZA-Z0-9]),但這不是非常可靠的,因爲很多的字符串匹配,但並不意味着是一個類名。

另一種選擇是,先「收集」所有的類名(基於T_CLASS令牌)和分析之後,基於類的收集列表中的所有字符串。因爲CodeSniffer在每個文件的基礎上工作,所以不容易實現恕我直言。

我能想到的最後一個選項也很髒;因爲我們總是在我們的項目中使用composer,所以我們可以使用composer的自動加載文件並嘗試匹配classmaps和命名空間。也不是很可靠和乾淨。

任何人有另一種意見認爲,我們沒有想到?

+0

對我來說很好,你有多遠?我可以幫助你,因爲這是在我的問題清單。 –

+0

對不起,目前爲止沒有進展。我還沒有調查,但我可以想像靜態代碼分析工具,如PHPStan已經能夠做到這一點。 – Arjan

+0

沒問題。隨時觀看或合作這個問題:https://github.com/Symplify/Symplify/issues/59 我可能會幫助你建立這個問題。PHPStan僅分析代碼,不會更改任何內容。 –

回答

2

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

最好是與EasyCodingStandard像這樣使用它:

# easy-coding-standard.neon 
checkers: 
    - Symplify\CodingStandard\Fixer\Php\ClassStringToClassConstantFixer 

安裝:

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

運行:

vendor/bin/ecs check src 

修復:

vendor/bin/ecs check src --fix 

享受並讓我知道它是如何爲你工作的。

如果任何麻煩來了,只是create an issue here。我很高興盡可能地改進這個工具。