<small>Предыдущие статьи:

- ➡️ [Раздел 04. Философия](/docs/04-philosophy)
- ➡️ [Раздел 05. Принципы работы](/docs/05-principles)
- ➡️ [Раздел 06. Архитектура](/docs/06-architecture)
</small>
# 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. Соглашение о хранилище данных](/docs/08-database)
- ➡️ [Раздел 09. Параметризация](/docs/09-parametrization)
- ➡️ [Раздел 10. Мультипроектность](/docs/10-multiproject)
