- autoloadは「勝手に読み込まれる魔法」ではありません
- Composer autoloadの全体像
- PSR-4とautoloadの関係
- class not foundが起きる本当の理由
- Composer dump-autoloadの正体
- autoloadはどこまで面倒を見てくれるのか
- 注意点とリスク
- 結局どう理解して使うのがよいか
autoloadは「勝手に読み込まれる魔法」ではありません
Composerのautoloadは、PHP初心者から中級者に進む過程で「なんとなく使っているが、正直よく分かっていない」代表格の仕組みです。最初に結論から書くと、autoloadは魔法でもブラックボックスでもなく、Composerが生成したPHPコードを、PHPが普通に実行しているだけです。
use文を書いただけでクラスが使える、requireを書かなくていい、といった体験は確かに便利ですが、その裏では「どのクラス名が、どのファイルに対応しているか」を決め打ちした配列や関数が動いています。ここを理解していないと、クラスが見つからないエラーや、環境差分による不具合に直面したときに、対処が難しくなります。
この記事では、Composerのautoloadが何をしていて、実際にはどこまで面倒を見てくれているのか、そして「よくある誤解」と「現場でつまずきがちなポイント」を具体例つきで解説します。
Composer autoloadの全体像
Composerがやっていることは意外とシンプル
Composerのautoload機能は、ざっくり言えば次の2つを行っています。
- クラス名とファイルパスの対応表を作る
- その対応表を使って、クラスが使われた瞬間にファイルをrequireする
「自動で探してくれる」というイメージを持たれがちですが、実際には事前に決められたルールとマッピングに従って動いています。PHPがファイルシステムを総当たりで探しているわけではありません。
entry pointはvendor/autoload.php
Composerを使ったプロジェクトでは、ほぼ必ず次のような記述があります。
require __DIR__ . '/vendor/autoload.php';
この1行が、autoloadのすべての入口です。autoload.phpはComposerが生成したファイルで、中身を開くと「想像以上に普通のPHPコード」だと分かります。クロージャや配列、require_onceが並んでいるだけで、特別な言語機能は使っていません。
PSR-4とautoloadの関係
PSR-4は「命名規則」ではなく「対応ルール」
Composerのautoload設定でよく見かけるのがPSR-4です。多くの人が「名前空間の書き方ルール」だと思いがちですが、autoloadの文脈では少し違います。
PSR-4は「この名前空間で始まるクラスは、このディレクトリ以下に置く」という対応関係のルールです。例えば次のような設定です。
{ "autoload": { "psr-4": { "App\\": "src/" } } }
これは「App\\で始まるクラス名は、srcディレクトリ以下を探す」という宣言です。Composerはこの設定をもとに、クラス名とファイルパスの対応表を生成します。
実際にどう変換されるのか
例えば次のクラスを考えます。
namespace App\Service;
class UserService {}
この場合、Composerは「App\\Service\\UserService」という完全修飾クラス名を、「src/Service/UserService.php」に対応づけます。ここで重要なのは、ディレクトリ構成と名前空間がズレるとautoloadは失敗するという点です。
class not foundが起きる本当の理由
よくある勘違い
autoloadを使っていると、次のような誤解が生まれがちです。
- useを書けば勝手に見つかる
- ファイル名は多少ズレても大丈夫
- クラス名とファイル名は関係ない
これらはすべて誤りです。autoloadは「決められた対応表に載っているもの」しか読み込みません。
実際にやるとこうなる失敗例
例えば、ファイル名をUser_Service.phpにしてしまった場合、クラス名がUserServiceでもPSR-4のルール上は一致しません。結果として、useを書いてもclass not foundが発生します。
また、namespaceを書き忘れた場合も同様です。Composerは「グローバル名前空間のクラス」としては登録していないため、autoloadの対象外になります。
Composer dump-autoloadの正体
なぜ実行が必要なのか
autoload設定を変更したあとに、次のコマンドを実行するよう言われることがあります。
composer dump-autoload
これは「autoloadの対応表を再生成する」コマンドです。Composerは毎回設定ファイルを解析しているわけではなく、生成済みのPHPファイルを使っています。そのため、設定を変えたら再生成が必要になります。
--optimizeは何をしているか
-
- optimizeオプションを付けると、Composerはクラスの探索をより高速化するため、完全なクラスマップを作成します。本番環境では有効ですが、開発中は変更が反映されにくくなる点に注意が必要です。
autoloadはどこまで面倒を見てくれるのか
面倒を見てくれること
- クラス使用時にファイルをrequireする
- 名前空間とディレクトリの対応を管理する
- 外部ライブラリと自分のコードを同じ仕組みで扱う
面倒を見てくれないこと
- クラス設計の正しさ
- ファイル配置ミスの自動修正
- 命名規則違反の検出
autoloadはあくまで「読み込み係」です。設計や整理まで肩代わりしてくれるわけではありません。
注意点とリスク
autoloadを魔法だと思っていると、次のようなリスクがあります。
- 本番環境でだけclass not foundが出る
- キャッシュや最適化が原因で修正が反映されない
- フレームワーク依存の挙動と混同して混乱する
特にdump-autoload --optimizeを使っている場合、「コードを直したのに直らない」という状況に陥りやすいため注意が必要です。
結局どう理解して使うのがよいか
autoloadは「requireを書かなくていい便利機能」ではありますが、本質は「クラス名とファイルパスの対応を自動化しただけ」です。この前提を理解しておくと、トラブル時に落ち着いて原因を切り分けられます。
もしautoloadで迷ったら、「このクラス名は、どのファイルに対応しているはずか」を紙に書き出してみてください。Composerがやっていることは、その確認作業を機械的に高速化しているだけです。
魔法だと思わず、仕組みとして付き合う。それがComposerのautoloadと長くうまく付き合う一番の近道かもしれません。