PSR-4 автозагрузка классов в php
Стандарт PSR-4
Стандарт PSR-4 определяет правила автоматической загрузки классов по их пространству имен и пути к файлу без ручного использования инструкций require/include.
PSR-4 является стандартом для composer, что упрощает управление зависимостями в проектах.
Как работает PSR-4
- Преобразует имя класса с namespace в путь к файлу.
- Заменяет разделители namespace
\на разделители для директорий/. - Добавляет расширение
.php. - Идет поиск файла в директории в настройках
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.
Ссылки
Оптимизация бизнеса, создание сайтов, разработка парсеров или интеграций.
Бесплатно расчитаю время разработки, предложу решение вашей задачи.
