Немного теории

У платформы «1С-Битрикс: Управление сайтом» долгая история и все новейшие технические решения объединены под общим названием “Ядро D7”. Остальную часть продукта условно называют “старым ядром”, хотя пользоваться им по-прежнему можно.

Ядро D7 является основным, однако не все возможности старого ядра на данный момент воссозданы в нем. В продукте продолжает работать весь старый API. И добавляется новый API D7. Постепенно, старый API должен стать чем-то типа адаптера, для совместимости. А вся логика с соответствующим рефакторингом должна переехать в D7.

Таким образом, есть функции, которые представлены только в ядре D7, функции только старого ядра и “пограничные”, где у разработчика есть выбор. По возможности всегда надо использовать новые функции. Но знать и изучать мы рекомендуем оба ядра, так как большая часть проектов до сих пор использует старое API.

К основным нововведениям ядра D7 относятся:

До появления ядра 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 мин