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


■ 目次

  1. 概要
  2. PHP_CodeSnifferとは
  3. PHPMDとは
  4. 自動チェック手順
    1. リポジトリ作成
    2. composer.json作成
    3. サンプルプログラム作成
    4. phpmd,phpcsを試しに実行してみる
    5. pre-commit時に実行するようにする
    6. エラー時にcommitできないことを確認する

■ 概要

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

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

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


Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です