Где хранятся классы битрикс

Где хранятся классы битрикс

В Битрикс классы ядра и модулей расположены по строго определённой логике, отклонение от которой приводит к ошибкам автозагрузки. Классы ядра размещаются в директории /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

Структура размещения пользовательских классов в 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//lib/`. Для быстрого поиска можно воспользоваться IDE с поддержкой поиска по проекту или консольными инструментами, например `grep` или `find`.

Зачем Битрикс использует пространство имён в новых классах?

Пространство имён (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` модуля, чтобы классы корректно загружались при работе системы.

Ссылка на основную публикацию