PHP

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

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

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

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

print_r($array);
Array
(
[name] => frank
[0] => 12
=> Array
(
[0] => 3
=> 4
)
)
var_dump($array);
array(3) {
["name"]=>
string(5) "frank"
[0]=>
int(12)
=>
array(2) {
[0]=>
int(3)
=>
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.
Теги:
array, string, friend, username, print, функции, Array , Bloom, Bialystock, вместо, RECURSION, функция, продолжает, Accountant , сценария, печатает, Функция, вывода, ссылки, Bloom , Вывод, выдает, ошибку, слово, дампа, frank, массив, функцию, результаты, поэтому, сохранить, печатки, массиву, обращения, ссылку
Добавлено: 21 Июля 2018 12:47:34 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...