2018/10/12
Laravelではcomposerによるオートロードの仕組みを利用しています。
オートロードの仕組みを利用すれば vendor/autoload.php を require するだけでほかのファイルのrequireは不要になります。
今回はより深くLaravelを理解するためにPHPのオートロードについて学びます。
オートロード機能
PHPによるオートロード機能とはファイルを自動で読み込む仕組みのことです。
この機能を使うことでPHPファイルの冒頭に require を書きまくることはなくなりました。
オートロード機能を使用するには composer を使います。
composer を使用してライブラリをインストールするとvendor/autoload.phpというファイルが生成されます。
このファイルがオートロードの実体ファイルです。
このファイルを一度だけrequireすることで、vendor配下のライブラリをすべて自動的にロードしてくれます。
また、プロジェクトの直下にあるcomposer.jsonでオートロードするファイルを追加することもできます。
Laravelでオートロードの仕組みを確認
laravelのエントリーポイント(処理の起点)である /public/index.php の中身を見てみます。
1 2 3 | : require __DIR__. '../bootstrap/autoload.php' ; : |
次にrequireの参照元となっている bootstrap/autoload.php を開いてみます。
1 2 3 4 | : require __DIR__. '../vendor/autoload.php' ; : |
上記のソースを見るとvendorディレクトリのautoload.phpが読み込まれているのがわかります。
オートロードの仕組み
オートロードするファイルの追加はcomposer.jsonで設定します。
1 2 3 4 5 | "autoload" : { "psr-4" : { "foo\\" : "bar/" } }, |
(記述方式)"名前空間プレフィクス\\" : "対応するベースディレクトリ"
psr-4とはクラスをオートローディングするための仕様です。
上記の記述では物理ディレクトリbar配下をfooから始まる名前空間として設定しています。
barディレクトリのクラスにアクセスする場合は、名前空間(foo)を指定します。
1 2 3 4 5 6 7 | namespace foo; class Greeting(){ function hello(){ echo "Hello!" ; } } |
WEBルートでvendor/autoload.phpをrequireするだけでOKです。
1 2 3 4 | require_once "vendor/autoload.php" ; //オートロード $greeting = new foo\Greeting(); echo $greeting ->hello(); |
オートロードを理解するためのチュートリアル
オートロード機能を使ってindex.phpからgion.phpのクラスをコールします。
│ composer.json
│ index.php(実行対象ファイル)
│
└─ area
└─ japan
└─ kyoto
gion.php(呼び出し先のファイル)
シナリオ
【1】composer.jsonの作成
【2】オートロードファイルの作成
【3】gion.php(呼び出し先のファイル)の作成
【4】index.php(実行対象ファイル)の作成
【5】動作確認
【1】composer.jsonの作成
composer.jsonのファイルを作成してオートロードの設定をします。
composer.jsonは手動で作成することもできますし、composer initコマンドで作成することもできます。
areaディレクトリをappという名前空間に指定します。
1 2 3 4 5 6 7 | { "autoload" : { "psr-4" : { "app\\" : "area/" } } } |
【2】オートロードファイルの作成
composer.jsonファイルを作成したらcomposer dump-autoloadコマンドを実行します。
1 2 | cd xampp\htdocs\autoload composer dump-autoload |
このコマンドでcomposer.jsonで設定した情報を元にファイル群を生成します。
またvendorディレクトリが作成され、autoload.phpも出来上がります。
【3】gion.php(呼び出し先のファイル)の作成
先ほどcomposer.jsonで設定した名前空間をここで使います。
1 2 3 4 5 6 7 | namespace app\japan\kyoto; class Gion { function navi(){ echo "現在の八坂神社は明治以前は神仏習合であり祇園社(ぎおんしゃ)と称し、鴨川一帯までの広大な境内地を保有していたが、そのためこの界隈のことを祇園と称する。(wiki)" ; } } |
ファイル名(gion.php)とクラス名(class Gion)は合わせます。
【4】index.php(実行対象ファイル)の作成
オートロードのファイルをrequireで読み込みます。
名前空間を使ってGionクラスにアクセスします。
1 2 3 4 | require_once "vendor/autoload.php" ; $gion = new app\japan\kyoto\Gion(); echo $gion ->navi(); |
【5】動作確認
ブラウザでプレビューしてみます。
http://localhost/autoload/index.php
requireを使わずに外部ファイル(gion.php)のGionクラスのメソッドをコールすることができました。
オートロード成功です。
PHPのオートロードについては以上です。

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。