РекомендуетсяPHPComposer

PHP: namespace, PSR-4 и автозагрузка

Свяжите namespace с путями через явную конфигурацию загрузчика. Для нового Composer-пакета предпочитайте PSR-4 и точное совпадение регистра; use импортирует имя, а не файл.

Опубликовано Проверено Изменено

Плохо

Класс Acme\Billing\Invoice лежит в src/invoice.php.
use Acme\Billing\Invoice считается подключением файла.
В каждом endpoint вручную требуют разные копии Invoice.php.

Хорошо

{
  "autoload": {
    "psr-4": {
      "Acme\\Billing\\": "src/"
    }
  }
}

Почему это важно

Единая карта загрузки убирает зависимость от порядка ручных require. Ошибка регистра может оставаться незаметной на рабочей машине и проявиться на Linux. Namespace сам по себе не создает автозагрузку.

Когда применять

Composer 2 и новый PHP-пакет с PSR-4. При показанной карте Acme\Billing\Invoice объявляется в src/Invoice.php, а Acme\Billing\Service\InvoiceSender — в src/Service/InvoiceSender.php. Префикс заканчивается обратным слешем; путь считается от корня пакета. Каждый сегмент пути и имя класса согласованы по регистру.

Bootstrap подключает сгенерированный vendor/autoload.php один раз. После изменения конфигурации/оптимизированной classmap пересоберите autoload штатной командой Composer; файлы vendor не редактируют вручную. Классы тестов размещают в autoload-dev, чтобы production-код не зависел от dev-пакетов.

PSR-4 относится к классоподобным сущностям и не автозагружает произвольную функцию по use function. Для функций/legacy доступны явно выбранные files/classmap или платформенный loader; их side effects должны быть понятны.

Bitrix Loader и WordPress bootstrap — другие контексты. Не утверждайте, что старый D7 с lowercase lib полностью совпадает с PSR-4, и не добавляйте параллельный loader для тех же классов без необходимости. Переезд имени/пути публичного класса требует плана совместимости.

Кто что делает

Человек

Определяет границу пакета и допустимый переход legacy-имен.

AI-агент

Сверяет prefix, namespace, регистр и bootstrap на всех точках входа. Не считает use механизмом загрузки.

Как проверить у себя

Вход и действиеОжидаемый результатСвидетельство
Чистая установка production-зависимостей, первый вызов InvoiceКласс найден без ручных requireПроверка в case-sensitive файловой системе
Файл назван invoice.php вместо Invoice.phpНесоответствие обнаружено до выпускаПроверка карты и сборки
Изменен namespace prefix или optimized classmapПосле штатной пересборки все точки входа видят один классSmoke-тест HTTP/CLI/worker
Production-класс ссылается на autoload-devПроверка --no-dev выявляет нарушениеЗапуск с production-зависимостями

JSON примера является фрагментом composer.json приложения, а не исполняемым файлом этого репозитория стандартов.

ПервоисточникиИстория изменений на GitHub

Дата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.