内容
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
require_once __DIR__ . "/../vendor/autoload.php";
use Controllers\MyController;
$app = new MyController;
$app->run();
6. コントローラ作成
controllers/ にMyController.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 という名前空間の宣言が必要
namespace Models;
class MyModel
{
public function getHello()
{
return 'Hello !! You well done !!' . PHP_EOL;
}
}
また、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で簡単に設置できることがわかったので、早速試してみました。
導入としては非常にシンプルで、簡単な印象でした。