PHPのモダンな開発環境を紹介する

*やあPHP! 最近なんだかまともだなぁ*

PHP開発の上で実用的なツール群について、RubyやPythonほどには知名度がないので紹介したい。Windowsのことは知らないので、各自がんばってほしい。

筆者はもともとRubyの方から来たので、Rubyとの比較が多いのは留意されたい。

------

**この記事の内容と直接関連はしないが、併せて読まれたい**

* [PHPのin_arrayは罠が多いので注意喚起が必要 - Qiita](http://qiita.com/tadsan/items/2a4c3e6b0b74a408c038)

## 準備

Macだと[Homebrew](http://brew.sh/index_ja.html)があると依存ライブラリを集めるのが楽でべんり。

これは個人の趣味の話なのだけれど、自分でインストールする実行ファイルは`$HOME/local/bin`に置くのが好きだ。

```sh:.bash_profile
PATH=$HOME/local:$PATH
```
筆者はZ Shellユーザーなので https://github.com/zonuexe/dotfiles/blob/master/.zshenv#L1-L13 のようにしてる。

## [PHPBrew](http://phpbrew.github.io/phpbrew/)

Rubyでの[rbenv](https://github.com/sstephenson/rbenv)と[ruby-build](https://github.com/sstephenson/ruby-build)みたいな感じ。

PHPBrewをインストール/初期化したあとは `phpbrew known` で新しめのバージョンを調べて `phpbrew install 5.6.5 +default` のようにインストールすることになる。

` +default`のようにVariantsを指定することで、拡張ライブラリをインストールすることができる。これがないとライブラリがまったくない状態になるので、忘れないようにしておきたい。

インストール完了したら `phpbrew switch 5.6.5` でシェルから当該のバージョンのPHPを利用できるようになる。`php --version`などで確認するとよい。

PHPBrewを利用するメリットのひとつに、[PECL](http://pecl.php.net/)などのC拡張の導入が楽になることが挙げられる。

```sh
# わざわざphp.iniを手で編集しなくても有効化できる
$ pecl install mongo
$ phpbrew ext enable mongo

# peclコマンドのことは忘れて、最初から phpbrew ext install した方がいい
$ phpbrew ext install mongo
```

`phpbrew install`時にインストールしわすれたライブラリを追加でインストールするときも `phpbrew ext install` でインストールできる。

## [Composer](https://getcomposer.org/)

Rubyの`gem`コマンドと[Bundler](http://bundler.io/)に相当するものだ。rubygems.orgやPyPIに相当するのは[Packagist](https://packagist.org/)だ。

PHPのモダンなライブラリとかフレームワークと呼ばれてるものはだいたいComposer対応してるので、現在では避けて通ることができない。

[Getting Started](https://getcomposer.org/doc/00-intro.md)に従ってインストールしてほしい。どうやらWindowsでも動くようだ。

PHPのライブラリ管理リポジトリとしてPEARとかPear2とかPyrusの名前を記憶してる方も居るかもしれないが、残念ながら全て死に体だ。 *忘れてあげてくださいね。*

### 既存のプロジェクトにComposerを導入する

拙作の[zonuexe/http-accept-language](https://github.com/zonuexe/php-http-accept-language)をインストールしたいとする。HTTP Accept-Languageヘッダをパースできるべんりなやつだよ。

はじめに、プロジェクトのルートディレクトリに`vendor`があるかを確認してほしい。ここでは話の都合上、既存の`vendor`はないものとして進める。

```
composer require zonuexe/http-accept-language:"~0.4.1"
```

このコマンドを実行すると、`vendor`ディレクトリの下にComposer環境と`zonuexe/http-accept-language`ライブラリがインストールされる。

忘れないうちに、プロジェクトをGit管理してる場合は`.gitignore`に`/vendor`の行を追加しておこう。`/vendor/.gitkeep`ファイルを作っておいてもいいが、そこは好みの問題だ。

`vendor/autoload.php`といふファイルができてるはずなので、プロジェクトの実行ファイルやWebアプリケーションの起動ファイルのようなものから`include`/`require`する。ライブラリの場合は、テストの起動時に`vendor/autoload.php`が読み込まれるようにしておけば十分だろう。

残念なお知らせなのだが、「ライブラリとしてインストールしたプロジェクトから実行ファイルとして起動されるプログラム」の場合は、インストールの方法によって`autoload.php`の場所が一意に定まらないので一工夫が必要になる。 https://github.com/zonuexe/php-php-checker/blob/master/bin/phpchecker を見て、お察しください。

### Composerが導入されたプロジェクトをセットアップする

`autoload.php`はインストール時に生成されるため、プロジェクトの開発メンバーの環境やデプロイされる環境にも`composer.phar`があり、`composer.phar install`しなければ動作しない。

メンバー全員にComposerをインストールさせると管理が煩雑になるので、セットアップのラッパースクリプトのようなものを用意して、各自のプロジェクトディレクトリ以下に`composer.phar`を配置してもいいだろう。社内のクローズドなプロジェクトなら、いっそ`composer.phar`をリポジトリの管理下に配置しておくのも一手ではある。

### 業務でComposerを運用するには

[PHP - composer 導入をまじめに考える - Qiita](http://qiita.com/notona/items/c5a087d8dd446d315e6e)を読まないと話が始まらない。

## [PsySH](http://psysh.org/)

RubyのIRB(`irb`)みたいなやつ([REPL](http://d.hatena.ne.jp/keyword/REPL))。PHPにも一往は標準で `php -a` があるんだけど、かなり不便なのでこちらを入れた方が捗る。あと、デバッガーとして組み込むこともできる。

`php -a`は `var_dump(1 + 2);` のように明示的に書かないと画面に表示されない(うっかり`;`を忘れると動かない)。しかし、`psysh`は `1 + 2` と書くだけでいい。(`var_dump()`や`echo`をする必要がなく、行末の `;` を省略できる)

## TDD/BDD

乱暴にもこの記事では両者をまとめて紹介する。

[PHPUnit](https://phpunit.de/)は定番のxUnitテスティングフレームワークだ。筆者はこれなしにPHPを書こうといふ気にはならなかった。

[phpspec](http://www.phpspec.net/)はPHPUnitほどの知名度こそないが、注目を浴びつつある、かなり尖ったBDDフレームワークだ。

* [知らないうちにphpspecがすごいことになっていた件 - iakioの日記](http://iakio.hatenablog.com/entry/2014/03/07/013452)
* [phpspecの検索結果 - Qiita](http://qiita.com/search?q=phpspec&sort=created&utf8=%E2%9C%93)

## [ビルトインWebサーバー](http://php.net/manual/features.commandline.webserver.php)

これはPHP 5.4からの標準機能だ。コマンドラインで`php -S localhost:3939`を実行するとPHPが動くHTTPサーバーが起動する。開発環境を整備するためにローカルにApacheをインストールする、などといったことが不要になるので捗る。

*(宣伝)* 筆者が最近作った再発明車輪かんたんルーター[zonuexe/php-simple-routing](https://github.com/zonuexe/php-simple-routing)も動くよ!

## おまけ: [php-mode](https://github.com/ejmr/php-mode)

宗教戦争がしたいわけじゃないんだよ! でもEmacsを使ってるのに最新版のphp-modeを使ってないのはもったいないから紹介したいだけなんだよ!

最近も絶え間なく開発が続けられて痒いところに手が届くようになってるから、最初にインストールしてから更新してないよって人も最新版を使ってみてね。

## まとめ

ざっと書き上げてみたものの、実際のところモダンなPHPを書くには[PHP: The Right Way](http://ja.phptherightway.com/)を読むべきだ。

* RubyやPythonで一般的な開発ツールはPHPにもある
    * ビルド管理ツール ([PHPBrew](http://phpbrew.github.io/phpbrew/))
  * プロジェクトローカルなパッケージマネージャ ([Composer](https://getcomposer.org/))
  * インタラクティブシェル/REPL ([PsySH](http://psysh.org/))
  * ビルトインWebサーバー [`php -S`](http://php.net/manual/features.commandline.webserver.php)
* こんなライブラリないかな? と思ったら[Packagist](https://packagist.org/)を漁ってみる
* Emacsを使ってるひとは最新版の[php-mode](https://github.com/ejmr/php-mode)を入れると良い
* [PHP: The Right Way](http://ja.phptherightway.com/)を読もう

それでも仕事で使ってると、周囲からあれがつらいここがだめだと不満が噴出するのがPHPではある。

私からは以上です。

## 最後に

*サーチライトのつもりかい。*