Laravel4、クラスのオートローディング
タグ: Laravel4
Composerの導入により複雑になったように見える、クラスローディングですが、個別に理解すれば難しくありません。
Composerのクラスローディング
2つあります。
- PSR-0準拠
- どんなものでも重複しなければOK(生成したクラスマップによるローディング)
これ以外にもファイル指定による読み込みもありますが、クラス名による読み込みではなく、リクエストのたび、毎回読み込むものです。
Laravelのクラスローディング
- 指定されたディレクトリーを名前空間のトップとして扱う、PSR-0風なローディング
予めクラスを検索するディレクトリーを配列で指定します。そのディレクトリーを名前空間のトップとして順番に探していく方法です。
例えば"Apple"クラス(トップの名前空間に位置づけられている)は、登録されているディレクトリー中でApple.phpが探されます。"Fruit\Apple"クラスは登録されているディレクトリー下のサブディレクトリー"Fruit"の中の、Apple.phpが探されます。"Sweets\Apple_Candy"クラスは、登録されているディレクトリーで、"Sweets/Apple/Candy.php"が探されます。
ComposerとLaravelのオートローディングの違い
Composerではコマンドでオートローディング対象マップファイルを生成し、実際のオートロードはそのマップファイルをもとに行います。ですから、新しいPSR-0準拠のベンダー/ディレクトリーを登録するか、PSR-0ではないクラスファイル/クラスファイルが含まれるディレクトリーを変更/追加した場合、コマンドでマップファイルを再生成します。(composer dump-autoload
)
この方法は利便性にかけますが、速度は早いです。
一方、Laravelのオートローディングは指定先の複数ディレクトリー下を探します。クラスのロード先として登録されているディレクトリーが多ければ多いほどオーバーヘッドがかかります。
この方法は便利ですが、速度は遅いです。
両者のオートローダーの関係
優先順位はComposer > Laravelです。つまり、Composerのオートローダーによるチェックが、Laravelより先に行われます。
規約的にはComposerの何でもOK方式 ⊃ LaravelのPSR-0風ローディング規約です。つまり、Laravelのローディング規約は完全にComposerの何でもOK規約に含まれます。
そのため、Laravelのコーディング規約として指定されているディレクトリーはComposerのクラスマップによるローディングの読み込み先としても指定されています。
これにより、スピードアップしたい時にはComposer dump-autoloadコマンドでマップファイルを作成することができます。また、クラスの追加やクラスのパス、クラス名の変更があっても、いちいちComposerのコマンドを実行する必要が無くなります。Laravelの規約に基づいて名前空間とクラス名から、対応するディレクトリーに保存しておけば、Laravelのオートローダーがローディングしてくれるからです。
これで便利さと、スピードが両立できます。オートローディングが遅いという声も無くなるでしょう。