SLOT-H: Автолоадер (граф зависимостей)
В системе используется собственный автолоадер, построенный на графе зависимостей классов. Он генерируется автоматически и не требует ручного обслуживания.
ВАЖНО!
Демо-версия работает исключительно с MySQL. Автолоадер доработан под данный engine (в процессе подготовки, добавлено непосредственное использование). Полная версия работает на несколько ином принципе, использя хелперы работы с хранимыми процедурами.
Принцип работы
Автолоадер сканирует все PHP-файлы в проекте и строит карту соответствия между классами и файлами, в которых они объявлены.
В карте фиксируются не только сами классы, но и их зависимости:
- Если класс наследуется от другого класса, эта связь записывается в карту
- Класс загружается только тогда, когда он реально нужен для обработки запроса
- Загрузка происходит рекурсивно: сначала подгружаются родительские классы, затем дочерние
Автолоадер загружает интерфейсы и трейты при старте. Остальные классы подгружаются по мере необходимости в процессе выполнения запроса. Это даёт оптимальную производительность.
Требования к именованию классов
Все классы экосистемы должны иметь namespace, идентичный пути от корня проекта.
Пример:
Файл `Modules/Base/Controllers/Cli.php` должен иметь namespace `Modules\Base\Controllers`
Файл `Application/Assistance/Database.php` должен иметь namespace `Application\Assistance`
Это даёт два преимущества:
1. Предсказуемость - по имени класса всегда понятно, в какой папке он лежит
2. Уникальность - можно иметь два класса с одинаковым именем в разных пространствах имён
Генерация автолоадера
Автолоадер не редактируется вручную. Он пересоздаётся скриптом `Application/Tools/createAutoloader.php`.
Запуск генерации требуется в следующих случаях:
- Создан новый класс
- Класс переименован
- Класс перенесён в другую папку
- Класс удалён
- Изменена иерархия наследования (добавлен или удалён родительский класс)
Важно: создание нового класса без перегенерации автолоадера приведёт к ошибке `Class not found`.
Статические файлы
Помимо классов, `createAutoloader.php` обрабатывает статические файлы (css, js).
Для каждого такого файла вычисляется его хеш. Хеш сохраняется в таблице `static_files`. При загрузке страницы файлы подключаются через контроллер `Scope`, который отдаёт файл по хешу. Браузер кеширует файл, но при изменении файла хеш меняется, и браузер загружает новую версию.
Это решает проблему кеширования статики без необходимости вручную менять версии в коде. Всегда отдаётся актуальная версия файла.
Минификация и обфускация отключены в текущей версии.
Сравнение с традиционными подходами
В большинстве PHP-фреймворков и проектов используется стандартный автолоадер Composer, основанный на стандарте PSR-4. Он работает по принципу «пространство имён → путь к файлу». Это надёжное и быстрое решение, которое стало индустриальным стандартом.
В данной системе автолоадер работает иначе. Вместо поиска файлов по правилам PSR-4 он использует предварительно собранную карту соответствия между классами и файлами. Эта карта генерируется скриптом `createAutoloader.php` и содержит полный список всех классов проекта.
Основные отличия
1. Генерация карты, а не поиск по правилам
Стандартный PSR-4 автолоадер вычисляет путь к файлу на основе имени класса и префикса пространства имён. Это происходит каждый раз при обращении к классу. Система не вычисляет путь - она берёт его из готовой карты. Это быстрее, так как не требует вычислений и проверок существования файла.
2. Учёт иерархии наследования
В отличие от Composer, который просто загружает указанный класс, автолоадер системы анализирует иерархию наследования. Если класс наследуется от другого класса, эта связь фиксируется в карте. При загрузке класса система автоматически подгружает всех его родителей в правильном порядке. Это исключает ошибки, связанные с тем, что родительский класс ещё не загружен.
3. Единый источник истины
Правила PSR-4 описываются в `composer.json` и могут быть сложными для понимания, особенно когда в проекте несколько пространств имён с разными путями. В системе путь к классу всегда однозначно определяется его именем. Это делает код более предсказуемым и лёгким для анализа.
4. Интеграция со статикой
Composer занимается только PHP-классами. Автолоадер системы параллельно обрабатывает и статические файлы (css, js), вычисляя их хеши для управления кешированием. Это связывает управление кодом и статикой в единый процесс.
5. Строгие требования к именованию
Стандарт PSR-4 допускает различные варианты организации каталогов. Система требует, чтобы namespace полностью совпадал с путём от корня проекта. Это ограничение делает структуру проекта единообразной и исключает ситуации, когда один разработчик использует один стиль, а другой - другой.
Что это даёт на практике
- Предсказуемость. Открыв любой файл, можно сразу сказать, какой у него namespace, просто посмотрев на путь к файлу. И наоборот - зная имя класса, можно сразу понять, где его искать. Это ускоряет работу с кодом и снижает когнитивную нагрузку.
- Надёжность. Автолоадер не выполняет поиск файлов на диске. Все пути известны заранее. Это исключает ситуации, когда автолоадер не может найти класс из-за ошибки в правилах.
- Производительность. Отсутствие операций поиска файлов и вычисления путей делает загрузку классов быстрее, особенно при большом количестве классов.
Обратная сторона
Требуется перегенерировать автолоадер при любом изменении структуры классов. Это добавляет шаг в процесс разработки. Однако этот шаг автоматизирован и занимает секунды. В Composer аналогичный шаг тоже существует - это команда `composer dump-autoload`. Разница лишь в том, что в системе он обязателен, а в Composer - только при изменении правил автозагрузки.
Что дальше?
- ➡️ Раздел 08. Соглашение о хранилище данных
- ➡️ Раздел 09. Параметризация
- ➡️ Раздел 10. Мультипроектность