Yandex Metrika
sanches.free 1 просмотр

Автозагрузка классов в Битрикс: 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 дней гарантии