Использование var_dump для отладки переменных в PHP

Раздел: Основы PHP -> Вывод данных

Функция var_dump и её возможности

Основное применение var_dump

Назначение:

Функция var_dump() предназначена для вывода структурированной информации о переменной: тип, значение, размер (для массивов и объектов). Это незаменимый инструмент отладки.


<?php
$data = ['name' => 'Анна', 'age' => 30];
var_dump($data);
?>
  

Print ru php (вывод print в php)

array(2) {
  ["name"]=>
  string(8) "Анна"
  ["age"]=>
  int(30)
}
  

вывод mysql php (вывод данных из mysql в php)

Пояснение: функция выводит тип (array), количество элементов (2), ключи и значения с типами. Для строки показана длина (8).

Типичные ошибки:

  • Нельзя присвоить результат var_dump() переменной – функция ничего не возвращает, только выводит в поток вывода.
  • Вывод в браузере без HTML-форматирования выглядит нечитаемо. Рекомендуется оборачивать в <pre>.
  • При наличии циклических ссылок в объектах функция может зациклиться (начиная с PHP 5.6 корректно обрабатывает ссылки).

Как получить читаемый вывод в браузере?

Поместить результат var_dump() внутрь HTML-тега <pre> для сохранения форматирования.


<?php
$info = ['a' => 1, 'b' => 2];
echo '<pre>';
var_dump($info);
echo '</pre>';
?>
  

Php таблицы (работа с таблицами в php)

<pre>
array(2) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
}
</pre>
  

View php itemid (просмотр элементов на php)

Проблемы:

Если страница уже имеет HTML-разметку, прямое использование var_dump нарушит структуру. Лучше записывать в лог или использовать буферизацию.

Как перехватить вывод var_dump в переменную?

Использовать буферизацию вывода (ob_start() и ob_get_clean()) для сохранения дампа в строку.


<?php
$value = ['x' => 10, 'y' => 20];
ob_start();
var_dump($value);
$dump = ob_get_clean();
echo $dump;
?>
  

Start php html (генерация html)

array(2) {
  ["x"]=>
  int(10)
  ["y"]=>
  int(20)
}
  

Index php show (показ index.php)

Цель: запись дампа в лог-файл или отправка по электронной почте.

Возможные сложности:

  • Если буферизация уже включена (вложенные ob_start()), нужно корректно управлять вложенностью.
  • Функция ob_get_clean() отключает буферизацию, что может повлиять на другие операции вывода.

Как вывести несколько переменных одновременно?

var_dump() принимает неограниченное количество аргументов – можно передать несколько переменных через запятую.


<?php
$a = 'Hello';
$b = [1, 2, 3];
$c = null;
var_dump($a, $b, $c);
?>
  

Show php url (показ url в php)

string(5) "Hello"
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
NULL
  

Php showing (отображение в php)

Ошибка:

Новички иногда передают переменные как строку, объединённую через точку, что приводит к дампу только результата конкатенации. Например, var_dump($a.$b) – это ошибка.

Как использовать var_export для получения PHP-кода?

Функция var_export() возвращает представление переменной в виде валидного PHP-кода (можно сразу присвоить). Это удобно для генерации конфигураций.


<?php
$config = ['host' => 'localhost', 'port' => 3306];
$code = var_export($config, true);
echo $code;
?>
  

Shows php name (показ имени в php)

array (
  'host' => 'localhost',
  'port' => 3306,
)
  

Show form php (показ формы в php)

Отличие от var_dump: нет типов (кроме null), вывод можно использовать для восстановления.

Недостатки:

  • Для объектов выводится только __set_state() – требует реализации соответствующего метода.
  • Не показывает приватные и защищённые свойства объектов.

Как получить информацию о переменной в виде строки с помощью print_r?

print_r() при передаче второго аргумента true возвращает результат, а не выводит его.


<?php
$arr = ['cat', 'dog', 'fish'];
$str = print_r($arr, true);
echo $str;
?>
  

Show php id (показ записи по id в php)

Array
(
    [0] => cat
    [1] => dog
    [2] => fish
)
  

Php выводим (вывод данных в php)

Цель: простое логирование без типов данных, более компактный вывод.

Сравнение с var_dump:

print_r не показывает типы (int, string) и длину строк, что может затруднить отладку при проверке точного значения.

Как использовать json_encode для отладки простых данных?

Для массивов и скаляров можно преобразовать в JSON, что удобно для визуализации в браузере или передачи в JavaScript.


<?php
$data = ['name' => 'Иван', 'skills' => ['PHP', 'JS']];
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
?>
  

Var dump php (var_dump - вывод информации о переменной)

{
    "name": "Иван",
    "skills": [
        "PHP",
        "JS"
    ]
}
  

Php без html (использование php без html (чистый вывод))

Ограничения:

  • Объекты с закрытыми свойствами могут не сериализоваться корректно без реализации JsonSerializable.
  • Ресурсы (resource) не поддерживаются.
  • Циклические ссылки вызывают ошибку.

Как получить расширенную информацию о ссылках (Zend Debug)?

