Какие массивы содержат ссылки на себя? Что такое циклические ссылки внутри массива / объекта? Как сериализовать такие сущности в PHP?

Во время чтения страницы руководства по встроенной функции serialize() Я наткнулся на следующий цитируемый текст:

Вы можете даже сериализации () массивы, которые содержат ссылки на себя.
Циклические ссылки внутри массива / объекта, который вы сериализуете, будут
также храниться Любая другая ссылка будет потеряна.

Я не поняла что означает массив, содержащий ссылки на себя?

Я тоже не поняла что такое циклические ссылки внутри массива / объекта?

Единственное, что я понял из приведенного выше текста, это то, что я могу генерировать хранимое представление таких типов значений, используя встроенную функцию serialize()

Кроме того, больше нет примеров кода или дано объяснение по этому поводу.

Я погуглил, чтобы понять значение этих типов сущностей конкретно в PHP, но ничего не получил от Google.

Может кто-нибудь, пожалуйста, объясните мне эти понятия с помощью простого для понимания объяснения, сопровождаемого подходящими примерами кода. Примеры помогут понять вещи лучше.

2

Решение

Примеры в конце ответа.

В (а) мы пытаемся вставить массив в себя. Но включается механизм копирования при записи, и мы вставляем $ a в копию $ a и получаем массив, который содержит пустой массив. (б) немного сложно. Сначала мы создаем массив, который содержит ссылку на себя, но это означает, что $ b сама будет ссылкой. Затем мы передаем $ b для сериализации, но serialize принимает только значение и, таким образом, создает копию $ b. Вывод показывает массив, который содержит массив, который содержит ссылку на себя. R: 2; в выводе указывается ссылка на второй массив. По какой-то внутренней причине счет начинается с 1, а не с 0. (Если вы действительно заинтересованы, я мог бы найти причину, но для этого вопроса вы можете просто принять его).

Объект действует немного иначе. Это связано с тем, что объекты в PHP доступны по идентификатору, а копия при записи дублирует только структуру идентификатора, а не сам объект. В выводе (c) вы можете видеть, что это на маленькое значение r. Номер такой же, как указано выше. Но, как видно из (d), вы также можете назначать объекты по ссылке, и маленький r станет заглавной R. Выходные данные отличаются от (b), поскольку, хотя $ d будет копироваться так же, как и $ b, это снова влияет только на структуру идентификатора. и мы видим объект, который содержит ссылку на себя. (e) использует ключевое слово clone для создания фактической копии и сериализации как таковой.

Дальнейшее чтение о ссылках на PHP.

<?php

$a = [];
$a[] = $a;
echo "\na: ".serialize($a);

$b = [];
$b[] =& $b;
echo "\nb: ".serialize($b);

$c = new stdClass();
$c->c = $c;
echo "\nc: ".serialize($c);

$d = new stdClass();
$d->d =& $d;
echo "\nd: ".serialize($d);

$e = new stdClass();
$e->e = clone $e;
echo "\ne: ".serialize($e);

Выход:

a: a:1:{i:0;a:0:{}}
b: a:1:{i:0;a:1:{i:0;R:2;}}
c: O:8:"stdClass":1:{s:1:"c";r:1;}
d: O:8:"stdClass":1:{s:1:"d";R:1;}
e: O:8:"stdClass":1:{s:1:"e";O:8:"stdClass":0:{}}

Ссылка на сайт поиграть с.

Не стесняйтесь просить разъяснений в комментариях, вопрос довольно широкий, и я постарался сделать его кратким.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]