Laravel4、クラスのオートローディング

Tags : 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のオートローダーがローディングしてくれるからです。

これで便利さと、スピードが両立できます。オートローディングが遅いという声も無くなるでしょう。