Edited at

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

More than 3 years have passed since last update.


内容

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として、以下を記述します。


htdocs/index.php


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

use Controllers\MyController;

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



6. コントローラ作成

controllers/ にMyController.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として、以下を作成します。


models/MyModel.php

<?php

# Models という名前空間の宣言が必要
namespace Models;

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


また、models/sub/にSubModel.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で簡単に設置できることがわかったので、早速試してみました。

導入としては非常にシンプルで、簡単な印象でした。