Пост

PSR-4 автозагрузка классов в php

Стандарт PSR-4

PSR-4 автозагрузка классов в php

Стандарт PSR-4 определяет правила автоматической загрузки классов по их пространству имен и пути к файлу без ручного использования инструкций require/include.

PSR-4 является стандартом для composer, что упрощает управление зависимостями в проектах.

Как работает PSR-4

  1. Преобразует имя класса с namespace в путь к файлу.
  2. Заменяет разделители namespace \ на разделители для директорий /.
  3. Добавляет расширение .php.
  4. Идет поиск файла в директории в настройках composer.json.

Как пример namespace будет преобразован в путь к файлу:

App\Core\Handlers\Error => /src/Core/Handlers/Error/LogErrorHandler.php.

Настройка автозагрузки PSR-4 в composer

Теперь детальнее разберем настройку PSR-4 в composer. Соответствия указываются в секции autoload => psr-4.

Базовый синтаксис "Префикс\\Пространства\\Имён\\": "Путь/К/Директории/"

Рассмотрим пример пространство имен App директория src

1
2
3
4
5
6
7
{
  "autoload": {
    "psr-4": {
      "App\\": "src"
    }
  }
}

Класс

1
2
3
4
5
6
7
8
9
10
11
declare(strict_types=1);

namespace App\Layout\Main;

use Yiisoft\Assets\AssetBundle;

final class MainAsset extends AssetBundle
{

}

Получается, что класс MainAsset автоматически подключится, то есть namespace App\Layout\Main будет преобразован в путь к файлу /src/Layout/Main/MainAsset.php то есть вырезав префикс App получаем путь к файлу.

Пространств имен может быть несколько

1
2
3
4
5
6
7
8
{
  "autoload": {
    "psr-4": {
      "App\\": "src",
      "Bapp\\Tapp\\": "src1"
    }
  }
}

Определяем класс

1
2
3
4
5
6
7
8
9
10
<?php

declare(strict_types=1);

namespace Bapp\Tapp;

final readonly class ApplicationParams
{

}

И вызываем его в коде $a = new \Bapp\Tapp\ApplicationParams();

То есть пространство имен будет преобразовано в путь Bapp\Tapp\ApplicationParams => /src1/ApplicationParams.php

Для того чтобы обновить карту composer классов нужно запустить composer dump-autoload

В недрах composer пути хранятся примерно так

1
2
3
4
5
6
[
'Bapp\\Tapp\\' => array($baseDir . '/src1'),
'App\\Tests\\' => array($baseDir . '/tests'),
'App\\' => array($baseDir . '/src'),
]

Также есть возможность указать глобальные классы, тогда они будут в глобальном namespace, и несколько директорий поиска классов, но это используется редко.

Примеры путей

  • "Slim\\Psr7\\": "src"
  • "Slim\\Tests\\Psr7\\": "tests"
  • "DI\\": "src/"
  • "PhpParser\\": "lib/PhpParser"
  • "Yiisoft\\Definitions\\": "src"
  • "Symfony\\Component\\Console\\": ""

Выводы

  • Каждый сегмент namespace соответствует поддиректории.
  • Имя файла = имя класса.
  • Префикс namespace должен заканчиваться на \\.
  • Для обновления нужно использовать команду composer dump-autoload.
  • Вложенность может быть очень глубокой composer подключит все классы рекурсивно.
  • Можно во всем проекте подключать классы через use.
  • PSR-4 является де-факто стандартом для разработки на php.
Авторский пост защищен лицензией CC BY 4.0 .

Хотите оптимизировать свой бизнес, нужен сервис, сайт или интеграция.

Бесплатно расчитаю время разработки, предложу решение вашей задачи.