В Битрикс классы ядра и модулей расположены по строго определённой логике, отклонение от которой приводит к ошибкам автозагрузки. Классы ядра размещаются в директории /bitrix/modules/main/lib/, где каждый подкаталог отражает пространство имён. Например, класс \Bitrix\Main\EventManager находится в файле /bitrix/modules/main/lib/eventmanager.php.
Сторонние модули и кастомные решения размещаются в /bitrix/modules/ в виде отдельных папок, соответствующих идентификаторам модулей. Внутри них классы должны быть организованы по PSR-4: все классы – в подкаталоге lib/, а пространство имён начинается с идентификатора модуля, например: \Vendor\ModuleName\ClassName – файл /bitrix/modules/vendor.modulename/lib/classname.php.
Для компонентов и шаблонов классы можно выносить в директорию /local/php_interface/lib/ или /local/classes/, но предпочтительнее использовать /local/modules/ с той же структурой, что и у официальных модулей. Это упрощает поддержку и миграции. Классы следует называть в соответствии с регистром PSR-0/4 и не использовать подчёркивания вместо неймспейсов.
Регистр классов и соответствие имени файла пространству имён критичны: автозагрузчик \Bitrix\Main\Loader::autoLoad() не найдёт класс, если структура нарушена. Любые вспомогательные библиотеки желательно регистрировать через autoload.php или composer с настройкой PSR-4 в composer.json.
Где находятся системные классы ядра Битрикс
Системные классы ядра Битрикс размещены в директории /bitrix/modules
, где каждая подсистема представлена отдельным модулем. Основные классы ядра находятся в модуле main
.
/bitrix/modules/main/classes/general/
– устаревшие, но всё ещё используемые классы. Здесь находятся базовые абстракции:CUser
,CModule
,,
CLang
./bitrix/modules/main/lib/
– современные классы, реализованные по стандарту PSR-0/PSR-4, с неймспейсами. Основные пространства имён:Bitrix\Main
,Bitrix\Main\ORM
,Bitrix\Main\EventManager
.
Автозагрузка классов осуществляется через /bitrix/modules/main/include.php
, где подключаются файлы с регистрацией автозагрузчиков.
При разработке рекомендуется использовать классы из main/lib
, так как они поддерживаются и развиваются, в отличие от устаревших решений из classes/general
.
Модули сторонних компонентов и системные расширения также содержат классы в аналогичной структуре. Например:
/bitrix/modules/catalog/lib/
– классы управления каталогом товаров./bitrix/modules/sale/lib/
– классы, связанные с обработкой заказов и корзиной.
Для поиска определения нужного класса удобно использовать встроенный класс Bitrix\Main\Loader::includeModule()
в сочетании с IDE с поддержкой автозагрузки (PhpStorm, VS Code).
Структура размещения пользовательских классов в local
В Bitrix структура каталога local/
предназначена для хранения кастомизированного функционала, включая пользовательские классы. Для обеспечения читаемости и масштабируемости проекта классы размещаются в строго определённой иерархии.
Базовая точка входа – каталог local/php_interface/
. Здесь создаётся автозагрузчик или подключается Composer, если проект использует автозагрузку по PSR-4.
Пользовательские классы размещаются в local/php_interface/lib/
или local/lib/
– предпочтительно второй вариант для соответствия современным практикам. Внутри создаются пространства имён в виде подкаталогов, соответствующих логике приложения.
Пример структуры:
local/ └── lib/ ├── Helpers/ │ └── DateFormatter.php ├── Services/ │ └── SmsNotifier.php └── Repositories/ └── UserRepository.php
Каждый класс должен быть оформлен в соответствии с PSR-12 и иметь корректное пространство имён. Например, файл local/lib/Services/SmsNotifier.php
должен начинаться с:
namespace Local\Services; class SmsNotifier { // ... }
Автозагрузка подключается через файл local/php_interface/init.php
:
spl_autoload_register(function ($class) { $prefix = 'Local\\'; $base_dir = $_SERVER['DOCUMENT_ROOT'] . '/local/lib/'; $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { return; } $relative_class = substr($class, $len); $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; if (file_exists($file)) { require $file; } });
При использовании Composer необходимо указать пространство имён в composer.json
:
"autoload": { "psr-4": { "Local\\": "local/lib/" } }
После добавления классов требуется выполнить composer dump-autoload
для генерации карты автозагрузки.
Рекомендуется избегать размещения логики в local/components
и local/modules
без необходимости. Основной код должен находиться в local/lib
, а компоненты использовать сервисные классы из этого каталога.
Расположение классов компонентов и их автозагрузка
Классы компонентов в Битрикс размещаются внутри каталога /local/components/
в структуре, соответствующей namespace. Каждый компонент должен находиться в своей папке, имя которой соответствует названию компонента в системе (например, /local/components/vendor/mycomponent/
).
Файлы с логикой компонента размещаются в подпапке /class/
или непосредственно в корне папки компонента, если используется единичный класс. Рекомендуется применять PSR-4 совместимую структуру: каждый класс – в отдельном файле с именем, соответствующим имени класса. Пример: /local/components/vendor/mycomponent/class/MyComponent.php
.
Пространства имён должны начинаться с \Vendor\Components\
, где Vendor
– это идентификатор разработчика, согласованный с vendor name в composer.json. Пример полного пространства имён: \Vendor\Components\MyComponent
.
Для автозагрузки необходимо зарегистрировать пространство имён через autoload
в /local/php_interface/init.php
или, предпочтительно, через Composer. В первом случае используется функция Bitrix\Main\Loader::registerAutoLoadClasses()
с указанием пути к файлам. Во втором – добавляется раздел autoload
в composer.json и настраивается соответствие пространств имён директориям.
Использование Composer предпочтительнее, так как позволяет избежать ручного управления автозагрузкой и упрощает подключение зависимостей. Для этого структура должна быть совместима с PSR-4, а файл composer.json
размещается в корне проекта. Пример маппинга: "Vendor\\Components\\": "local/components/vendor/"
.
При использовании кеширования компонентных шаблонов убедитесь, что классы не содержат жёстких ссылок на относительные пути. Вызовы к коду вне компонента должны использовать абсолютные пути с учетом namespace, иначе автозагрузка может не сработать корректно.
Где размещать классы для модуля при разработке
Классы модуля в Битрикс размещаются в директории /bitrix/modules/имя_модуля/lib/
. Это стандартная структура для автозагрузки через PSR-4. Каждый класс должен находиться в соответствующем пространстве имён, начинающемся с \ИмяМодуля
, и располагаться в подпапке, соответствующей его namespace-структуре.
Например, если у модуля ID acme.example
, а класс имеет пространство имён \Acme\Example\Service\Processor
, файл должен находиться по пути /bitrix/modules/acme.example/lib/service/processor.php
. Имена директорий и файлов – в нижнем регистре, классы – в CamelCase.
Файл include.php
должен регистрировать автозагрузку, обычно через Bitrix\Main\Loader::registerAutoLoadClasses()
или Loader::registerNamespace()
, если модуль не использует composer. Если используется composer, укажите правильный autoload
в composer.json
и разместите vendor
внутри модуля.
Вспомогательные классы (Entity, Helpers, Services) группируются по папкам внутри /lib/
. Не размещайте их в корне или вне модуля – это нарушает изоляцию и усложняет поддержку.
Контроллеры для REST и AJAX должны находиться в /lib/controller/
и наследоваться от Bitrix\Main\Engine\Controller
. Это обязательно для корректной работы маршрутизации через D7.
Назначение папки lib в структуре модуля
Папка lib
в структуре модуля Битрикс предназначена для размещения PHP-классов, реализующих бизнес-логику модуля. Это обязательная директория для автозагрузки, поддерживаемая стандартом PSR-4.
- Все классы должны быть пространственно организованы в соответствии с namespace модуля. Например, для модуля
vendor.module
корневое пространство имен будетVendor\Module
. - Имена файлов и классов должны строго соответствовать: класс
Vendor\Module\SomeClass
должен находиться в файлеlib/someclass.php
. - Подкаталоги внутри
lib
отражают вложенность пространств имен. КлассVendor\Module\Service\Mailer
располагается вlib/service/mailer.php
. - Запрещено размещать в
lib
вспомогательные функции, скрипты и файлы конфигурации. Только классы. - Реализация ORM-объектов, событий, сервисов и обработчиков также размещается в
lib
с соблюдением структуры по смысловым областям.
Для регистрации автозагрузки модуль должен содержать корректный namespace
и соответствующее описание в bitrix/modules/vendor.module/include.php
с вызовом \Bitrix\Main\Loader::registerAutoLoadClasses
или использованием composer.
Как работает автозагрузка классов в Битрикс
Битрикс использует собственный механизм автозагрузки классов, основанный на функции Bitrix\Main\Loader::autoLoad()
. Он регистрируется через spl_autoload_register()
и работает совместно с картой классов и соглашениями о пространствах имён.
Все стандартные классы ядра Битрикс описаны в файле /bitrix/.settings.php
в секции classes
, либо в файле /bitrix/modules/main/classes/general/autoload.php
(для устаревших решений). Современные модули используют PSR-4-подобную структуру с маппингом пространств имён на директории.
Для пользовательских модулей необходимо регистрировать автозагрузку через \Bitrix\Main\Loader::registerAutoLoadClasses()
, передавая массив соответствий ['Namespace\\ClassName' => 'relative/path/to/class.php']
. Это выполняется в init.php
или в файле include.php
модуля.
Если используется Composer, необходимо явно подключить автолоадер в init.php
: require_once($_SERVER['DOCUMENT_ROOT'].'/vendor/autoload.php');
. Это важно, так как Битрикс не использует Composer по умолчанию.
Для классов внутри компонентов, если они не регистрируются явно, автозагрузка не сработает. Рекомендуется выносить такие классы в отдельную директорию, например /local/lib
, и подключать через Loader::registerAutoLoadClasses
.
Ключевой момент – соблюдение нейминга и структуры директорий. Пространство имён Vendor\Module\Sub
должно соответствовать пути /local/modules/vendor.module/lib/sub/
. Класс должен быть определён в одноимённом файле, иначе загрузка не произойдёт.
Для дебага удобно использовать Debug::dump()
или включить логирование загрузки классов с помощью кастомного логгера, перехватывая вызовы Loader::autoLoad
.
Вопрос-ответ:
Где в структуре Битрикс находятся основные классы ядра и как их быстро найти?
Основные классы ядра Битрикс находятся в папке `/bitrix/modules`. Внутри неё каждый модуль располагается в отдельной папке, например, `main`, `iblock`, `sale` и т.д. Внутри этих модулей папка `/classes` содержит классы, относящиеся к соответствующему функционалу. Также стоит обратить внимание на автозагрузку классов через `bitrix/modules/autoload.php` и пространство имён — современные классы используют PSR-4 и располагаются в папке `/bitrix/modules/
Зачем Битрикс использует пространство имён в новых классах?
Пространство имён (namespace) в Битрикс используется для организации кода и устранения конфликтов имён между классами. Это особенно полезно при разработке крупных решений или при работе с кастомными модулями, где могут пересекаться названия классов. Использование пространства имён также упрощает автозагрузку и делает структуру проекта более понятной. В новых модулях классы размещаются в папке `/lib/` и следуют структуре пространства имён, совпадающей с путём к файлу. Например, класс `Bitrix\Main\Type\Date` соответствует файлу `bitrix/modules/main/lib/type/date.php`.
Как отличить старые и новые классы в структуре Битрикс?
Старые классы, как правило, находятся в подкаталогах `classes/general` или `classes/mysql` модуля. Они не используют пространство имён и часто пишутся в процедурном стиле. Новые классы, наоборот, располагаются в папке `lib/` модуля и используют пространство имён. Например, в модуле `iblock` старые классы находятся в `bitrix/modules/iblock/classes/`, а новые — в `bitrix/modules/iblock/lib/`. Также новые классы следуют PSR-4 стандарту и поддерживают автозагрузку. По стилю кода и именованию классов также легко понять, к какому типу они относятся.
Почему структура классов в Битрикс может сбивать с толку начинающих разработчиков?
Причина в том, что Битрикс содержит как старые, так и новые подходы к организации кода, и они часто пересекаются. Это создаёт путаницу: часть классов работает без пространств имён, часть — с ними, часть используется напрямую, а часть — через статические методы. К тому же структура модулей может отличаться от стандартных шаблонов, принятых в фреймворках. Для ориентира лучше сначала изучить структуру модуля `main`, так как он содержит базовые классы и чаще всего обновляется в соответствии с современными практиками. Также рекомендуется пользоваться документацией и инструментами автозагрузки.
Можно ли в пользовательских модулях применять ту же структуру классов, что и в системных модулях?
Да, в пользовательских модулях можно и рекомендуется использовать такую же структуру, как в системных. Это упрощает поддержку и делает код понятным другим разработчикам. Следует размещать классы в папке `lib/`, использовать пространства имён и соблюдать формат автозагрузки. Например, пользовательский модуль с идентификатором `vendor.module` может содержать класс `Vendor\Module\SomeClass` в файле `bitrix/modules/vendor.module/lib/someclass.php`. Также важно не забывать подключать пространство имён в `init.php` модуля, чтобы классы корректно загружались при работе системы.