Edited at

PHPMDの CouplingBetweenObjects でカウントされるのは "::" と "new" だけ

https://phpmd.org/rules/design.html#couplingbetweenobjects

このルールは依存するクラスが多すぎないかチェックしてくれるルールなんですが、このルールに引っかかったときにメンバーにもってたインスタンスを別クラスにまとめたりしても依存クラス数がへらなかったり、どうやって依存クラス数を算出してるかナゾでした。

静的解析なので実際に実行して依存状態をみてるわけじゃなく、結構単純な記述をみて依存を判定してるようです。


カウントその1. ::があったら依存してるクラスにカウント

CakePHP2だったら下記のようなコードよくつかいますよね。

$id = Hash::get($data, 'User.id');

これでHashクラスに依存で1カウント。

App::uses('Foo', 'Utility');

これもApp利用で1カウント。

あとクラス名を渡すために ::class をつかっても1カウント(これつかうときはDIコンテナとかでインスタンス取得することが多いと思うので間違いではないけど)

$userClass = $this->container->get(User::class);

クラス定数の参照も1カウント

if (Foo::DEFAULT_KEY) {

// なんかのコード
}


カウントその2. new してる

まぁ当たり前っちゃ当たり前ですがちゃんと依存クラスとしてカウントされます。

CakePHP2のコントローラで BadRequestException, InternalErrorException, ForbiddenException, NotFoundException あたりを使い分けて返してるとそれで4カウント^^;


カウントその3. 型宣言

タイプヒンティングもカウントされるようです。

private function foo(User $user){

// なんかのコード
}


カウントされないもの

逆にカウントされないのは、その他全部といってよさそう。下記コードなら実際には3つのクラスに依存してるけどカウントされるのは ClassRegistory分だけ。

$userModel = ClassRegistory::init('User');

$postModel = ClassRegistory::init('Post');
$userModel->find(...);
$postModel->find(...);

-> があったら何かしらのクラスに依存してると判定されるかと思ったんですが、これは全くカウントされてないようです。