156
148

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-07

内容

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で簡単に設置できることがわかったので、早速試してみました。
導入としては非常にシンプルで、簡単な印象でした。

156
148
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
156
148

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?