目標: PHPプログラムでクラスの依存関係のDOT形式の記述を 生成することに興味があります。
アイデア: PHPソースで次のパターンを検出(およびDOTレコードを発行)できるCodeSniffer「スニフ」を作成するのは難しいことではありません。
class SomeClassName extends BasicClassName { // SomeClassName refers to BasicClassName
...
new OtherClassName(); // SomeClassName refers to OtherClassName
ThisClassName::some_method(); // SomeClassName refers to ThisClassName
ThatClassName::$some_member; // SomeClassName refers to ThatClassName
RandomClassName::some_constant; // SomeClassName refers to RandomClassName
...
}
しかし、この情報(および私が見逃した可能性のある「実際の」クラス依存関係を示す他のパターン)を出力する公開されたスニフは見つかりませんでした。
注: 私は特にPHPのinclude()およびrequire()ステートメントを気にしません(その動作が明確に定義されているとは確信していません)。この質問の目的のために、すべてのPHPクラス解決が自動ロードを介して処理され、静的コード分析のみを使用してクラス依存関係図を作成しようとしていると仮定しましょう。
編集: 残念ながら、私は以下に対処する一般的な方法を見ていません:
class ThatClassName {
...
function generateClassName() {
// something too complicated to analyze statically...
}
function foo() {
$name = $this->generateClassName();
$instance = new $name; // ThatClassName refers to ... what?
...
}
...
}
ただし、もちろん、generateClassName()メソッドに依存するThatClassNameを表示することで、依存関係グラフでこのシナリオを表すことは可能です。メソッド名をクラス名と簡単に区別できるようにするために、おそらく親で表示されます。また、クラス名を動的に生成するメソッドには、生成される可能性のあるすべてのクラス名を示すアノテーション(関連するコメント内)を含める必要があるという規則を確立することは、おそらく悪い考えではありません。これらの「文書化された動的依存関係」です。その後、依存関係グラフに自動的に含めることができます。