Kodokon kodokon.com

名前空間、オートロード、そしてComposer

PSR-4の名前空間でコードを構造化し、クラスと依存関係の読み込みはComposerに任せましょう。

8 分 · 3 問

このレッスンを Kodokon で開く

名前空間は名前の衝突をなくします。二つのライブラリが、それぞれClientクラスを衝突なく定義できるのです。普遍的な慣習はこうです。ベンダーの接頭辞(AppAcme\Blog)、そのあとにフォルダーの木構造を映した下位の名前空間、という形です。useは完全修飾名を現在のファイルに取り込み、asはあいまいさがあるときにそれを別名にします。一ファイル=一クラス=一名前空間。この規律は見た目のこだわりではなく、オートロードそのものの条件なのです。

PHP
<?php

declare(strict_types=1);

namespace App\Service;

use App\Repository\UserRepository;
use Psr\Log\LoggerInterface as Logger;

final class UserService
{
    public function __construct(
        private UserRepository $users,
        private Logger $logger,
    ) {
    }
}
src/Service/UserService.phpというファイル:名前空間、インポート、エイリアス

オートロードは、クラスのファイルを必要に応じて読み込みます。手作業のrequireはもう要りません。PSR-4標準がその対応づけを定めます。名前空間の接頭辞がルートフォルダーに結びつけられ、下位の名前空間のそれぞれがサブフォルダーになります。こうしてApp\Service\UserServicesrc/Service/UserService.phpへと解決されます。その裏側では、すべてがspl_autoload_registerに支えられています。以下がその最小限の実装です。自分で書き直すことは決してなくても、理解しておく価値があります。

PHP
<?php

declare(strict_types=1);

spl_autoload_register(function (string $class): void {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';

    if (!str_starts_with($class, $prefix)) {
        return;
    }

    $relative = substr($class, strlen($prefix));
    $path = $baseDir
        . str_replace('\\', '/', $relative)
        . '.php';

    if (is_file($path)) {
        require $path;
    }
});

echo 'Autoloader registered';
手作りのPSR-4オートローダー:接頭辞、ルートフォルダー、パスへの変換

Composerはこのすべてを工業化します。composer.jsonがあなたの依存関係とPSR-4の対応づけを宣言し(典型的には"autoload": { "psr-4": { "App\\\\": "src/" } })、そのあとcomposer installがパッケージをvendor/にダウンロードして、アプリケーション全体でただ一つのrequireとなるvendor/autoload.phpを生成します。欠かせない区別があります。本番で必要なパッケージにはrequire、ツール類(テスト、静的解析)にはrequire-devを使い、後者は--no-devによってデプロイから除かれます。

BASH
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -o
ライフサイクル:初期化し、依存関係を加え、オートローダーを再生成する

理解度チェック

このレッスンの要点をしっかり覚えているか確認しましょう。

  1. PSR-4によれば、接頭辞App\src/を指すとき、クラスApp\Blog\PostRepositoryはどこにありますか?
    • src/App/Blog/PostRepository.php
    • src/Blog/PostRepository.php
    • src/blog/postrepository.php
  2. Composerが生成したオートロードの恩恵を受けるには、どのファイルを読み込むべきですか?
    • composer.json
    • vendor/autoload.php
    • ルートに作るautoload.php
  3. composer require --devは何のためのものですか?
    • 開発だけで使うパッケージをインストールする。--no-devでデプロイから除かれる
    • パッケージの不安定なバージョンをインストールする
    • パッケージをマシン全体にグローバルにインストールする