get_defined_vars()
Функция get_defined_vars() в PHP возвращает ассоциативный array со всеми определёнными переменными в текущей области видимости.
Введение
get_defined_vars() — встроенная функция PHP, которая возвращает ассоциативный array всех переменных, существующих в области видимости, из которой она вызвана. Ключами array являются имена переменных (без ведущего $), а значениями — текущие значения этих переменных.
Главное, что нужно помнить, — это область видимости. «Область видимости» — это участок кода, в котором переменная доступна. PHP различает область видимости функции (переменные внутри функции) и глобальную область (переменные на верхнем уровне скрипта). get_defined_vars() сообщает только о том, что видимо в точке вызова, что делает её удобным способом получить снимок состояния для отладки без необходимости перечислять каждую переменную вручную.
На этой странице рассматриваются синтаксис, что функция включает и не включает в результат, как результат меняется в зависимости от области видимости, и наиболее распространённые практические сценарии использования.
Синтаксис
get_defined_vars(): arrayФункция не принимает никаких аргументов и всегда возвращает array. Если в текущей области видимости не определено ни одной переменной, возвращается пустой array.
Базовый пример
Простейший случай — вызов в глобальной области сразу после объявления нескольких переменных:
<?php
$name = "Ada";
$age = 36;
$colors = ["red", "green"];
print_r(get_defined_vars());
?>Пользовательские переменные появятся в качестве ключей (вместе с суперглобальными переменными PHP, описанными ниже):
Array
(
[name] => Ada
[age] => 36
[colors] => Array
(
[0] => red
[1] => green
)
...
)Область видимости важна: локальная и глобальная
Именно здесь чаще всего возникает путаница. get_defined_vars() не видит переменные из других областей видимости. Функция не может видеть глобальные переменные скрипта, если они не были явно импортированы (например, с помощью ключевого слова global или переданы как аргументы), поэтому вызов get_defined_vars() внутри функции сообщает только о собственных переменных этой функции.
Внутри функции видима только локальная переменная, поэтому вывод будет следующим:
Array
(
[var3] => 1
)Глобальные $var1 и $var2 не перечислены, поскольку они принадлежат другой области видимости. (true выводится как 1, потому что PHP отображает boolean true именно так в print_r.)
А как насчёт суперглобальных переменных?
Распространённое заблуждение состоит в том, что get_defined_vars() всегда возвращает суперглобальные переменные ($_GET, $_POST, $_SERVER и т. д.). Это не так. Суперглобальные переменные возвращаются только при вызове функции в глобальной области видимости, потому что именно там они существуют. Внутри функции они доступны по имени, но не являются частью локальной области видимости, поэтому не появляются в результате выше. То же правило распространяется на $GLOBALS — она не включается в возвращаемый array.
Распространённые сценарии использования
Проверка, определена ли переменная
Поскольку результат является обычным array, можно проверить существование переменной с помощью array_key_exists(). Это удобно, когда переменная может быть задана только на некоторых ветках кода:
<?php
$config = "loaded";
$vars = get_defined_vars();
var_dump(array_key_exists("config", $vars)); // bool(true)
var_dump(array_key_exists("missing", $vars)); // bool(false)
?>Для проверки одной конкретной переменной обычно понятнее использовать isset(); get_defined_vars() лучше подходит, когда нужна полная картина сразу.
Отладка состояния внутри функции
Добавьте один вызов рядом с проблемной строкой, чтобы увидеть все локальные переменные и их значения, вместо того чтобы писать var_dump() для каждой:
<?php
function calculatePrice($base, $taxRate) {
$tax = $base * $taxRate;
$total = $base + $tax;
print_r(get_defined_vars());
return $total;
}
calculatePrice(100, 0.2);
?>Снимок показывает аргументы и все локальные переменные на каждом шаге:
Array
(
[base] => 100
[taxRate] => 0.2
[tax] => 20
[total] => 120
)Связанные функции
| Функция | Используйте её, когда нужно… |
|---|---|
compact() | Построить array из выбранных имён переменных. |
extract() | Сделать обратное — превратить ключи array обратно в переменные. |
isset() | Проверить, задана ли одна конкретная переменная и не является ли она null. |
Смотрите также Область видимости переменных — правила, определяющие, что get_defined_vars() может видеть, — и Суперглобальные переменные PHP, объясняющие, почему они появляются только в глобальной области.
Заключение
get_defined_vars() даёт вам однострочный снимок всех переменных, видимых в текущей области видимости, что делает её быстрым инструментом отладки и простым способом программно проверять или инспектировать состояние. Единственное правило, которое нужно помнить, — область видимости: внутри функции вы видите только локальные переменные этой функции (плюс всё, что было явно импортировано), тогда как в глобальной области видны и суперглобальные переменные PHP. Понимание этой границы делает функцию предсказуемой в использовании.