2019/08/29
PHPでは通常 require_once "sample.php"
のように使用したいファイルを明示的に読み込む必要があります。
これを自動的に読み込んでくれる仕組みがオートロードです。
Composer はパッケージを管理する機能以外にも、オートロードという機能もあわせ持ちます。
require文を使用しなくてもクラスファイルを読み込むことができます。
Laravel でも Composer によるオートロードの仕組みを利用しています。
laravel のエントリーポイント(処理の起点)である /public/index.php
にオートロードが記述されています。
# public/index.php
require __DIR__.'/../bootstrap/autoload.php';
requireの参照元となっている bootstrap/autoload.php
を開くとオートロードの記述が見つかります。
# bootstrap/autoload.php
equire __DIR__.'/../vendor/autoload.php';
今回はこのオートロードの仕組みを理解するために Laravel を使わず、素の PHP でオートロードの仕組みを作成してみます。
ディレクトリ構成
目的:sample01.phpからMessage.phpのクラスを使用します。
C:.
│ composer.json
│ sample01.php
│
└─app
└─Models
Message.php
手順
composer.jsonを作成
「composer.json」というファイルを新規作成し、以下のように中身を入れます。
{
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
解説
- PSR-4というルールに従ってオートロードを使用します。
- 物理ディレクトリ
app
配下をApp
から始まる名前空間として使用します。
Composerコマンドを実行
composer install
これでvendorディレクトリが作成され、autoload.phpもできます。
実行対象のファイル(Message.php)を作成
<?php
namespace App\Models;
class Message{
function hello(){
echo "Hello World!";
}
}
解説
ファイルが配置されているディレクトリと同様の構造の名前空間を指定します。
App
というディレクトリはありませんが、composer.json で appディレクトリ配下を App で指定する設定にしたためこうなります。
appディレクトリ配下のファイルはすべてディレクトリ構造と名前空間を合わせればオートロード対象となります。
ファイル名(Message.php)とクラス名(class Message)を合わせる必要があります。
呼び出し先のファイル(sample01.php)を作成
<?php
require_once "vendor\autoload.php";
$message = new App\Models\Message();
echo $message->hello();
解説
vendor/autoload.php
を require_once します。これだけでOKで、ほかのファイルの require は不要です。
クラスを使用するには、ディレクトリ構造と対になった名前空間を指定します。
App
というディレクトリはありませんが、composer.json で appディレクトリ配下を App で指定する設定にしたためこうなります。
動作確認
コマンドプロンプト/ターミナルで以下のコマンドを実行します。
php sample01.php
"Hello World!" と表示されればOKです。
以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。