Kodokon kodokon.com

Пространства имён, автозагрузка и Composer

Структурируй код пространствами имён PSR-4 и позволь Composer загружать классы и зависимости за тебя.

8 мин · 3 вопросов

Открыть этот урок в Kodokon

Пространства имён устраняют коллизии имён: две библиотеки могут спокойно объявить каждая свой класс Client. Универсальное соглашение: префикс поставщика (App, Acme\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\UserService разрешается в src/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/ и генерирует vendor/autoload.php, единственный require во всём приложении. Важное различие: 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\Blog\PostRepository, если префикс App\ указывает на src/?
    • 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
    • Установить нестабильную версию пакета
    • Установить пакет глобально на машине