Немного теории
У платформы «1С-Битрикс: Управление сайтом» долгая история и все новейшие технические решения объединены под общим названием “Ядро D7”. Остальную часть продукта условно называют “старым ядром”, хотя пользоваться им по-прежнему можно.
Ядро D7 является основным, однако не все возможности старого ядра на данный момент воссозданы в нем. В продукте продолжает работать весь старый API. И добавляется новый API D7. Постепенно, старый API должен стать чем-то типа адаптера, для совместимости. А вся логика с соответствующим рефакторингом должна переехать в D7.
Таким образом, есть функции, которые представлены только в ядре D7, функции только старого ядра и “пограничные”, где у разработчика есть выбор. По возможности всегда надо использовать новые функции. Но знать и изучать мы рекомендуем оба ядра, так как большая часть проектов до сих пор использует старое API.
К основным нововведениям ядра D7 относятся:
- Компоненты на классах
- Автозагрузка классов модулей через пространства имен
- Обновленные события
- Папка /local/
До появления ядра D7 все используемые классы (всегда начинаются с префикса C, например CUser, CMain…) разработчику нужно было явно подключать в файле include.php модуля. Сейчас, с использованием пространств имен, требуется только правильно дать название классу и расположить в правильной поддиректории папки модуля /lib/.
За время существования старого ядра появились готовые функции под распространенные действия. У некоторых “комплексных” функций нет прямого аналога в новом ядре и их использование по прежнему оправдано:
- CopyDirFiles
- CMain::GetCurPageParam
- CIBlockResult::GetNext и GetNext в других классах старого ядра. Он приводит значения к безопасному виду, сохраняя оригинальные значение в ключи с префиксом “~”, заменяет шаблоны путей DETAIL_PAGE_URL и LIST_PAGE_URL. Полноценного аналога в ядре D7 на данный момент нет.
- $APPLICATION->ThrowException. В ядре D7 есть полноценные исключения, но они не везде могут заменить старый механизм ошибок главного модуля.
Остановимся чуть подробнее на ошибках и исключениях. В старом ядре не использовался механизм PHP Exceptions, его роль выполняли методы CMain::ThrowException и CMain::GetException. В ядре D7 в случае ошибки нужно выбрасывать подходящее исключение наследник-SystemException и обрабатывать его через try-catch.
Изменилась работа с письмами, но только на уровне названий классов и методов. Старый метод CEvent::Send полностью может быть заменен на Event::send. Отличие только в способе передачи аргументов: вместо семи типизированных теперь передается один массив $data.
Хорошим тоном в ядре D7 считается отказ от глобальных и суперглобальных переменных. Так вместо $DB теперь есть метод доступа к объекту БД Application::getConnection, а вместо работы с системными переменными $_GET и $_POST нужно задействовать HttpRequest::getQuery и HttpRequest::getPost.
Настройки в D7 вносятся в файл /bitrix/.settings.php. Напомним, что в старом ядре настройки вносились в файл /bitrix/php_interface/dbconn.php. Файл .settings.php структурно сильно отличается от прежнего dbconn.php.
Кроме этого настройки могут задаваться в файле .settings_extra.php. Базовый файл настроек содержит неизменные настройки, к которым есть API. Файл .settings_extra.php может содержать произвольный код, который меняет настройки динамически. Соответственно к нему нет API.
Что надо помнить при работе со старыми сайтами
Предположим, что вам нужно работать с сайтом 5-летней давности. Как правило, речь про полноценное обновление всех систем: платформы, версии PHP, модулей и пользовательского кода. Более новые версии PHP всегда строже, запрещают некоторые приемы, которые были разрешены в языке раньше. При обновлении вы, скорее всего, столкнетесь с некоторыми проблемами. По нашему опыту, самыми распространенными проблемами при обновлении платформы будут:
- вызов нестатических методов статическим способом;
- неверное объявление обработчиков событий (объявлены динамически, а вызываются статически);
- передача аргументов неверного типа (in_array() а вместо массива оказался null, в count() попал null). Начиная с php 8.0 если в in_array() или count() попадёт вместо массива попадёт null это приведёт к ошибки скрипта. В случае с in_array() решается написанием проверки is_array(). В случае с count() можно использовать empty();
- неверные типы данных при операциях в ядре;
- использование устаревших функций (each(), который был удалён);
- использование устаревшего синтаксиса. К примеру, использование фигурных скобок для обращения к элементам массива приводит к такой ошибке;
- прекращение поддержки обратного порядка аргументов функции implode();
Практика
В этом уроке мы поговорим про методы и классы старого ядра, у которых на данный момент нет аналогов в D7, а затем потренируемся делать рефакторинг кода, использующего устаревшие методы.
Легаси
18 мин
Полезные ссылки и материалы
- Ядро D7
- Компоненты на классах
- Пространства имен
- События в D7
- Папка /local
- CopyDirFiles./a>
- CMain::GetCurPageParam
- CIBlockResult::GetNext
- CMain::ThrowException
- CMain::GetException
- SystemException
- CEvent::Send
- Event::send
- Application::getConnection
- HttpRequest::getQuery
- HttpRequest::getPost
- Настройка параметров ядра