在阅读内置函数上的手动页面 serialize()
上时,我遇到了以下引号:
您甚至可以 serialize()包含自身引用的数组。 您要序列化的数组/对象内的圆形引用将 也存储。任何其他参考都将丢失。
我不了解包含对自己引用的数组是什么意思?
我也不了解数组/对象内的循环引用是什么?
我从上面的文本中唯一了解的是,我可以使用内置函数serialize()
此外,此方面没有更多的代码示例或解释。
我谷歌搜索以了解这些类型的实体的含义,专门在PHP中,但我从Google那里却一无所获。
有人可以在易于理解的解释的帮助下与合适的代码示例一起向我解释这些概念。示例将使事情变得更好。
示例在答案的末尾。
在(a)中,我们尝试将数组插入自身。但是,在写入启动时称为复制的机制,我们将$ a插入$ a的副本中,最终插入包含空数组的数组。(b)有点棘手。首先,我们创建一个包含对自身的引用的数组,但这意味着$ b本身将是参考。然后,我们通过$ b序列化,但序列化仅接受一个值,因此将创建$ b的副本。输出显示包含包含对自身引用的数组的数组。R:2;在输出中指示对第二个数组的引用。由于某些内部原因,计数从1而不是0开始。(如果您真的有兴趣,我可以查找原因,但是对于这个问题,您可以接受)。
对象行为有些不同。这是因为PHP中的对象是由一个ID访问的,而写入的副本仅复制ID结构而不是对象本身。在(c)的输出中,您可以看到这是一个小r。数字与上述一样。但是如(d)所示,您也可以通过参考分配对象,而小r将成为资本R。输出与(b)不同,因为$ d会像$ b一样复制$ b,它再次影响ID结构,我们看到一个包含对自身的参考的对象。(e)利用克隆的关键字创建实际副本并因此序列化。
进一步阅读有关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:{}}
链接到处玩。
随时在评论中要求澄清这个问题非常广泛,我试图简短。