1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPの静的コード解析ツールPHPMDの使い方

Last updated at Posted at 2024-01-25

まずは本家ドキュメント

ルールの内容

ルールセットの作り方

英語だけど翻訳機能を使えば割りと良い感じで読める。

大枠の構成と方針

  • ルールセットがあって、それらに単品のチェックルールが入っている構成
  • ルールセットも、xmlで定義されている
  • ルールのパラメータ上書きもできる(メソッド名は最低3文字など)
  • ルールセットの複数指定もできる

今回は、ルールセットを指定して、セットの中の都合の悪いものだけ、無効化する方針とした。

install

composer require --dev "phpmd/phpmd=@stable"

help見る

./vendor/bin/phpmd --help

使えるrulesetとか、出力フォーマットの種類とか、cacheオプションなど色々書いてある

単品ファイルなど、手動でフルチェックしたい場合(controversialは議論のあるルールセットなので外すのも良いかと)

./vendor/bin/phpmd hoge.php text cleancode,codesize,controversial,design,naming,unusedcode

ファイル数が多く実行時間が長い場合、キャッシュしよう

./vendor/bin/phpmd --cache hoge.php text unusedcode

キャッシュファイルが出来上がるので、git使っている場合はignoreに入れておくと良い。

また、デフォルトでは、ファイルのhash値をキャッシュに保存しておき、変更を検知する仕組みとなる。
(更新日付で管理することも可能らしいが、問題なければデフォルトで良さそう)

標準出力も受け取れるので、生成コードのチェックなども出来る

cat hoge.php | ./vendor/bin/phpmd - text unusedcode

gitの差分ファイルをphpmdでチェックする場合

git diff --name-only | fgrep '.php' | xargs -I {} ./vendor/bin/phpmd {} text unusedcode

自作のconfigファイルを使う場合

./vendor/bin/phpmd tests text phpmd_config.xml

自作xmlサンプル(途中からプロジェクトに入れる流れの中で作成した)

<?xml version="1.0"?>
<ruleset name="My first PHPMD rule set"
         xmlns="http://pmd.sf.net/ruleset/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
                     http://pmd.sf.net/ruleset_xml_schema.xsd"
         xsi:noNamespaceSchemaLocation="
                     http://pmd.sf.net/ruleset_xml_schema.xsd">
    <description>
        My custom rule set that checks my code...
    </description>

    <!-- @see https://phpmd.org/documentation/creating-a-ruleset.html -->
    <!-- @see https://phpmd.org/rules/index.html -->

    <rule ref="rulesets/cleancode.xml">
        <exclude name="StaticAccess" />
        <exclude name="ElseExpression" />
        <exclude name="BooleanArgumentFlag" />
    </rule>
    
    <rule ref="rulesets/codesize.xml">
        <exclude name="ExcessiveClassLength" />
        <exclude name="ExcessiveMethodLength" />
        <exclude name="ExcessivePublicCount" />
        <exclude name="TooManyFields" />
        <exclude name="TooManyMethods" />
        <exclude name="TooManyPublicMethods" />
    </rule>
    
    <rule ref="rulesets/design.xml">
        <exclude name="NumberOfChildren" />
        <exclude name="CouplingBetweenObjects" />
    </rule>
    
    <rule ref="rulesets/naming.xml">
        <exclude name="LongVariable" />
        <exclude name="LongClassName" />
        <exclude name="ShortMethodName" />
        <exclude name="ShortVariable" />
        <exclude name="BooleanGetMethodName" />
    </rule>

    <rule ref="rulesets/unusedcode.xml" />

</ruleset>

vscodeにも入れよう

PHP Mess Detector プラグインを使用した。
使えそうなプラグインが2個あったが、上記で動いたため、もう片方は検証してない。

設定は、下記2項目を設定するだけで動いた。

Phpmd: Command
~/path/to/vendor/bin/phpmd

Phpmd: Rules
~/path/to/phpmd_config.xml

ドキュメントには、 ${workspaceFolder} が使えると書いてあった。

だが、自分のワークスペースの使い方が独特なのが原因か?、機能しなかったので、フルパスを設定した。

最後に

目視では抜けるものがあったりするので、linterとformatterと自動テストは、最初から入れておきたいと改めて思った。

また、変数名やメソッドのサイズなど細かいルールがあるが、あまり細かくやっても制約になるので、ほどほどの設定が良いと思う。
(コードが読みやすいことと、おかしな点を見つけられることが大事。)

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?