Composerはパッケージを管理する機能以外に、オートロードという機能もあわせ持ち、require文を使用しなくてもクラスファイルを読み込むことができます。

require文しか使ってこなかったPHPの初心者にとっては、Composer、オートロードという言葉に一瞬ためらうかもしれません。しかし、安心してください。本文書を読み終えたころには、Composerのオートロード機能がどういうものかきっと理解しているはずです。

本文書では、Composerのオートロード機能の基本を理解してもらうためにPHP入門者でも理解できる簡単なクラスを使ったプログラムを通して、Composerのインストールからオートロードの動作確認まで行います。

Userクラスを作成し、require文で読み込みんでみよう

まず、require文の使い方を復習しましょう。適当なディレクトリを作成(ここではsrcディレクトリ)し、そのディレクトリの中にUserクラス(User.php)を作成します。
Userクラスは、$nameという変数を持ち、get_user_nameメソッドで、nameを返すという非常にシンプルなものです。


<?php

class User{

    protected $name;

    public function __construct($name){

        $this->name = $name;

    }

    public function get_user_name(){

        return $this->name;

    }
}

?>

Userクラスをsrcディレクトリと同じ階層に作成したphpファイル(index.php)から呼び出して、var_dumpでnameをコンソールに出力させます。

まずは、require文でUser.phpを読み込んで実行させましょう。


<?php

require('src/User.php');

$user = new User('taro');

var_dump($user->get_user_name());

?>

index.phpを実行して、taroが出力されればUserクラスはrequire文を使って正常に読み込まれています。


$ ls
index.php  src
$ php index.php
string(4) "taro"

require文を削除してエラーを発生させます

require文がないとどうなるのか確認するためにrequire文を削除してみましょう。index.phpからrequire文を削除するとindex.phpからUser.phpファイルは見つけることができないのでnot foundエラーが発生します。


$ php index.php
PHP Fatal error:  Uncaught Error: Class 'User' not found

require文の使い方が理解できたら、Composerのインストールを行い、Composerのオートロードを理解していきましょう。

Composerのインストール

require文の代わりにComposerのオートロード機能を使用します。そのためにはComposerのインストールを行わなければなりません。

インストールは非常に簡単なので、Composerのサイトにアクセスして、ダウンロード方法を確認しましょう。アクセスすると下記のような画面が表示されるので、中ほど右にあるDownloadのリンクをクリックしてください。

composerのトップページ
ダウンロードの方法は変更されるので、最新版をインストールしたい場合は、Composerサイトに行って、毎回ダウンロード方法を確認して下さい。

srcディレクトリと同じ階層でダウンロードのページに記載されているコマンドを実行してください。2018/11/23時点でのインストール方法は下記となります。


php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 
'93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5
daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else 
{ echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

インストールが完了するとコマンドを実行したディレクト内にcomposer.pharファイルが作成されます。


$ ls
composer.phar  index.php  src

拡張子pharはphpのarchive(アーカイブ)を表しています。

インストールが正常に完了後、php composer.pharを実行してみてください。下記のようにコマンドの使用方法の情報が画面に出力されたら正常にインストールが完了しています。


$ php composer.phar
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.2.1 2016-09-12 11:27:19

Usage:
  command [options] [arguments]

composer.jsonファイルの作成

composerはautoloadの機能だけではなくパッケージ管理として使用されます。今回は、autoloadにスポットを当て、パッケージに関する部分については触れずに進むので、composer.jsonファイルを作成し以下のみを記載してください。


{

}

composer.jsonを作成した後、composerのinstallオプションを実行します


$ php composer.phar install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

installを実行した場所にvendorディレクトが作成されます。

ここではオートロード機能に絞っているため、パッケージ情報を記載していませんが、通常はcomposer.jsonファイルに使用したいパッケージの情報を記載してインストールを行います。

composer.jsonファイルの更新

次にcomposer.jsonファイルにオートロードに必要な情報を記載します。


{
    "autoload": {
        "psr-4": {
            "Test\\": "src"
        }

    }
}

ここでは、Testという名前とつけていますが、通常は、会社名、プロダクトまたはパッケージ等の名前をつけます。名前の後にバックスラッシュ2つが必要となり、コロンの後は、読み込みたいファイルを保存するディレクトリの名前をつけます。

Composerのオートロードでは、名前空間(namespace)という概念の理解が必要となります。

名前空間とは、フォルダやディレクトリのツリー構造と同一のものだと考えることができ、Testが名前空間のルートを表しています。名前空間Test(=srcディレクトリ)をルートとしてその下に クラスファイルを保存していきます。

Testの名前空間はsrcディレクトリに対応するので、srcディレクトリに保存されているUser.phpは、名前空間のルートであるTestを上部で宣言する必要があります。

つまり名前空間Test(=src)の中にUser.phpが配置されているということを表しています。


<?php

namespace Test;

class User{

    protected $name;

    public function __construct($name){

        $this->name = $name;

    }

    public function get_user_name(){

        return $this->name;

    }
}

?>

先程composer.jsonファイルにautoloadの情報を追加したので、dump-autoloadコマンドを実行して、反映させます。

composer.jsonを変更した後はdump-autoloadを実行します。


$ php composer.phar dump-autoload
Generating autoload files

dump-autoloadを実行するとvendor/composerフォルダの中にautoload_psr4.phpが作成され、中身を見ると先程登録したTestの情報が登録されています。


<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Test\\' => array($baseDir . '/src'),
);

Composerのオートロードを使用してプログラムを実行

オートロードの設定が完了したので、オートロードの機能を利用してプログラムを実行してみましょう。

Composerのオートロードを利用するためには、vendorディレクトリの中にあるautoload.phpを必ず読み込む必要があります。

しかし、autoload.phpを読み込んだだけでは、Userクラスの場所がわからないので、名前空間TestをUserクラスの前につけます。TestとUserの間には、”\”を入れます。通常パス設定に使用する”/”バックスラッシュと混乱しないようにしてください。


require('vendor/autoload.php');

$user = new Test\User('taro');

var_dump($user->get_user_name());

プログラムを実行するとプログラムは正常に動作し、先ほどと同じ値が表示されます。


$ php index.php
string(4) "taro"

Userクラスの前のTestを取りたい場合は、useを使用して、Userクラスの場所を指定すると同じ結果が出力されます。


<?

require('vendor/autoload.php');

use Test\User;

$user = new User('taro');

var_dump($user->get_user_name());

?>


$ php index.php
string(4) "taro"

以上でcomposerのオートロードに関して基本的な部分を終了です。特に難しい点はなく、Composerのオートロードってこれだけの情報で動作するんだと思って頂けたのではないでしょうか。ぜひ、今後はこの知識を活用して入門者から上級者へステップアップしてください。