什么是包含对自身的引用的数组?数组/对象中的循环引用是什么?如何在PHP中序列化这样的实体?

时间:2017-12-06 01:31:05

标签: php arrays serialization reference circular-reference

在阅读内置函数serialize()的手册页时,我看到以下引用文字:

  

您甚至可以序列化()包含对自身的引用的数组。   您正在序列化的数组/对象内的循环引用将   也可以存储。任何其他参考将丢失。

我不明白数组包含对自身的引用意味着什么?

我也不理解数组/对象中的循环引用是什么?

我从上面的文字中唯一理解的是,我可以使用内置函数serialize()

生成此类值的可存储表示

此外,没有更多的代码示例或已就此提供解释。

我用Google搜索了解这些类型实体的含义,但我从谷歌那里得不到任何东西。

有人可以借助于易于理解的解释以及合适的代码示例向我解释这些概念。例子可以让事情变得更好。

1 个答案:

答案 0 :(得分:1)

示例在答案的最后。

在(a)中我们尝试将数组插入其中。但是一个名为copy on write的机制启动,我们将$ a插入到$ a的副本中,最后得到一个包含空数组的数组。 (b)有点棘手。首先,我们创建一个包含对自身的引用的数组,但这意味着$ b本身就是一个引用。然后我们将$ b传递给序列化,但序列化仅接受一个值,因此将创建$ b的副本。输出显示一个数组,其中包含一个包含对自身的引用的数组。 R:2;在输出中表示对第二个数组的引用。由于某些内部原因,计数从1开始而不是0.(如果你真的很感兴趣,我可以查找原因,但对于这个问题,你可以接受它。)

对象行为略有不同。这是因为PHP中的对象是由ID访问的,而写入时的副本只复制ID结构而不是对象本身。在(c)的输出中,您可以看到这是一个小的r。数字如上。但是如(d)所示,你也可以通过引用分配对象,小r将成为大写R.输出与(b)不同,因为虽然$ d将像$ b一样被复制,但它只会影响ID结构,我们看到一个包含对自身的引用的对象。 (e)利用clone关键字创建实际副本并进行序列化。

关于PHP引用的

Further Reading

<?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:{}}

Link来玩。

随意在评论中要求澄清这个问题非常广泛,我试着保持简短。