PHPのComposerを使ったオートロード(autoload)について
こんにちは、ありあけこういちです。
Composerはパッケージを管理する機能以外にautoloadという機能があり、require文を使用しなくてもファイル(クラス)を読み込むことができるため、その内容について調べました。
そもそもautoloadとは?
autoloadとは、名前空間を指定するだけで自動的にファイル(クラス)を自動で読み込む仕組みのことを指します。
メリットとしては、newしたいクラスが書かれたファイルを一々requireする必要性がなくなります。
composer.jsonの準備
composer.jsonファイルに以下の内容を作成します。
{
"autoload": {
"psr-4": {
"{名前空間名}": "{名前空間に設定したいフォルダー名}/"
}
}
}
{名前空間名}のバリューを{名前空間に設定したいフォルダー名}としています。
仮に名前空間名が「App\」で、ディレクトリ「src\」と対応させたいなら下記のように記載します。
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
Composerの設定を反映する。
上記の記述が終わったらComposerで設定を反映させます。
まだvendorディレクトリが作成されておらず、新規にインストールする場合は下記コマンドを流してください。
$ composer install
すでにvendorディレクトリが作成されていて、既存のcomposer.jsonファイルでオートロード部分だけ追記・修正した場合は下記コマンドを流してください。
$ composer dump-autoload
Generating autoload files
Generated autoload files
が出たら完了です。
なお、vender/composer/autoload_psr4.phpにて、今回composer.jsonにて指定した名前空間との紐付けが分かります。
return array(
...
'App\\' => array($baseDir . '/src'),
);
オートロード設定を基にファイルの呼び出しを行う
呼び出す側のファイルを作成し、vendor/autoload.phpのファイルのrequireを作成します。
<?php
require('vendor/autoload.php');
use App\Hoge;
...
ここでrequireのautoload.phpの行の記載がないまま実行すると、Fatal error: Uncaught Error: Class “App\Hoge” not found inエラーが表示されます。
php コマンドで問題なく実行できたら、以上でcomposerのオートロードに関して基本的な部分を完了です。
psr-0とpsr-4のルールについて
psr-0は名前空間と実在のディレクトリ構成を同じにする仕様であり、2014年10月21日からもう非推奨になっている(githubリンク)らしく、autoloadに関しては基本的にpsr-4を採用すれば問題ないと思います。
psr-4は名前空間が実在のディレクトリ構成に依存しない仕様です。
psr-4についてより詳しく知りたい方はこちらの記事もぜひご参照ください。