PSR-4の名前空間でコードを構造化し、クラスと依存関係の読み込みはComposerに任せましょう。
このレッスンを Kodokon で開く名前空間は名前の衝突をなくします。二つのライブラリが、それぞれClientクラスを衝突なく定義できるのです。普遍的な慣習はこうです。ベンダーの接頭辞(App、Acme\Blog)、そのあとにフォルダーの木構造を映した下位の名前空間、という形です。useは完全修飾名を現在のファイルに取り込み、asはあいまいさがあるときにそれを別名にします。一ファイル=一クラス=一名前空間。この規律は見た目のこだわりではなく、オートロードそのものの条件なのです。
<?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,
) {
}
}オートロードは、クラスのファイルを必要に応じて読み込みます。手作業のrequireはもう要りません。PSR-4標準がその対応づけを定めます。名前空間の接頭辞がルートフォルダーに結びつけられ、下位の名前空間のそれぞれがサブフォルダーになります。こうしてApp\Service\UserServiceはsrc/Service/UserService.phpへと解決されます。その裏側では、すべてがspl_autoload_registerに支えられています。以下がその最小限の実装です。自分で書き直すことは決してなくても、理解しておく価値があります。
<?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';Composerはこのすべてを工業化します。composer.jsonがあなたの依存関係とPSR-4の対応づけを宣言し(典型的には"autoload": { "psr-4": { "App\\\\": "src/" } })、そのあとcomposer installがパッケージをvendor/にダウンロードして、アプリケーション全体でただ一つのrequireとなるvendor/autoload.phpを生成します。欠かせない区別があります。本番で必要なパッケージにはrequire、ツール類(テスト、静的解析)にはrequire-devを使い、後者は--no-devによってデプロイから除かれます。
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -oApp\がsrc/を指すとき、クラスApp\Blog\PostRepositoryはどこにありますか?composer require --devは何のためのものですか?