Функция debug_zval_refs() показывает информацию о внутренних zval (тип, refcount, is_ref). Полезна при оптимизации памяти и поиске утечек.


<?php
$a = 42;
$b = &$a;
debug_zval_refs($a);
?>
  

Php вывод страницы (вывод страницы в php)

int(42) refcount(2) is_ref(1)
  

Случай использования: анализ кеширования, дебаг ошибок с неизменяемыми данными.

Предупреждение:

Функция доступна только при компиляции PHP с опцией --enable-debug (в продакшене обычно отключена).

Расширенные примеры использования var_dump

Пример 1: var_dump с объектом, имеющим приватные и защищённые свойства.

Пример

<?php
class User {
    public $name = 'Default';
    protected $email = 'user@example.com';
    private $password = 'secret';
}
$obj = new User();
var_dump($obj);
?>
object(User)#1 (3) {
  ["name"]=>
  string(7) "Default"
  ["email":protected]=>
  string(16) "user@example.com"
  ["password":"User":private]=>
  string(6) "secret"
}

Пояснение: видны все модификаторы доступа: :protected и "User":private указывают класс, в котором объявлено свойство.

Пример 2: var_dump с циклической ссылкой в объекте.

Пример

<?php
class Node {
    public $value;
    public $next;
}
$a = new Node();
$a->value = 1;
$b = new Node();
$b->value = 2;
$a->next = $b;
$b->next = $a; // циклическая ссылка
var_dump($a);
?>
object(Node)#1 (2) {
  ["value"]=>
  int(1)
  ["next"]=>
  object(Node)#2 (2) {
    ["value"]=>
    int(2)
    ["next"]=>
    *RECURSION*
  }
}

Пояснение: PHP предотвращает бесконечную рекурсию, помечая повторяющийся объект как *RECURSION*.

Пример 3: var_dump с глубоким массивом и настройкой максимальной глубины (только с Xdebug).

Пример

<?php
// При установленном Xdebug можно задать глубину
ini_set('xdebug.var_display_max_depth', 2);
$deep = [1 => [2 => [3 => [4 => 'very deep']]]];
var_dump($deep);
?>
array(1) {
  [1]=>
  array(1) {
    [2]=>
    array(1) {
      ...
    }
  }
}

Примечание: без Xdebug var_dump выводит все уровни, но может потреблять много памяти.

Пример 4: Использование ob_start и var_dump для записи в лог.

Пример

<?php
$userInput = ['username' => 'admin', 'password' => '123456'];
ob_start();
var_dump($userInput);
$dumpStr = ob_get_clean();
error_log('User input: ' . $dumpStr);
echo 'Дамп записан в лог';
?>

Результат в error.log: User input: array(2) { ["username"]=> string(5) "admin" ["password"]=> string(6) "123456" }

Пример 5: Сравнение var_dump и var_export для восстановления данных.

Пример

<?php
$original = ['host' => 'localhost', 'db' => 'test'];
$exportCode = var_export($original, true);
eval('$restored = ' . $exportCode . ';');
var_dump($restored);
// Выведет то же самое
?>
array(2) {
  ["host"]=>
  string(9) "localhost"
  ["db"]=>
  string(4) "test"
}

Внимание: использование eval небезопасно, если данные приходят из внешнего источника.

Пример 6: Вывод дампа ресурса (например, файлового дескриптора).

Пример

<?php
$fh = fopen(__FILE__, 'r');
var_dump($fh);
fclose($fh);
?>
resource(5) of type (stream)

Пояснение: виден идентификатор ресурса и его тип. Данные самого потока не отображаются.

Пример 7: var_dump с null, boolean и float.

Пример

<?php
$nullVar = null;
$boolVar = false;
$floatVar = 3.14;
var_dump($nullVar, $boolVar, $floatVar);
?>
NULL
bool(false)
float(3.14)

Примечание: false выводится как bool(false), а 0 – как int(0). Это помогает различать типы.

Пример 8: Ограничение длины вывода для больших строк (только Xdebug).

Пример

<?php
ini_set('xdebug.var_display_max_children', 5); // максимальное количество элементов
$bigArray = range(1, 100);
var_dump($bigArray);
?>
array(100) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  ...
}

Цель: предотвращение переполнения браузера или лога при отладке больших массивов.

Пример 9: Использование var_dump с анонимной функцией (closure).

Пример

<?php
$closure = function($x) { return $x * 2; };
var_dump($closure);
?>
object(Closure)#1 (0) {
}

Пояснение: замыкание представлено как объект класса Closure, внутренние свойства не раскрываются.

Пример 10: Дамп результата вызова функции, возвращающей массив.

Пример

<?php
function getInfo() {
    return ['status' => 'ok', 'code' => 200];
}
var_dump(getInfo());
?>
array(2) {
  ["status"]=>
  string(2) "ok"
  ["code"]=>
  int(200)
}

Совет: такой подход позволяет быстро проверить возвращаемые данные без создания дополнительной переменной.

var_dump - вывод информации о переменной - comments

En
Var dump php (php)