5

目標: 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を表示することで、依存関係グラフでこのシナリオを表すことは可能です。メソッド名をクラス名と簡単に区別できるようにするために、おそらく親で表示されます。また、クラス名を動的に生成するメソッドには、生成される可能性のあるすべてのクラス名を示すアノテーション(関連するコメント内)を含める必要があるという規則を確立することは、おそらく悪い考えではありません。これらの「文書化された動的依存関係」です。その後、依存関係グラフに自動的に含めることができます。

4

2 に答える 2

2

これは、実際には PHP_CodeSniffer が行うように設計されたものではありません。具体的には、スニフがデータを出力したり、ファイルに書き込んだりすることは想定されていないためです。しかし、スニフ内でこれを行うことを妨げるものは何もありません。結局のところ、これは単なる PHP コードであり、エラーや警告を報告する必要はありません。

あなたが説明したようなことをしているスニフに出会ったことがないので、新しいものを書く必要があると思います.

新しいスニフを作成する場合は、抽象スコープ スニフから始めることをお勧めします。これにより、T_CLASS トークン内の T_NEW および T_DOUBLE_COLON トークンを探すことができます。ここに例があります。

または、クラス外のグローバル関数やその他のコードも調べたい場合は、通常のスニフ内で T_NEW および T_DOUBLE_COLON トークンを探すだけです。

始め方がわからない場合や、スニフの作成を手伝ってほしいだけの場合は、私に連絡してください。これを書くのを手伝うことができます。見つかったケースごとにどのような出力が必要かを知る必要があるだけです。または、基本的なものを使用することもできます。手が必要な場合は、私の電子メールは次のとおりです。gsherwood at squiz dot net

于 2012-11-12T04:14:57.717 に答える
2

このためのツールを作成しました: PhpDependencyAnalysis.

これは、名前空間に基づくオブジェクト指向の PHP プロジェクト (>= 5.3.3) 向けの拡張可能な静的コード分析です。パッケージ レベルやクラス レベルなど、カスタマイズ可能なレベルで依存関係グラフを作成します。したがって、一般的に依存関係を宣言するために使用できますが、懸念の分離、デメテルの法則、および非循環依存関係の原則に従って、階層型アーキテクチャ内のレイヤー間の違反の検出を実行するためにも使用できます。出力形式を DOT に変更することもできます。

GitHub で PhpDependencyAnalysis を確認してください。

于 2014-10-26T23:21:33.900 に答える