5

クライアントの 1 つのコードベースで、文字列として修飾されたクラス名への参照が多数見られます。

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

使用する代わりに:

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

いくつかの理由から、PHP CodeSniffer ルールを追加してこれらの文字列をキャッチし、警告を追加して、文字列を ::class 定数にリファクタリングできるようにします。最初の部分 (文字列のキャッチ) は簡単ですが、静的コード分析を行っているため、(たとえば) class_exists を実行したり、get_declared_classes() の結果を検索したりすることはできません。

次のオプションは、文字列自体 ([A-Za-z0-9]) を分析することですが、多くの文字列が一致しますが、クラス名になることを意図していないため、これはあまり信頼できません。

もう 1 つのオプションは、最初にすべてのクラス名を (T_CLASS トークンに基づいて) 「収集」し、その後、収集したクラスのリストに基づいてすべての文字列を分析することです。CodeSniffer はファイル単位で動作するため、IMHO の実装は簡単ではありません。

私が考えることができる最後のオプションもかなり汚いです。プロジェクトでは常に composer を使用するため、composer の自動読み込みファイルを取得して、クラスマップと名前空間との照合を試みることができます。また、あまり信頼できず、きれいではありません。

私たちが考えていなかった別の提案がある人はいますか?!

4

1 に答える 1