W3docs

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() внутри функции сообщает только о собственных переменных этой функции.

php— editable, runs on the server

Внутри функции видима только локальная переменная, поэтому вывод будет следующим:

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. Понимание этой границы делает функцию предсказуемой в использовании.

Практика

Практика
Что делает функция PHP get_defined_vars()?
Что делает функция PHP get_defined_vars()?
Was this page helpful?