Структурируй код пространствами имён 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/ и генерирует vendor/autoload.php, единственный require во всём приложении. Важное различие: 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\Blog\PostRepository, если префикс App\ указывает на src/?composer require --dev?