Composer オートローダー
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 13/91。
独自のオートローダーを作成することも可能ですが、実際のPHPプロジェクトではComposerを使用してオートローディングを自動的に処理します。Composerはプロジェクトの設定を読み取り、PSR-4規格に準拠した最適化されたオートローダーを生成します。
設定はプロジェクトのルートにある composer.json ファイルに記述します。オートローディングルールの定義方法は以下の通りです:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}これは、App\ で始まるすべてのクラスが src/ ディレクトリからロードされるべきであることを Composer に伝えます。これを設定した後、Composer は vendor/ ディレクトリにオートローダーファイルを生成します。
Composerのオートローダーを使用するには、エントリファイルの先頭に1行追加するだけです。
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
その1つの require 文が、プロジェクト全体のすべてのクラス読み込みを処理します。必要に応じて、複数の名前空間マッピングを定義できます:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}重要なポイント: Composerのオートローダーは、手動でのファイル読み込みを不要にし、プロジェクト全体で一貫したクラスの読み込みを保証します。これは、事実上すべての現代的なPHPアプリケーションやフレームワークで使用されている標準的な手法です。
チャレンジ
簡単Composerのオートローディング手法を使用して、複数のファイルにまたがるクラスを整理する小さなアプリケーションを構築しましょう。PSR-4名前空間と中央オートローダーを使用して、実際のPHPプロジェクトがどのようにコードを構造化するかをシミュレートします。
連携して動作する4つのファイルを作成します:
src/Models/Product.php—App\Models名前空間内にProductクラスを定義します。このクラスには、public $nameとpublic $priceプロパティ、両方の値を受け取って設定するコンストラクタ、および"[name]: $[price]"を返すgetInfo()メソッドが必要です。src/Models/Customer.php—App\Models名前空間内にCustomerクラスを定義します。このクラスには、public $nameプロパティ、名前を受け取って設定するコンストラクタ、および"Welcome, [name]!"を返すgreet()メソッドが必要です。vendor/autoload.php— Composerの動作を模倣した、spl_autoload_registerを使用するシンプルなオートローダーを作成します。これはApp\名前空間プレフィックスをsrc/ディレクトリにマッピングし、名前空間の区切り文字をディレクトリの区切り文字に変換し、.phpを追加して正しいファイルをロードする必要があります。index.php— これはエントリポイントファイルです。vendor/autoload.phpからオートローダーを1行でrequireし、useキーワードを使用してApp\Models\ProductとApp\Models\Customerの両方をインポートします。名前が"Laptop"で価格が999のProductと、名前が"Alice"のCustomerを作成します。カスタマーのgreet()とプロダクトのgetInfo()を呼び出した結果を(それぞれ個別の行に)出力してください。
ここでの重要な概念は、index.phpがオートローダーをロードするために必要なrequireステートメントは1つだけであるということです。その後、すべてのクラスは使用時に自動的にロードされます。これは、現代のPHPフレームワークやアプリケーションがComposerを使用して動作するのとまったく同じ仕組みです。
チートシート
Composerは、composer.json設定ファイルを読み込み、PSR-4標準に従った最適化されたオートローダーを生成することで、クラスの読み込みを自動化します。
composer.jsonでオートロード規則を定義します:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}これはApp\名前空間をsrc/ディレクトリにマッピングします。Composerはvendor/ディレクトリにオートローダーファイルを生成します。
1つのrequire文でComposerのオートローダーを使用します:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
必要に応じて、複数の名前空間マッピングを定義します:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}Composerのオートローダーは手動でのファイル読み込みを不要にし、現代のPHPアプリケーションにおける標準的な手法となっています。
自分で試してみよう
<?php
// TODO: vendor/autoload.php からオートローダーを読み込む
// TODO: 'use' キーワードを使用して App\Models\Product をインポートする
// TODO: 'use' キーワードを使用して App\Models\Customer をインポートする
// TODO: 名前が "Laptop" で価格が 999 の Product を作成する
// TODO: 名前が "Alice" の Customer を作成する
// TODO: カスタマーの greet() の結果を表示する
// TODO: プロダクトの getInfo() の結果を表示する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。