Получение дампа содержимого переменных в виде строк

Задача
Необходимо проверить значения, хранимые в переменных. Это может быть вложенный массив или объект, поэтому нельзя просто распечатать его и пройтись по нему в цикле.

Решение
Для этого следует применять функцию print_r() или функцию var_dump():

$array = array("name" => "frank", 12, array(3, 4));

print_r($array);
Array
(
[name] => frank
[0] => 12
[1] => Array
(
[0] => 3
[1] => 4
)
)
var_dump($array);
array(3) {
["name"]=>
string(5) "frank"
[0]=>
int(12)
[1]=>
array(2) {
[0]=>
int(3)
[1]=>
int(4)
}
}

Обсуждение
Вывод функции print_r() короче и его легче читать. Однако вывод функции var_dump() содержит типы данных и длину каждой переменной.

Эти функции работают с переменными рекурсивно, поэтому если внутри переменной есть ссылки на саму себя, то в результате можно получить бесконечный цикл. Хотя обе функции сами умеют избегать бесконечного вывода значений переменных. Функция print_r() после перво-го вхождения переменной печатает слово *RECURSION* вместо дальнейшего вывода информации об этой переменной и продолжает итерацию для оставшихся данных, которые она должна вывести на печать.


Если функция var_dump() встречает переменную более трех раз, она выдает фатальную ошибку и заканчивает выполнение сценария. Рассмотрим массивы $user_1 и $user_2, ссылающиеся друг на друга посредством элементов friend:

$user_1 = array('name' => 'Max Bialystock',
'username' => 'max');
$user_2 = array('name' => 'Leo Bloom',
'username' => 'leo');
// Макс и Лео – друзья
$user_2['friend'] = &$user_1;
$user_1['friend'] = &$user_2;
// у Макса и Лео есть работа
$user_1['job'] = 'Swindler';
$user_2['job'] = 'Accountant';

Вывод функции print_r($user_2):

Array
(
[name] => Leo Bloom
[username] => leo
[friend] => Array
(
[name] => Max Bialystock
[username] => max
[friend] => Array
(
[name] => Leo Bloom
[username] => leo
[friend] => Array
*RECURSION*
[job] => Accountant
)
[job] => Swindler
)
[job] => Accountant
)

Встретив ссылку на $user_1 второй раз, функция print_r() печатает слово *RECURSION* вместо обращения к массиву. Затем она продолжает свою работу, печатая оставшиеся элементы массивов $user_1 и $user_2.

Встретившись с рекурсией, функция var_dump() ведет себя по-другому:

array(4) {
["name"]=>string(9) "Leo Bloom"
["username"]=>
string(3) "leo"
["friend"]=>
&array(4) {
["name"]=>
string(14) "Max Bialystock"
["username"]=>
string(3) "max"
["friend"]=>
&array(4) {
["name"]=>
string(9) "Leo Bloom"
["username"]=>
string(3) "leo"
["friend"]=>
&array(4) {
["name"]=>
string(14) "Max Bialystock"
["username"]=>
string(3) "max"
["friend"]=>
&array(4) {
["name"]=>
string(9) "Leo Bloom"
["username"]=>
string(3) "leo"
["friend"]=>
&array(4) {
["name"]=>
string(14) "Max Bialystock"
["username"]=>
string(3) "max"
["friend"]=>
&array(4) {
["name"]=>
string(9) "Leo Bloom"
["username"]=>
string(3) "leo"
["friend"]=>
&array(4) {


Fatal error: Nesting level too deep - recursive dependency? in
var-dump.php on line 15


Функция var_dump() останавливает рекурсию еще до четвертого появления ссылки на массив $user_1.


Когда это происходит, она выдает фатальную ошибку и прекращает выдачу дампа переменных (или выполнение сценария).И хотя функции print_r() и var_dump() печатают свои результаты вместо того, чтобы их возвратить, они могут сохранить данные без их рас-
печатки, используя выходной буфер:

ob_start();
var_dump($user);
$dump = ob_get_contents();
ob_end_clean();

Таким образом, результаты функции var_dump($user) помещаются в переменную $dump..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Обмен значениями без временных переменных
Операторы == и =: как избежать путаницы
Сериализация данных сложных типов в виде строки
Совместное использование переменных процессами
Создание динамического имени переменной

Вернуться в раздел: PHP / 5. Переменные