Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

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

Решение

Для этого следует применять функцию 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) {
<br />
<b>Fatal error</b>: Nesting level too deep recursive dependency? in
<b>var dump.php</b> on line <b>15</b><br />

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

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

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

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

См. также

документацию по функции print_r() на http://www.php.net/ print-r и по функции var_dump() на http://www.php.net/var-dump.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