PHPのコード規約チェックをしてみる CodeSniffer

品質向上のため、phpの書き方をきちんと管理しようとおもい
コード規約に違反してないか調べてくれるPHP_CodeSnifferを入れてみます

開発環境のためComposerでglobalに入れました

Composerのインストールはこちらを参考に
UbuntuでPHPUnitをComposerでインストールしてみる

# composer global require ‘squizlabs/php_codesniffer:*’
# phpcs –version
PHP_CodeSniffer version 1.5.4 (stable) by Squiz (http://www.squiz.net)

入りました

チェックできるコーディング規約を確認します
# phpcs -i
The installed coding standards are Squiz, PSR1, PEAR, PSR2, MySource, PHPCS and Zend

ためしにPSR1とPSR2で、PHPファイルだけをチェックしてみます
# phpcs –standard=PSR1,PSR2 –extensions=php FizzBuzz.php
FILE: /home/user/repos/fizzbuzz.php/FizzBuzz.php
——————————————————————————–
FOUND 9 ERROR(S) AFFECTING 7 LINE(S)
——————————————————————————–
8 | ERROR | Visibility must be declared on method “__construct”
16 | ERROR | Expected “for (…) {\n”; found “for(…) {\n”
22 | ERROR | Visibility must be declared on method “evaluate”
22 | ERROR | Opening brace should be on a new line
23 | ERROR | Inline control structures are not allowed
24 | ERROR | Inline control structures are not allowed
25 | ERROR | Inline control structures are not allowed
29 | ERROR | Visibility must be declared on method “echoFizzBuzz”
29 | ERROR | Opening brace should be on a new line
——————————————————————————–

phpファイル修正前


<?php
class FizzBuzz
{
    private $_start;
    private $_end;

    function __construct($start, $end)
    {   
        $this->_start = $start;
        $this->_end = $end;
    }   

    public function publish()
    {   
        for($i = $this->_start; $i < $this->_end + 1; $i++) {
            $str = $this->evaluate($i);
            $this->echoFizzBuzz($str);
        }   
    }   

    function evaluate($num) {
        if ($num % 15 == 0) return 'FizzBuzz';   
        if ($num % 3 == 0) return 'Fizz';
        if ($num % 5 == 0) return 'Buzz';
        return $num;
    }   

    function echoFizzBuzz($str) {
        echo $str, PHP_EOL;
    }   
}

 
修正します

  • functionにアクセス権をつける
  • forと(の間に半角スペースをいれる
  • {は新しい行から始める
  • インラインの書き方はやめる

<?php

class FizzBuzz
{
    private $_start;
    private $_end;

    public function __construct($start, $end)
    {
        $this->_start = $start;
        $this->_end = $end;
    }

    public function publish()
    {
        for ($i = $this->_start; $i < $this->_end + 1; $i++) {
            $str = $this->evaluate($i);
            $this->echoFizzBuzz($str);
        }
    }

    private function evaluate($num)
    {
        if ($num % 15 == 0) {
            return 'FizzBuzz';
        }
        if ($num % 3 == 0) {
            return 'Fizz';
        }
        if ($num % 5 == 0) {
            return 'Buzz';
        }
        return $num;
    }

    private function echoFizzBuzz($str)
    {
        echo $str, PHP_EOL;
    }
}

これで直りました

UbuntuでPHPUnitをComposerでインストールしてみる

Ubuntu 12.04でComposerでPHPUnitを入れてみました
システム全体で使えるようにしています

まずComposerをインストール

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

入ったことを確認
composer

PHPUnitを入れます
# composer global require ‘phpunit/phpunit:*’

パスを通してどこでも実行できるようにします
# echo ‘export PATH=$HOME/.composer/vendor/bin:$PATH’ >> ~/.profile

パスをすぐに効くようにします
# source ~/.profile

確認
phpunit

試しに
PHPUnit マニュアル
第2章 PHPUnit 用のテストの書き方 2.1: PHPUnit での配列操作のテスト

にあるテストをStackTest.phpとして保存して


<?php
// 引用: http://phpunit.de/manual/4.1/ja/writing-tests-for-phpunit.html
class StackTest extends PHPUnit_Framework_TestCase
{
    public function testPushAndPop()
    {
        $stack = array();
        $this->assertEquals(0, count($stack));

        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));

        $this->assertEquals('foo', array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
}

テスト実行してみます
phpunit StackTest

できました

Google連絡先をガラケー用にphpで変換して取り込む

(((((コードと手順がやっつけすぎますが、公開しておきます)))))

Nexus5を買ったので、auのスマフォを昔使っていたガラケーに変えました

Google連絡先を、vcf形式でエクスポートすれば
そのまま取り込めるのですが読み仮名がつかず、すべて英語のところへまとめられるので
読み仮名も取れるようにしてみました

phpを使っているのでphpの実行できる環境が必要、
ガラケーはauのiida G9を使っています
※違う携帯だと異なるかもしれません

まず、Google連絡先をエクスポートします
Gmailにアクセス、赤枠のところをクリックし、連絡先を選びます
google-address1

その他>エクスポートをクリックします
google-address2

出力したい連絡先を選び、Google CSV形式でエクスポートします
google-address3

ダウンロードしたgoogle.csvのYomi Nameを読み仮名として使います
Yomi Nameに読み仮名が入ってない、もしくは、半角カナでないと効きません

下記、phpコードをconvert.phpなどのファイルに保存し


<?php

$fp = fopen('./google.csv', 'r');
if ($fp === false) {
    echo 'cannot open google.csv';
    exit;
}

$row = 0;
while (($data = fgetcsv($fp, 100000, ',')) !== false) {
    $row++;
    // skip first header
    if ($row == 1) continue;

    echo "BEGIN:VCARD", PHP_EOL;
    echo "VERSION:3.0", PHP_EOL;
    echo "FN:$data[0]", PHP_EOL;
    echo "N:$data[0]", PHP_EOL;
    echo "SORT-STRING:$data[4]", PHP_EOL;
    echo "TEL;TYPE=PREF:$data[34]", PHP_EOL;
    echo "TEL:$data[36]", PHP_EOL;
    echo "EMAIL;TYPE=PREF:$data[28]", PHP_EOL;
    echo "EMAIL:$data[30]", PHP_EOL;
    echo "EMAIL:$data[32]", PHP_EOL;
    echo "END:VCARD", PHP_EOL;
}
fclose($fp);
exit;

phpファイルと同じ所にgoogle.csvを設置してphp実行
# php -f convert.php > google.vcf

google.vcfをサクラエディタなどで開いて文字コードをsjisに変更し
ガラケーへ送付、アドレス帳に登録します

変換してくれるソフトやサービスがほしいところです
vcfに足りないものやcsvの取り込むものが違えば、phpを修正してください

[php]数値0と文字の比較

phpで少しはまったのでメモ

<環境>
php 5.3.17

文字と数値比較時、普通は下記の通り数値と文字の比較は false になるが


$nodata = '--';
$value = 1.0;

var_dump($value == $nodata);
var_dump($value === $nodata);
// -----
// bool(false)
// bool(false)

0 と文字の比較は、型まで見ないと false にならない


$nodata = '--';
$value = 0.0;

var_dump($value == $nodata);
var_dump($value === $nodata);
// -----
// bool(true)
// bool(false)

忘れてた..