Menu
Coddy logo textTech

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 アプリケーションやフレームワークで使用されている標準的なアプローチです。

challenge icon

チャレンジ

簡単

Composer の autoloading アプローチを使用して、複数の file にわたって class を整理する小さなアプリケーションを構築しましょう。PSR-4 namespace と中央の autoloader を使って、実際の PHP プロジェクトがどのように code を構成するかをシミュレートします。

連携して動作する4つの file を作成します。

  • src/Models/Product.php: App\Models namespace に Product class を定義します。public $namepublic $price の properties、両方の値を受け取って設定する constructor、そして "[name]: $[price]" を returns する getInfo() method を持つ必要があります。
  • src/Models/Customer.php: App\Models namespace に Customer class を定義します。public $name property、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行の requirevendor/autoload.php から autoloader を読み込み、続いて use keyword を使って App\Models\ProductApp\Models\Customer の両方を import します。name "Laptop"、price 999Product と、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() の結果を出力する
?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: PHPオンラインコンパイラ