PHP_CodeSnifferとPHPMDを使って自動的にコードを少しでも綺麗にする

Published: 2016年12月3日 by tomsato

概要

複数人で開発を行うと各々好き勝手にコードを書かれてしまって気がついたらコーディング規約が定まらない汚いソースコードになってしまうので便利ツールを使って少しでも改善していく。

PHPコードのチェックをPHP_CodeSnifferとPHPMDで行う

自動でチェックが走るようにGitのHooks機能機能を使ってcommit時に毎回確認するようにする

PHP_CodeSnifferとは

PHPコード規約のチェックを行うツール

phpcsコマンドでチェックを行えるが、phpcbfを使って自動で修正することもできる
以下のコーディング規約を対応している

$ phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz and Zend

独自のルールも設定できる

PHPMDとは

PHP Mess Detector

PHPコードの静的コード解析ツール

こちらもphpmdコマンドでチェックを行うことができて、出力形式はxml,text,htmlで出力ができる

どういう分析が行えるかはオプションで指定することができて以下のルールが存在する

種類 説明
codesize コードが大きすぎないかチェック
controversial 命名規則など議論の余地がある部分を検出するチェック
design 設計上の関連のチェック
naming 変数名など名前関連のチェック
unusedcode 使われていないコードのチェック
cleancode 綺麗なコードかチェック

CircleCIとは

詳しくは以下にまとめている

CircleCI入門の入門

GitHubにPHPコードをpushした際にCircleCIが自動でチェックするように設定することを目指す

自動チェック手順

リポジトリ作成

新しく以下のリポジトリを作成した
https://github.com/tomsato/php_check

composer.json作成

$ cat composer.json
{
    "require-dev": {
        "phpmd/phpmd": "*",
        "squizlabs/php_codesniffer": "2.*"
    },
    "scripts": {
        "test": [
            "composer install",
            "./vendor/bin/phpmd ./src/ text codesize,design,naming,unusedcode",
            "./vendor/bin/phpcs --standard=PSR2 --colors ./src/"
        ]
    }
}

サンプルプログラムの作成

$ cat src/TestClass.php
<?php

class TestClass
{
    public $var = 'Hello world !!';

    public function displayHello()
    {
        echo $this->var;
    }
}

phpmd,phpcsを試しに実行してみる

// composer install
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer

$ composer test
// エラーが出ないことを確認する

vendorディレクトリなど不要なものをGitHubに上げないように.gitignoreを作成する

$ cat .gitignore
vendor/
composer.lock
composer.phar

pre-commit時に実行するようにする

$ cat .git/hooks/pre-commit
#!/bin/sh

composer test

実行権限も付与させるのを忘れずに

$ chmod 755 .git/hooks/pre-commit

ここまで直したらGHEにプッシュする

エラー時にcommitできないことを確認する

試しにサンプルプログラムに書いたnamespaceを消してcommitしてみた

$ git commit
> composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
Generating autoload files
> ./vendor/bin/phpmd ./src/ text codesize,design,naming,unusedcode

> ./vendor/bin/phpcs --standard=PSR2 --colors ./src/

FILE: /home/tomsato/php_check/src/TestClass.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 3 | ERROR | Each class must be in a namespace of at least one level
   |       | (a top-level vendor name)
----------------------------------------------------------------------

Time: 24ms; Memory: 3.75Mb

Script ./vendor/bin/phpcs --standard=PSR2 --colors ./src/ handling the test event returned with error code 1

エラーが出たことを確認できる

コメントを書く

※ 個別に返信が必要な時のみご記入ください

※ Emailは公開されません

※ 承認されると名前・コメントが下記に表示されます

コメント一覧

最近の投稿

ビジュアルリグレッションテストについてまとめ、ネットで調べると数多くのライブラリがありどれがどんな立ち位置なのか全体像がわかりずらかったのでどんな種類があるのか入門の入門としてまとめます、またPlaywrightを使って実際に触ってみました

社内ツールなどの超小規模なAPIをGolangで実装する際にフレームワークを使うべきかを、実際にnet/httpを使った実装とフレームワークを使った実装を比較することでどれだけ優位性があるかを見ていきたいと思います。今回はフレームワークにはシンプルで使いやすそうなEchoを使うことにします。

vue-pdfを使ってNuxt.jsで作成しているアプリケーションに pdfスライドを表示させるサンプルを作成しました README.md通りに実装してもうまくいかないところがあったのでそのあたり含めてまとめます

Vue.js / Nuxt.jsにおけるログインの実装方法をまとめる Auth0やNuxt.jsのAuth Moduleとmiddlewareについて調べつつサンプルを作成することで理解を深める

コンポーネント設計について考える Atomic DesignやPresentational Component, Container Componentについてまとめつつ 自分だったらVue.js / Nuxt.jsでどういうコンポーネント設計にするかについてまとめます

カテゴリ一覧

タグ一覧