PHPMDを使ってみた

PHPMD-2.1.3

概要

PHPの静的コード解析ツールPHPMDについて調べてみたので、そのまとめです。

インストール

installはcomposerを使います。 composer.jsonに下記を追記して、$ composer installでinstall完了です。

{
  "require": {
    "phpmd/phpmd": "*"
  }
}

コマンドの詳細

http://phpmd.org/documentation/index.html

$ vendor/bin/phpmd
Mandatory arguments:
1) A php source code filename or directory. Can be a comma-separated string
2) A report format
3) A ruleset filename or a comma-separated string of rulesetfilenames

Available formats: xml, text, html.
Available rulesets: cleancode, codesize, controversial, design, naming, unusedcode.

Optional arguments that may be put after the mandatory arguments:
--minimumpriority: rule priority threshold; rules with lower priority than this will not be used
--reportfile: send report output to a file; default to STDOUT
--suffixes: comma-separated string of valid source code filename extensions
--exclude: comma-separated string of patterns that are used to ignore directories
--strict: also report those nodes with a @SuppressWarnings annotation

ルールの詳細

ルールセットは、全てで6種類あります。

Ruleset 内容
cleancode きれいなコードかどうか
codesize コードの複雑さチェック
controversial 命名規則チェック
design 設計上の問題
naming 変数や関数の名称チェック
unusedcode 使われていない要素の検知

cleancode

BooleanArgumentFlag

PHPMD >= 1.4.0

priority : 1 関数の引数にbooleanのデフォルト値を設定しているものを検出する。

ElseExpression

PHPMD >= 1.4.0

priority : 1 if文でelseを使っているものを検出する。

StaticAccess

PHPMD >= 1.4.0

priority : 1 クラスの静的関数の呼び出しを検出する。

codesize

CyclomaticComplexity

PHPMD >= 0.1

priority : 3 ifやwhile, for, case labelの数が多いものを検出する。 デフォルトは10個以上。

NPathComplexity

PHPMD >= 0.1

priority : 3 Nパスの複雑数が高いものを検出する。 デフォルト値は200以上。

ExcessiveMethodLength

PHPMD >= 0.1

priority : 3 1関数内の行数が多いものを検出する。 デフォルトは100行以上。

ExcessiveClassLength

PHPMD >= 0.1

priority : 3 行数の多いクラスを検出する。 デフォルトは、1000行以上。

ExcessiveParameterList

PHPMD >= 0.1

priority : 3 関数のパラメータ数が多すぎるものを検出する。 デフォルトは10個より多い場合。

ExcessivePublicCount

PHPMD >= 0.1

priority : 3 1クラス内でのpublicの数が多すぎるものを検出する。 デフォルトは45個より多い場合。

TooManyFields

PHPMD >= 0.1

priority : 3 クラス内にプロパティの数が多すぎるものを検出する。 デフォルトは、10個より多い場合。

TooManyMethods

PHPMD >= 0.1

priority : 3 クラス内に関数数が多すぎるものを検出する。 デフォルト値は、10個より多い場合。

ExcessiveClassComplexity

PHPMD >= 0.2.5

priority : 3 クラスの複雑さを検出する。

controversial

Superglobals

PHPMD >= 0.2

priority : 1 スーパーグローバル変数の利用箇所を検出する。

CamelCaseClassName

PHPMD >= 0.2

priority : 1 キャメルケースではないクラス名を検出する。

CamelCasePropertyName

PHPMD >= 0.2

priority : 1 キャメルケースではないプロパティ名を検出する。

CamelCaseMethodName

PHPMD >= 0.2

priority : 1 キャメルケースではない関数名を検出する。

CamelCaseParameterName

PHPMD >= 0.2

priority : 1 キャメルケースではない関数のパラメータ変数名を検出する。

CamelCaseVariableName

PHPMD >= 1

priority : 0.2 キャメルケースではない変数名を検出する。

design

ExitExpression

PHPMD >= 0.2

priority : 1 exit()を使っている箇所を検出する。

EvalExpression

PHPMD >= 0.2

priority : 1 eval()を使っている箇所を検出する。

GotoStatement

PHPMD >= 1.1.0

priority : 1 gotoを使っている箇所を検出する。

NumberOfChildren

PHPMD >= 0.2

priority : 2 子クラスの数が多すぎるクラスを検出する。 デフォルトは、15個以上。

DepthOfInheritance

PHPMD >= 0.2

priority : 2 継承の階層が深すぎるものを検出する。 デフォルトは、6階層以上。

CouplingBetweenObjects

PHPMD >= 1.1.0

priority : 2 ひとつのオブジェクトで使っているクラスの種類が多すぎる場合を検出する。 デフォルトは、13種類以上。

naming

ShortVariable

PHPMD >= 0.2

短すぎる変数名を検出する。 デフォルトだと3文字未満。

LongVariable

PHPMD >= 0.2

priority : 3 長過ぎる変数名を検出する。 デフォルトだと20文字より多いとアウト。

ShortMethodName

PHPMD >= 0.2

priority : 3 短すぎる関数名を検出する。 デフォルトだと3文字未満。

ConstructorWithNameAsEnclosingClass

PHPMD >= 0.2

priority : 3 コンストラクタ_construct()ではなく、クラス名と同名にしているものを検出する。

ConstantNamingConventions

PHPMD >= 0.2

priority : 4 大文字じゃない定数を検出する。

BooleanGetMethodName

PHPMD >= 0.2

priority : 4 getXXX()という名称で返り値がbooleanの関数を検出する。 デフォルトだと、引数が設定されてる関数は対象外になる。 関数上のコメントで判断しているらしいので、コメントを忘れずに書かないと検出されない。boolでもNG。booleanと記述する必要があります。

    /**
     * @return boolean
     */

unusedcode

UnusedPrivateField

PHPMD >= 0.2

priority : 3 使われていないprivate変数を検出する。

UnusedLocalVariable

PHPMD >= 0.2

priority : 3 使われていないローカル変数を検出する。

UnusedPrivateMethod

PHPMD >= 0.2

priority : 3 使われていないprivte関数を検出する。

UnusedFormalParameter

PHPMD >= 0.2

priority : 3 使われていない関数の引数を検出する。

まとめ

使うに当たって、下記が問題になりそうです。

  • どのルールセットをチェックするんでしたっけ?
  • チェックするpriorityの最適値は?

unusedcodeのUnusedPrivateFieldが使いたいという場合は、XMLを記述する方式を使えば可能。