Блог разработчика 1С-Битрикс

Функция get_defined_vars в PHP: подробный обзор и практические примеры на CMS 1С-Битрикс

get_defined_vars() — одна из самых мощных (и при этом часто недооценённых) функций ядра PHP. Она возвращает ассоциативный массив всех переменных, доступных в текущей области видимости, включая суперглобальные массивы. Благодаря этому функция становится незаменимым инструментом для отладки, логирования и метапрограммирования — особенно в сложных проектах на 1С-Битрикс, где один шаблон может «видеть» десятки параметров и результатов работы компонентов.

Функция get_defined_vars в PHP

Что именно возвращает get_defined_vars()

Контекст вызова Что попадёт в массив
Глобальная область видимости (index.php, header.php и т.п.) Все объявленные переменные плюс все суперглобальные ($_SERVER, $_GET, $_POST...), т.к. они уже присутствуют в $GLOBALS.
Внутри функции/метода Аргументы, локальные переменные и суперглобальные (PHP автоматически подмешивает их).
Внутри анонимной функции (closure) Локальные переменные внутри closure + переменные, переданные через use(...) + суперглобальные.

Важно: Возвращаемые элементы — это ссылки на реальные переменные. Если после вызова get_defined_vars() вы измените элемент возвращённого массива по ссылке, изменится и оригинальная переменная.

Общая схема использования

<?php
$vars = get_defined_vars();  // «снимок» всех переменных
echo '<pre>' . htmlspecialchars(print_r($vars, true)) . '</pre>';
?>

1. Базовая отладка шаблона 1С-Битрикс

Часто нужно быстро понять, какие параметры и данные доступны внутри шаблона компонента.

<?php
// /local/components/my/news/templates/.default/template.php
// $arResult и $arParams уже «лежат на столе»
$debug = array_diff_key(
    get_defined_vars(),
    ['GLOBALS' => 1, '_SERVER' => 1, '_GET' => 1, '_POST' => 1] // убираем шум суперглобалей
);
echo '<pre>', htmlspecialchars(print_r($debug, true)), '</pre>';
?>

Что получаем: структурированный дамп $arParams, $arResult и всех созданных в шаблоне переменных — ничто не ускользнёт.

2. Логирование состояния компонента в файл

Когда баг воспроизводится «только у клиента», но доступ к var_dump по HTTPS невозможен, поможет файл-лог.

<?php
// /local/components/my/news/component.php
/**
 * @var CBitrixComponent|self $this
 */
function logSnapshot(array $snapshot, string $tag): void
{
    $path = $_SERVER['DOCUMENT_ROOT'] . '/local/var/snapshots.log';
    $line = date('[Y-m-d H:i:s] ') . $tag . ' ' . var_export($snapshot, true) . PHP_EOL;
    file_put_contents($path, $line, FILE_APPEND);
}
$arParams['CACHE_TIME'] = 36000000; // пример модификации
$arResult['DATE'] = date('c');
logSnapshot(get_defined_vars(), 'BEFORE_TEMPLATE');
// ...
$this->IncludeComponentTemplate();

Файл /local/var/snapshots.log будет содержать поэтапные «срезы» состояния компонента — бесценно при поиске плавающих ошибок.

3. Сравнение локальных и глобальных переменных внутри функции

<?php
$global = 'hello';
function testScope(): void
{
    $local = 42;
    $snapshot = get_defined_vars();
    // Суперглобали уже здесь, $global появится в $GLOBALS, но не как $global
    echo '<pre>', htmlspecialchars(print_r($snapshot, true)), '</pre>';
}
testScope();

Ключевые выводы:

  • Внутри функции вы увидите $local, $snapshot, аргументы и все суперглобали.
  • Переменная $global отобразится в $GLOBALS['global'], но не как $global.

4. Фильтрация конфиденциальных данных при выводе

Чтобы случайно не утекли токены и пароли, можно быстро «заштриховать» опасные ключи.

<?php
function safe_dump(array $vars): void
{
    $hidden = ['DB_PASSWORD', 'TOKEN', 'PASSWORD', 'PASS', 'SECRET'];
    array_walk_recursive($vars, function (&$value, $key) use ($hidden) {
        if (in_array(strtoupper($key), $hidden, true)) {
            $value = str_repeat('*', strlen((string)$value));
        }
    });
    echo '<pre>', htmlspecialchars(print_r($vars, true)), '</pre>';
}
safe_dump(get_defined_vars());

5. Генерация списка доступных переменных для шаблонизатора Twig

В проектах, где Twig используется поверх Битрикса, полезно передать «белый список» имён переменных в шаблон.

