Help us understand the problem. What is going on with this article?

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

yotsak83
web application engineer, painter. php/javascript/scala
https://twitter.com/yews83
fancs
日本最大規模の広告配信プラットフォームを開発しているアドテクノロジーエンジニアチームです
https://www.fancs.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした