Composerを使ったPHPのオートロード(autoload)

composerを使ったPHPのオートロード

PHPプロジェクト内において、外部ファイルを使いたいときはrequire文で明示的に読み込む必要があります。

require __DIR__ . '/src/models/User.php';

ただし、毎回requireするのも手間ですので、必要に応じて自動で読み込んでくれるオートロードの仕組みをComposerを使って構築するのがおすすめ。

この記事では、Composerを使ってオートロードを設定する方法を丁寧にまとめました。

※Composerの概要や基本の使い方については以下の記事にまとめています。

目次

オートロードの設定

以下のようなディレクトリ構成であるとします。

project
  L index.php
  L src
     L models
         L User.php
     L classes
         L Sample.php

index.phpからsrc/models/User.phpsrc/classes/Sample.phpをオートロードしたいと思います。

まずプロジェクトの最上位のディレクトリ(index.phpがあるところ)にcomposer.jsonを作成してください。

composer.jsonのなかには以下のように記述します。

{
    "autoload": {
        "psr-4": {
            "models\\": "src/models",
            "classes\\": "src/classes"
        }
    }
}

PSR-4というルールに従ってオートロードを使用することにしています。

PSR-4のほかにPSR-0というルールもありますが、基本的にはPSR-4が採用されるため詳細については割愛しました。
詳しく知りたい方は下記URL参照。
https://qiita.com/inouet/items/0208237629496070bbd4

modelsclasssesという2つの「名前空間」(わからない方はプログラム上でのグループ分けとでもイメージしておけばOK)を作成し、実際のディレクトリと紐付けています。

もちろん、パッケージのインストールにすでにcomposer.jsonを使っている場合は次のように併記しても問題ありません。

{
    "require": {
        "vlucas/phpdotenv": "^5.4.1",
        "monolog/monolog": "^1.23.0"
    },
    "autoload": {
        "psr-4": {
            "models\\": "src/models",
            "classes\\": "src/classes"
        }
    }
}

記述が終わったらComposerで設定を反映させます。

まだvendorディレクトリが作成されておらず、新規にインストールする場合は下記コマンド。

$ composer install

すでにパッケージインストールなどで使用したためvendorディレクトリが作成されており、既存のcomposer.jsonファイルでオートロード部分だけを書き加えた場合はdumpautoloadしてください。

$ composer dumpautoload

これでオートロードを使用できるようになりました。

以後、composer.json内のオートロード設定を書き換えるたびにcomposer dumpautoloadをしないと設定が反映されないので注意。

オートロードをもとにファイルの呼び出しを行う

サンプルとして、src/models/User.phpは以下のようにしました。

<?php

namespace models;

class User
{
  public function getName()
  {
    return 'My Name Is Hoge.';
  }
}

オートロードが正しく動くためにはファイル名(User.php)とクラス名(User)を合わせる必要があるので注意してください。

3行目で、modelsの名前空間に属することを宣言しています。

上記のUser.phpindex.phpにて呼び出してみましょう。

<?php

require __DIR__ . '/vendor/autoload.php';

$user = new models\User();
echo $user->getName();  //「My Name Is Hoge.」と出力される

3行目のrequireのように、必ずComposerが用意したautoload.phpを読み込んでください。
これ1つを読み込んでおけば、他のファイルをrequireする必要はないです。

その上で、new models\User();として(「名前空間\クラス名」の形で)Userクラスのインスタンスを作成しました。
いきなりインスタンスを作っていますが、オートロードのおかげで読み込みエラーが発生することなく処理が実行されています。

参考までに、src/classes/Sample.phpも以下のように設定してみます。

<?php

namespace classes;

class Sample
{
  public function hello()
  {
    return 'Hello!';
  }
}

User.phpと同じように、namespaceにて名前空間classesに属するものだということを宣言するのを忘れずに。

これでindex.phpではrequireすることなく使えます。

<?php

require __DIR__ . '/vendor/autoload.php';

$user = new models\User();
echo $user->getName();

$sample = new classes\Sample();
echo $sample->hello();  //「Hello!」と出力される

オートロードの仕組みは以上です。

まとめ

外部のパッケージ(ライブラリ)の依存関係を解決してインストールできるようにするのがComposerの本来の役目ですが、自作クラスのオートロードにも使うことができます。

  1. composer.jsonで名前空間を指定
  2. composer dumpautoloadで設定を反映
  3. require不要でクラスを利用

の流れで、オートロードが活用できます。

実際にPHPにてWEBアプリケーションを作るときに役立つ方法なので、ぜひ導入してみてください。

composerを使ったPHPのオートロード

この記事が気に入ったら
いいね または フォローしてね!

SHARE
  • URLをコピーしました!

コメント

コメントする

目次