<?php
$vars = get_defined_vars();
$allowed = array_keys($vars);
$twig->addGlobal('allowed_vars', $allowed);

В самом шаблоне Twig можно вывести их так:

<ul>
    {% for name in allowed_vars %}
        <li>{{ name }}</li>
    {% endfor %}
</ul>

6. Автоматическое формирование параметров для PDO-запроса

Иногда необходимо «слепо» собрать плейсхолдеры из существующих переменных.

<?php
$user_id = 7;
$status = 'active';
$role = 'admin';
$vars = array_intersect_key(
    get_defined_vars(),
    array_flip(['user_id', 'status', 'role']) // фильтруем нужные
);
$sql = 'SELECT * FROM users WHERE '
    . implode(' AND ', array_map(fn($k) => "$k = :$k", array_keys($vars)));
$stmt = $pdo->prepare($sql);
$stmt->execute($vars);

И запрос, и массив параметров сформированы программно, риск опечатки минимален.

7. Снимок всех переменных перед exit

В баблграппинге ошибок удобно сохранить текущий контекст:

<?php
register_shutdown_function(function () {
    $error = error_get_last();
    if ($error) {
        file_put_contents(
            '/tmp/fatal_' . time() . '.log',
            var_export(['error' => $error] + get_defined_vars(), true)
        );
    }
});

Так вы не потеряете ничего, даже при фатальной ошибке.

8. Интеграция с REST-хендлером Битрикса

<?php
// /local/services/custom.rest.php
use Bitrix\Main\Loader;
Loader::includeModule('rest');
$vars = get_defined_vars();
unset($vars['APPLICATION']); // объект слишком тяжёлый и цикличный
return [
    'METHOD' => 'custom.echo',
    'HANDLER' => function () use ($vars) {
        return $vars; // отдаём ясную картину окружения в JSON
    },
];

Для поддерживающих команду программистов (и Postman) такой эндпоинт становится универсальным «моментальным снимком» окружения.

9. Слияние get_defined_vars() с get_class_vars()

<?php
class User
{
    public string $name;
    public int $age;
    private bool $isAdmin = false;
    public function debug(): array
    {
        return get_defined_vars() + get_class_vars(self::class);
    }
}
$user = new User();
$user->name = 'Mike';
$user->age = 30;
print_r($user->debug());

Получаем одновременно текущие значения свойств и их объявленные по умолчанию значения — удобно для автоматического аудита DTO-объектов.

10. Мини-фреймворк для «живых» сниппетов в статьях

Если вы, как автор тех же статей, хотите публиковать в блоге «живые» примеры, можно сделать простой роутер, который отдаёт JSON-слепок переменных прямо в статье:

<?php
// /local/api/snapshot.php
header('Content-Type: application/json; charset=utf-8');
$code = $_GET['code'] ?? '';
eval($code); // ВНИМАНИЕ: только в защищённой среде!
echo json_encode(get_defined_vars(), JSON_PRETTY_PRINT);

В статье затем вставляем:

<script>
fetch('/local/api/snapshot.php?code=' + encodeURIComponent('$a=2;$b=3;$c=$a+$b;'))
   .then(r => r.json())
   .then(console.log);
</script>

Подводные камни и рекомендации

  1. Производительность и память. В больших скриптах снимок может занимать мегабайты — не вызывайте get_defined_vars() в тесном цикле.
  2. Безопасность. Логи с полным дампом переменных нередко содержат пароли, токены, куки. Никогда не выкладывайте такие файлы в публичный веб-корень.
  3. Чтение ссылок. Значения возвращаются по ссылке. Если вы случайно измените $vars['siteName'], то же изменится в оригинале.
  4. Контролируйте суперглобали. Если нужны только локальные данные, фильтруйте массив через array_diff_key() или array_filter().

Итоги

Функция get_defined_vars() — настоящий «рентген для переменных» в PHP-коде. В связке с возможностями 1С-Битрикс она помогает:

  • быстро отлаживать шаблоны и компоненты;
  • логировать состояние приложения на любых этапах;
  • динамически формировать запросы, шаблоны и REST-ответы;
  • автоматизировать аудит и тестирование объектов.

Используйте её осознанно, обрезайте лишнее и скрывайте конфиденциальные данные — и она станет вашим верным союзником в разработке и поддержке даже самых нагруженных проектов.

Теги:  PHP, get_defined_vars, 1С-Битрикс, отладка, логирование, метапрограммирование, суперглобальные массивы


Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

* стоимость зависит от конкретной задачи, ее объема и сложности выполняемых работ.

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Разработка интернет-магазина с готовой версткой

от 4 недель

от 90 000 рублей

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.