PHPの名前空間とcomposerのautoload (PSR-4) サンプル

# 内容
PHPの名前空間とcomposerを利用して、`require_once`を使わずに
ファイルをオートロードするサンプルを作ります。
サンプルとしては、MVCアプリケーションをイメージしており、
コントローラー、モデルを作成し、

クライアントからコントローラを呼び出し
↓
コントローラから複数のモデルを呼び出す

といった感じです。

# 環境
すでにPHP 5.5をインストール済みのLinux環境です。

# ディレクトリ構造
最終的にこんな感じになります。

```
[vagrant@localhost autoloader]$ php --version
PHP 5.5.25 

[vagrant@localhost autoloader]$ pwd
/var/www/autoloader #適当なプロジェクトディレクトリ

[vagrant@localhost autoloader]$ tree
.
├── composer.json
├── composer.phar
├── controllers
│   └── MyController.php
├── htdocs
│   └── index.php
├── models
│   ├── MyModel.php
│   └── sub
│       └── SubModel.php
└── vendor
    ├── autoload.php
    └── composer
        ├── ClassLoader.php
        ├── LICENSE
        ├── autoload_classmap.php
        ├── autoload_namespaces.php
        ├── autoload_psr4.php
        └── autoload_real.php

```
# 作業

## 1. ディレクトリを作成します。
```
$ mkdir controllers        #コントローラ
$ mkdir models             #モデル
$ mkdir models/sub         #サブモデル(個々のライブラリ等)
$ mkdir htdocs             #クライアント
```

## 2. composer のダウンロード
composerをダウンロードします。

```
$ curl -s https://getcomposer.org/installer | php
$ ls
composer.phar 
controllers
htdocs
models

```

## 3. composer.jsonの作成

composer.jsonにautoloadの設定を記述します。
PSR-4という最新のファイル配置規約を利用します。

```
vi composer.json

{
    "autoload": {
        "psr-4": {
            "Controllers\\" : "controllers/",
            "Models\\"      : "models/",
            "Models\\Sub\\" : "models/sub/"
        }
    }
}

```
記述方式は 、"名前空間プレフィクス\\\\" : "対応するベースディレクトリ" となります。

例えば、 `namespace Controllers` と宣言されたクラスは、controllers/の中にありますよ、と設定してあげている状態です。

## 4. オートロードファイルの生成

composer.jsonを記述し終えたら、その設定を元にオートロードのためのファイル群を生成します。

```
$  php composer.phar dump-autoload
Generating autoload files
```

これによって ./vendor というディレクトリの中に`autoload.php`とライブラリが生成されます。

## 5. フロントのクライアント作成
WEBルートであろうhtdocs/にindex.phpとして、以下を記述します。

```php:htdocs/index.php

<?php
require_once __DIR__ . "/../vendor/autoload.php";

use Controllers\MyController;

$app = new MyController;
$app->run();

```

## 6. コントローラ作成

controllers/ にMyController.phpとして、以下を作成します。

```php:controllers/MyContorller.php
<?php
# Controllers という名前空間の宣言が必要
namespace Controllers;

use Models\MyModel;
use Models\Sub\SubModel;

class MyController
{
    public function run()
    {
        #モデル1の呼び出し。
        #ここでは、getHello()で挨拶を返してくれる
        $myModel = new MyModel;
        echo $myModel->getHello();

        #モデル2の呼び出し。
        #ここでは、getSubHello()で、さらに別の挨拶を返してくれる
        $subModel = new SubModel;
        echo $subModel->getSubHello();
    }
}
```

## 7. モデルクラスの作成

models/にMyModel.phpとして、以下を作成します。

```php:models/MyModel.php
<?php
# Models という名前空間の宣言が必要
namespace Models;

class MyModel
{
    public function getHello()
    {
        return 'Hello !! You well done !!' . PHP_EOL;
    }
}
```

また、models/sub/にSubModel.phpとして、以下を作成します。

```php:models/sub/SubModel.php
<?php
# Models\Sub という名前空間の宣言が必要
namespace Models\Sub;

class SubModel
{
    public function getSubHello()
    {
        return 'Wow !! You got another Hello in subModel. Well done !!' . PHP_EOL;
    }
}
```

## 8. 試してみる

```
$ php ./htdocs/index.php
 
Hello !! You well done !!
Wow !! You got another Hello in subModel. Well done !!

```

このように、無事にオートローディングすることができました。

# まとめ

 `spl_autoload_register`を使って自前でオートロードをしたりしていたのですが、
Composerで簡単に設置できることがわかったので、早速試してみました。
導入としては非常にシンプルで、簡単な印象でした。

* ソース
https://github.com/yotasasaki/composer_autoload_sample

* 参考
https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md
http://abcdefg.0-0.onl/tech/2015-02-10/