他 LL 出身者のための PHP 入門前夜


![ 2014-12-02 20.24.52.jpg](https://qiita-image-store.s3.amazonaws.com/0/29618/461a131a-95e3-7474-5be0-40261055b9fb.jpeg " 2014-12-02 20.24.52.jpg")


## 導入

仕事で PHP を書く機会が訪れたので書き残す.
できるだけ古い情報にはあたらず, 最近の PHP の情報を追ってみた.
他 LL 出身者のための, って題したけどとくに比較はしてない. あとはたのんだ.

## インストール

開発環境は Mac を前提としている.

PHP 5.5 を Homebrew でインストールする.
PHP は 6 の開発が頓挫したらしく, それに盛り込まれる機能が 5.3 で入ったため, 5.2 以前と 5.3 以降ではメジャーバージョンレベルの差が存在するらしい.

```bash
brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/homebrew-php
brew install php55
```

PATH を通す. `.bashrc` に以下を書き加える

```
export PATH="$(brew --prefix homebrew/php/php55)/bin:$PATH"
```

叩く

```bash
source ~/.bashrc
```

バージョンを確認する

```bash
$ php -v
PHP 5.5.19 (cli) (built: Dec  2 2014 17:51:03) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
```

[Homebrew/homebrew-php](https://github.com/Homebrew/homebrew-php#installation)

## ライブラリ管理

### PEAR (非推奨)

PHP のライブラリ管理ソフトの pear をアップデートしておく.

```
pear update-channels
pear upgrade -a PEAR
pear upgrade-all
```

ライブラリを探すのに, デフォルトでは `pear.php.net` が登録されている. この捜索範囲を広げるには `channel-discover` で配布サイトを登録するか, `auto_discover` の自動捜索を on にするか, の 2 通りある. セキュリティ上の理由で後者はデフォルトでは off となっている. 問題が出るまでデフォルトのままにし, 見つからない場合は信用された配布サイトを登録するのが良いだろう.

[PEAR 1.4.0 channels from the client side | Lot 49](http://greg.chiaraquartet.net/another-6/)

ここでは PHP のユニットテストにおけるデファクトスタンダードである, PHPUnit を導入する.

```bash
sudo pear channel-discover pear.phpunit.de
pear install pear.phpunit.de/PHPUnit
```

[sebastianbergmann/phpunit](https://github.com/sebastianbergmann/phpunit#installation)

として入れたら

```bash
$ phpunit
You have installed PHPUnit via PEAR. This installation method is no longer
supported and http://pear.phpunit.de/ will be shut down no later than
December, 31 2014.

Please read http://phpunit.de/manual/current/en/installation.html and
learn how to use PHPUnit from a PHAR or install it via Composer.
```

となったため, Pear を捨て Composer を使う (つらい).

### Composer

現在では PHP のライブラリ管理には Composer が幅広く活用されている.

- [Composerを活用したモダンな開発手法をPHPカンファレンス2013で発表してきた。 #phpcon2013 - Engine Yard Blog](http://www.engineyard.co.jp/blog/2013/using-composer-in-phpconference/)
- [PHP - composer 導入をまじめに考える - Qiita](http://qiita.com/notona/items/c5a087d8dd446d315e6e)

まずインストール (時間かかる)

```bash
curl -sS https://getcomposer.org/installer | php
php composer.phar install
```

[Composer](https://getcomposer.org/doc/00-intro.md#using-composer)

`composer.json` に以下を記述.
開発環境でしか使わないため, `require-dev` に指定.

```
{
    "require-dev": {
        "phpunit/phpunit": "3.7.*"
    }
}
```

もっかいインストール

```bash
php composer.phar install --dev
```

## Hello World

以下を作り, `test.php` という名前で保存する.

```php
<?php echo 'Hello World!'
```

まず記法として PHP は先頭に `<?php` を書き, 最終行に `?>` を書くもの, と思っている人も多いかもしれない (自分もそうだった). その常識？に反し, 後者の閉じ `?>` は必要ない. かえって以下のような問題が発生しうるので, 書かないという選択が賢明かもしれない.

[PHPの閉じタグは心の臓に悪いから使わないで - Unknown::Programming](http://d.hatena.ne.jp/fbis/20090716/1247714151)

叩く

```bash
$ php test.php 
Hello World!
```

## 規約

### 命名規則

- クラス名は StudlyCaps (UpperCamelCase)
- メソッド名は lowerCamelCase
- 定数は UPPER_SNAKE_CASE
- プロパティはプロダクトやフレームワークごとに定める

### コーディング規約

[PSR-2](http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html) を基本的に順守する.

- 名前空間を必ず使う
- インデントは半角スペース 4 つ


### 警告を出す

CodeSniffer を使う.

```
{
    "require-dev": {
        "phpunit/phpunit": "3.7.*",
        "squizlabs/php_codesniffer": "1.*"
    }
}
```

```bash
pear install PHP_CodeSniffer
```

ここで, 先ほどのファイルにあえて閉じタグをつける.

```php
<?php
echo 'Hello World!';
?>
```

この状態で `phpcs` (PHP CodeSniffer) を動かすと, 以下のようなエラーが出る.

```
$ phpcs --standard=Psr2 test.php 

FILE: /Users/Miyabi/test.php
--------------------------------------------------------------------------------
FOUND 1 ERROR(S) AFFECTING 1 LINE(S)
--------------------------------------------------------------------------------
 3 | ERROR | A closing tag is not permitted at the end of a PHP file
--------------------------------------------------------------------------------
```

修正すると, エラーは消える.

```bash
$ phpcs --standard=Psr2 test.php

```

- [新標準PSRに学ぶきれいなPHP](http://www.slideshare.net/yandod/psrphp)
- [PHPコーディング規約まとめ - Qiita](http://qiita.com/hshimo/items/04be1f432240c58300f4)

## クラス

FizzBuzz を作る. `FizzBuzz.php` で保存.

```php
<?php

class FizzBuzz
{
    public function say($n)
    {
        if ($this->isFizzBuzz($n)) return 'FizzBuzz';
        if ($this->isFizz($n))     return 'Fizz';
        if ($this->isBuzz($n))     return 'Buzz';
    }

    private function isFizz($n)
    {
        return $n % 3 == 0;
    }

    private function isBuzz($n)
    {
        return $n % 5 == 0;
    }

    private function isFizzBuzz($n)
    {
        return $n % 15 == 0;
    }

}
```

## テスト

上の FizzBuzz のテストを書く. ファイル名は `FizzBuzzTest.php` とする.

```php
<?php

require_once 'FizzBuzz.php';

class FizzBuzzTest extends PHPUnit_Framework_TestCase
{
    public function setUp()
    {
        $this->fizzbuzz = new FizzBuzz();
    }

    public function testSay()
    {
        $this->assertEquals('FizzBuzz', $this->fizzbuzz->say(15));
    }
}
```

テストを走らせる

```bash
$ vendor/bin/phpunit FizzBuzzTest.php 
PHPUnit 3.7.38 by Sebastian Bergmann.

.

Time: 106 ms, Memory: 2.25Mb

OK (1 test, 1 assertion)
```

- [PHPUnitの使い方まとめ - Qiita](http://qiita.com/t_ishida/items/1176b43b548a8c467a59)
- [PHPテスト環境の構築とテスト駆動開発の練習 - Qiita](http://qiita.com/d9magai@github/items/026380f99cd17306d23c)
- [PHP開発者のためのテストのすゝめ：PHPUnitでユニットテスト - ＠IT](http://www.atmarkit.co.jp/ait/articles/0911/12/news105.html)

## 感想戦

PHP を書くのは始めてだったのだけれど, わりと情報が多くて助かった. 最新の情報は Advent Calendar を追うのが良さそう.
なんかへんなことやってそうなので, コメントで指摘とかして頂けると大変うれしいです.

## References

- [PHP: Download Logos](http://php.net/download-logos.php)
- [PHP: The Right Way](http://ja.phptherightway.com/)
- [他言語プログラマーのためのモダンPHP入門のためのガイド - Qiita](http://qiita.com/nyarla/items/0fb80a7e934aeca8328f)
- [PHP 業界のニュース 2014年 - Qiita](http://qiita.com/mukaken/items/24946d8ebc70524b43f3)
- [PHP Advent Calendar 2013 - Qiita](http://qiita.com/advent-calendar/2013/php)
- [PHP Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/php)