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
.
Хотите оптимизировать свой бизнес, нужен сервис, сайт или интеграция.
Бесплатно расчитаю время разработки, предложу решение вашей задачи.