Bitrix: Option::get с union type возврата (PHP 8.x)
Обёртка над Bitrix\Main\Config\Option::get с явным возвращаемым типом string|int|bool|null для опций, свойств и полей инфоблоков.
Как использовать
- Скопируйте функцию getOption() в общий хелпер или конфиг проекта (например /local/php_interface/include/).
- Вызывайте getOption('имя_опции') вместо Option::get() там, где нужен типизированный результат (bool, int, string или null).
- Модуль и опция по умолчанию — main; при необходимости измените первый аргумент в Option::get внутри обёртки.
В 1С-Битрикс D7 метод \Bitrix\Main\Config\Option::get() всегда возвращает строку (документация). Опции модулей и настройки (флаги Y/N, числа, тексты) при этом логически могут быть булевыми, целыми или пустыми. При строгой типизации (PHP 8+, declare(strict_types=1)) и присвоении результата в переменную с типом bool|int возникают предупреждения или ошибки типов, а ручное приведение размазано по коду. Симптом: статический анализ или runtime ругаются на тип, либо везде дублируются проверки $v === 'Y' и ctype_digit(). Ниже — обёртка с union type возврата string|int|bool|null: одна точка приведения для опций, свойств и полей инфоблоков, плюс пример проверки.
Решение
Обёртка над Option::get() с явным возвращаемым типом. Подходит для опций модулей, свойств и полей, где на выходе может быть строка, число, флаг или пустое значение.
<?php
use Bitrix\Main\Config\Option;
/**
* Получить опцию с явным типом возврата (PHP 8.0+).
* Option::get() возвращает string; пустая строка или отсутствие — null.
*/
function getOption(string $name): string|int|bool|null
{
$value = Option::get('main', $name, null);
if ($value === null || $value === '') {
return null;
}
// Флажок Y/N
if ($value === 'Y' || $value === 'N') {
return $value === 'Y';
}
// Целое число
if (ctype_digit($value)) {
return (int) $value;
}
return $value;
}
Пример использования:
// В конфиге/хелперах проекта
$useCache = getOption('cache_enabled'); // bool|null
$limit = getOption('list_limit'); // int|string|null
$name = getOption('site_name'); // string|null
Option::get($moduleId, $optionName, $default) — официальный API Bitrix D7. Третий аргумент — значение по умолчанию при отсутствии опции. ctype_digit() — встроенная функция PHP для проверки цифровой строки.
Проверка
- Проверка типов в консоли PHP (в корне сайта Bitrix, где подключается автозагрузчик):
cd /path/to/bitrix/site
php -r "
require_once __DIR__ . '/bitrix/modules/main/include/prolog_before.php';
require_once __DIR__ . '/local/php_interface/include/options_helper.php'; // путь к файлу с getOption
\$v = getOption('cache_enabled');
var_dump(\$v);
echo gettype(\$v) . PHP_EOL;
"
Подставьте реальный путь к файлу с функцией. Ожидаем: для опции Y/N — bool(true/false), для числа — int, для текста — string, при отсутствии — NULL.
- Диагностика: какое значение возвращает Option::get без обёртки — чтобы убедиться, что опция вообще есть:
// Временно в любом месте, где есть доступ к Bitrix
$raw = \Bitrix\Main\Config\Option::get('main', 'cache_enabled', '');
var_dump($raw); // строка "Y", "N" или пусто
После этого проверьте, что getOption('cache_enabled') даёт приведённый тип.
Типичные ошибки
- Ошибка «Return type must be string» или несовместимость с объявленным типом — в проекте PHP меньше 8.0. Union types (
string|int|bool|null) доступны с PHP 8.0. Обновите версию или уберите объявление возвращаемого типа и оставьте только приведение внутри функции. - Всегда null или неверный тип — опция хранится в другом модуле. В коде по умолчанию используется
Option::get('main', $name, null). Для опций другого модуля либо передайте модуль параметром в getOption(), либо вызовите Option::get(‘module_id’, $name, null) внутри функции. - Числа с плавающей точкой — текущая логика распознаёт только целые (ctype_digit). Если опция может быть float, добавьте ветку с
is_numeric()и(float) $value.
Где применять
- Prod / dev: любой проект на 1С-Битрикс D7 с PHP 8.0+ и опциями модулей (main, iblock и др.), где нужна строгая типизация без размазанного приведения по коду.
- Локально: подключайте файл с getOption через
auto_prepend_fileили вinit.php/includeвprolog_before.php.
Связанные сниппеты: Чтение и запись опций конфигурации, PHP 8.5: array first/last и выборка, Атрибут override в PHP 8.3.