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

Что именно возвращает 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>
Подводные камни и рекомендации
- Производительность и память. В больших скриптах снимок может занимать мегабайты — не вызывайте
get_defined_vars()
в тесном цикле. - Безопасность. Логи с полным дампом переменных нередко содержат пароли, токены, куки. Никогда не выкладывайте такие файлы в публичный веб-корень.
- Чтение ссылок. Значения возвращаются по ссылке. Если вы случайно измените
$vars['siteName']
, то же изменится в оригинале. - Контролируйте суперглобали. Если нужны только локальные данные, фильтруйте массив через
array_diff_key()
илиarray_filter()
.
Итоги
Функция get_defined_vars()
— настоящий «рентген для переменных» в PHP-коде. В связке с возможностями 1С-Битрикс она помогает:
- быстро отлаживать шаблоны и компоненты;
- логировать состояние приложения на любых этапах;
- динамически формировать запросы, шаблоны и REST-ответы;
- автоматизировать аудит и тестирование объектов.
Используйте её осознанно, обрезайте лишнее и скрывайте конфиденциальные данные — и она станет вашим верным союзником в разработке и поддержке даже самых нагруженных проектов.