カテゴリー別アーカイブ: PHP

composer.jsonに依存パッケージを記述する

composer.jsonに依存パッケージを記述するには,

$ composer require phpunit/phpunit

これで, composer.jsonに

"require": {
    "phpunit/phpunit": "4.8.6"
}

のように追記されます.

もっとも, PHPUnitのような依存パッケージは開発時のみに必要なので, –devオプションをつけてインストールします.

$ composer require --dev phpunit/phpunit

–devオプションをつけてインストールすると, composer.jsonに

"require-dev": {
    "phpunit/phpunit": "4.8.6"
}

のように追記されます.

PHP Composerインストール

ComposerはJavaScriptのnpmに相当するパッケージマネージャツールです.

今日はそのインストール方法を備忘録として残しておきます.

といっても, curlでダウンロードして, グローバルにインストールするだけです.

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

インストールが完了したことを確認.

$ composer --version
Composer version 1.0-dev (9e67bc761be98b45875855003eb8b2f23f4bf5a5) 2015-09-19 14:32:06

PHPUnit

PHPUnitを利用したPHPのユニットテストについて簡単にまとめておきます.

1. PHPUnitのインストール

$ wget https://phar.phpunit.de/phpunit.phar
$ chmod 755 phpunit.phar

これで ./phpunit.pharとして実行可能になりますが, PATHがとおっている場所に置いておいたほうがグローバルに利用可能なので, 以下のように移動します.

$ (sudo) mv phpunit.phar /usr/local/bin/phpunit
$ phpunit --version
PHPUnit 4.8.6 by Sebastian Bergmann and contributors.

以上のようにバージョンが表示されればインストールは完了です.

2. ユニットテストコード

以下のPHPのクラスのメソッドをテストするとします.

<?php 

final class Calculator {

    private function __construct() {
    }

    public static function add($a, $b) {
        return $a + $b;
    }

    public static function sub($a, $b) {
        return $a - $b;
    }
}

テスト用のクラスはPHPUnit_Framework_TestCaseを継承させ, 慣例として「テスト対象のクラス名 + Test」の命名にします.

また, テストスイート (テストメソッド) には, testXXXのように先頭にtestを付加する必要があります (そうでない場合は, @testアノテーションを記述する必要があります).

<?php

require_once('Calculator.php');

class CalculatorTest extends PHPUnit_Framework_TestCase {
     public function testAdd() {
         $expected = 3;
         $actual   = Calculator::add(1, 2);
         $this->assertSame($expected, $actual);
    }

    public function testSub() {
        $expected = 1;
        $actual   = Calculator::sub(2, 1);

        $this->assertSame($expected, $actual);
    }
}

以下のようにしてテストを実行します.

$ phpunit CalculatorTest.php
PHPUnit 4.8.6 by Sebastian Bergmann and contributors.

..

Time: 137 ms, Memory: 13.25Mb

OK (2 tests, 2 assertions)

アサーションメソッドやアノテーションに関してはこちらが参考になるかと思います.

PHP array_multisort

今日初めて目にした関数なので備忘録的に…

例えば, 以下の2つの関連づけられていると思われる配列を, priceの降順にarray_mulitsortすると…

<?php

$titles = ['Perfect Java', 'Perfect C#', 'Perfect JavaScript', 'Perfect PHP'];
$prices = [3456, 3888, 3200, 3600];

array_multisort($prices, SORT_DESC, SORT_NUMERIC, $titles);

var_dump($prices);  // [3888, 3600, 3456, 3200]
var_dump($titles);  // ['Perfect C#', 'Perfect PHP', 'Perfect Java', 'Perfect JavaScript']

$pricesのソートは当然として, それに関連づけたtitlesもソートされるという超便利な関数です.

さらに, これを関連づけた連想配列に対しても同じことが可能です.

<?php
$books = [
    ['title' => 'Perfect Java',           'price' => 3456],
    ['title' => 'Perfect C#',              'price' => 3888],
    ['title' => 'Perfect JavaScript', 'price' => 3200],
    ['title' => 'Perfect PHP',            'price' => 3600],
];

$prices = [3456, 3888, 3200, 3600];

array_multisort($prices, SORT_DESC, SORT_NUMERIC, $books);

var_dump($books);

以下のように, priceの降順に連想配列がソートされます.

array(4) {
  [0] =>
  array(2) {
    'title' =>
    string(10) "Perfect C#"
    'price' =>
    int(3888)
  }
  [1] =>
  array(2) {
    'title' =>
    string(11) "Perfect PHP"
    'price' =>
    int(3600)
  }
  [2] =>
  array(2) {
    'title' =>
    string(12) "Perfect Java"
    'price' =>
    int(3456)
  }
  [3] =>
  array(2) {
    'title' =>
    string(18) "Perfect JavaScript"
    'price' =>
    int(3200)
  }
}

array_multisort

PHP spl_autoload_register

久々のPHPネタ.

PHPでは, クライアントサイドJavaScriptと異なり, 必要なモジュールをrequire_onceなどで簡単に読み込むことができます.

しかしながら, モジュールが必要となるたびに読み込むのは少々めんどくさいです.

クラスファイル (クラスが定義されているファイル) の読み込みに限定されますが, 未定義のクラスが使われていると, あらかじめ登録されている規則にしたがって, 自動的にクラスファイルを読み込むという便利な機能を実現するのが, sql_autoload_register関数です.

使い方はこんな感じです.

1. クラスファイルを読み込むメソッドの実装 (loadClassメソッド)

まずは, このメソッドを実装する必要があります. このメソッドの引数には, 必要となったクラス名の文字列が自動的にわたされます.

そして, サンプルコードの実装では, 引数で渡されたクラス名のフィルが指定されたディレクトリ以下にあるかを探索し, 見つかればそのファイルを読み込みます.

2. spl_autoload_registerへの登録

あとは, spl_autoload_register関数を利用して, 未定義のクラスが見つかったら, このメソッドを実行してくださいね〜という指示をしておきます. 引数は配列で, サンプルコードではClassLoaderインスタンスのloadClassメソッドを実行するように定義しています.

ClassLoaderの使い方はこんな感じです.

 $classLoader = new ClassLoader([
     __DIR__ . '/controllers',
     __DIR__ . '/models',
     __DIR__ . '/utils'
]);

この例だと, 未定義のクラスが見つかれば, controllers, models, utils以下のディレクトリを探して〜ということを意味しています.