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

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

require文って何?って人でも大丈夫です。本文書ではrequire文の使用方法の説明もあります。
fukidashi

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

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文は他のファイルに記述されたクラスを読み込むのに必要だということがわかりました。require文の使い方が理解できたのでComposerのインストールを行いComposerのオートロードを理解していきましょう。

Composerのインストール

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

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

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

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


php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { 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 2.6.6 2023-12-08 18:32:26

Usage:
  command [options] [arguments]

composer.jsonファイルの作成

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


{

}
composer.jsonファイルを作成するかわりにcomposer initコマンドで対話的にcomposer.jsonファイルを作成することも可能です。
fukidashi

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ファイルに使用したいパッケージの情報を記載してインストールを行います。
fukidashi

composer.jsonファイルの更新

次にcomposer.jsonファイルにオートロードに必要な情報を記載します。拡張子にjsonがついている通り、composer.jsonはjsonファイルです。中身をJSONを使って記述していきます。


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

JSONはキーと値のペアにより記述していきます。ここではキーTestという任意の名前に値srcを設定してペアを作成しています。キーのTestの名前の後にバックスラッシュ2つが必要となり、コロンの後の値には読み込みたいファイルを保存するディレクトリの名前をつけます。

通常は、会社名、プロダクトまたはパッケージ等の名前をつけますが本文書を読んでいる人には何のことかわからないと思うので任意の名前をつけてください。
fukidashi

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の情報が登録されています。もしTestの情報がない場合は設定が行われていないので再度composer.jsonの中身を確認するとcomposer.phar dump-autoloadコマンドを実行してください。


<?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の間には、”\”(バックスラッシュ)を入れます。通常パス設定に使用する”/”(スラッシュ)と混乱しないようにしてください。


<?php
require('vendor/autoload.php');

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

var_dump($user->get_user_name());
requireのautoload.phpの行を削除して実行するとFatal error: Uncaught Error: Class “Test\User” not found inエラーが表示されます。Test¥Userクラスがどこにあるか見つけることができないためです。
fukidashi

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


$ 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のオートロードってこれだけの情報で動作するんだと思って頂けたのではないでしょうか。ぜひ、今後はこの知識を活用して入門者から中級者へステップアップしてください。