Автозагрузка классов в Битрикс: CModule::AddAutoloadClasses и D7
Зачем отдельная автозагрузка
Если класс лежит не в стандартной структуре модуля (например, в /local/php_interface/include/), ядро само его не найдёт. Тогда в раннем include (часто init.php или include.php модуля) объявляют карту: короткое или полное имя класса и путь к файлу от корня сайта. Дальше PHP подгрузит файл при первом обращении к классу.
Классика: CModule::AddAutoloadClasses
В старых проектах и примерах встречается регистрируют карту через CModule::AddAutoloadClasses. Первый аргумент — идентификатор модуля; пустая строка означает «не привязываем карту к конкретному модулю», что удобно для общего кода сайта.
Пример в духе оригинальной заметки, но с типичными путями под /local/ и без опечатки в имени класса вкладок:
CModule::AddAutoloadClasses('', [
'JS' => '/local/php_interface/classes/JS.php',
'TemplateTabs' => '/local/php_interface/classes/TemplateTabs.php',
'CatalogUtils' => '/local/php_interface/classes/CatalogUtils.php',
]);Значения массива — пути от корня установки сайта (там же, где лежит /bitrix/ и /local/). Имя класса в ключе должно совпадать с объявлением class … в файле, иначе автозагрузчик не сработает.
Современный стиль в D7
В ядре D7 для той же идеи используется \Bitrix\Main\Loader::registerAutoLoadClasses. Первый аргумент — null для глобальной карты сайта или строка с кодом модуля; второй — массив, где ключи — полные имена с ведущим обратным слэшем, значения — пути от корня сайта.
\Bitrix\Main\Loader::registerAutoLoadClasses(null, [
'\Acme\Reports\MarginTable' =>
'/local/php_interface/include/reports/margintable.php',
]);Классы внутри модуля чаще выносят в его /lib и не трогают ручную карту; явная регистрация остаётся для легаси-файлов и редких исключений.
На практике
- Вызывайте регистрацию до первого использования класса (на этапе подключения
prolog/ init модуля). - Не дублируйте одно и то же имя в разных картах без необходимости — порядок может запутать отладку.
- Если дерево классов большое, лучше привести структуру к
libи соглашениям модуля, а ручную карту оставить точечно.
Кратко
Легаси-сайты оформляют карту через CModule::AddAutoloadClasses с короткими именами классов; в D7 — через Loader::registerAutoLoadClasses с полными именами в namespace. В обоих случаях путь ведёт от корня сайта к PHP-файлу с определением класса.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии