私のクライアントのコードベースでは、修飾されたクラス名への参照が文字列として多く見られます。代わりに使用したのPHP Codesnifferカスタムルール:文字列の代わりにconstant :: class
[
'foobar' => 'My\Namespace\Class'
]
:私たちは、これらの文字列をキャッチするためにPHP CodeSnifferルールを追加し、文字列が::クラスにリファクタリングすることができるように警告を追加したい理由のカップルのための
[
'foobar' => My\Namespace\Class::class
]
定数。 最初の部分(文字列をキャッチする)は簡単ですが、静的なコード解析を行っているため、(たとえば)class_existsやget_declared_classes()の結果を参照することはできません。
次のオプションは文字列自体([A-Za-z0-9])を解析することができますが、多くの文字列が一致しますがクラス名ではないため、これはあまり信頼できません。
もう1つの方法は、(T_CLASSトークンに基づいて)すべてのクラス名を最初に '収集'し、収集されたクラスのリストに基づいてそれ以降のすべての文字列を分析することです。 CodeSnifferはファイル単位で動作するため、IMHOの実装はあまり簡単ではありません。
私が考えることができる最後のオプションもかなり汚れています。私たちはいつもプロジェクトでコンポーザーを使用しているので、コンポーザーのオートローディングファイルを取り、クラスマップと名前空間との照合を試みることができます。また、非常に信頼性が高く清潔ではありません。
私たちは考えなかった提案がありますか?
あなたはどこまで来ましたか?これは私の問題リストにあるので、私はあなたにそれを手伝うことができます。 –
申し訳ありませんが、これまでの進捗状況はありません。私はまだ調査していませんが、私はPHPStanのような静的コード解析ツールがすでにこれを行うことができると想像することができます。 – Arjan
問題ありません。この問題については、どうぞお気軽にご相談ください:https://github.com/Symplify/Symplify/issues/59 私はあなたのことを助けるかもしれません。 PHPStanはコードを分析するだけで、何も変更しません。 –