Composer Autoloader
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 13/91。
自分で autoloader を書くこともできますが、実際の PHP プロジェクトでは Composer を使用して autoloading を自動的に処理します。Composer はプロジェクトの設定を読み取り、PSR-4 標準に従う最適化された autoloader を生成します。
設定は、プロジェクトのルートにある composer.json ファイルに記述します。autoloading ルールの定義方法は次のとおりです。
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}これは、App\で始まる任意のclassをsrc/ディレクトリから読み込むようComposerに伝えます。これを設定すると、Composerはvendor/ディレクトリにautoloaderファイルを生成します。
Composer の autoloader を使用するには、エントリーファイルの先頭に次の 1 行を記述するだけです。
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
その1つの require ステートメントが、プロジェクト全体のすべての class の読み込みを処理します。必要に応じて複数の namespace マッピングを定義できます。
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}重要なポイント: Composer の autoloader は手動での file の include を不要にし、プロジェクト全体で一貫した class の読み込みを保証します。これは、現代のほぼすべての PHP アプリケーションやフレームワークで使用されている標準的なアプローチです。
チャレンジ
簡単Composer の autoloading アプローチを使用して、複数の file にわたって class を整理する小さなアプリケーションを構築しましょう。PSR-4 namespace と中央の autoloader を使って、実際の PHP プロジェクトがどのように code を構成するかをシミュレートします。
連携して動作する4つの file を作成します。
src/Models/Product.php:App\Modelsnamespace にProductclass を定義します。public $nameとpublic $priceの properties、両方の値を受け取って設定する constructor、そして"[name]: $[price]"を returns するgetInfo()method を持つ必要があります。src/Models/Customer.php:App\Modelsnamespace にCustomerclass を定義します。public $nameproperty、name を受け取って設定する constructor、そして"Welcome, [name]!"を returns するgreet()method を持つ必要があります。vendor/autoload.php: Composer の動作を模倣するspl_autoload_registerを使用して、シンプルな autoloader を作成します。App\namespace prefix をsrc/directory に対応付け、namespace separator を directory separator に変換し、正しい file を読み込むために.phpを追加する必要があります。index.php: これがエントリーポイントとなる file です。1行のrequireでvendor/autoload.phpから autoloader を読み込み、続いてusekeyword を使ってApp\Models\ProductとApp\Models\Customerの両方を import します。name"Laptop"、price999のProductと、name"Alice"のCustomerを create します。customer に対してgreet()を、product に対してgetInfo()を呼び出した result を Print します(それぞれ別の行に出力します)。
ここでの重要な concept は、index.php が autoloader を読み込むために必要とする require statement は1つだけで、その後は使用するすべての class が自動的に読み込まれるという点です。これは、現代の PHP framework と application が Composer と連携して動作する方法そのものです。
自分で試してみよう
<?php
// TODO: vendor/autoload.php からオートローダーを require する
// TODO: 'use' キーワードを使って App\Models\Product をインポートする
// TODO: 'use' キーワードを使って App\Models\Customer をインポートする
// TODO: 名前が "Laptop" で価格が 999 の Product を作成する
// TODO: 名前が "Alice" の Customer を作成する
// TODO: 顧客の greet() の結果を出力する
// TODO: 製品の getInfo() の結果を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