不过很不幸的是,PHP 对数组的序列化犯了一个错误,虽然数组本身在传递时也是对象引用传递,但是在序列化时,PHP 似乎忘记了这一点,看下面的例子:
echo "<pre>"; $a = array(); $a[1] = 1; $a["value"] = $a; echo $a["value"]["value"][1]; echo "\n"; $a = unserialize(serialize($a)); echo $a["value"]["value"][1]; echo "</pre>"; |
结果是:
1 |
大家会发现,将原数组序列化再反序列化后,数组结构变了。原本 $a["value"]["value"][1] 中的值 1,在反序列化之后丢失了。
原因是什么呢?让我们输出序列化之后的结果来看一看:
$a = array(); $a[1] = 1; $a["value"] = $a; echo serialize($a); |
结果是:
a:2:{i:1;i:1;s:5:"value";a:2:{i:1;i:1;s:5:"value";N;}} |
原来,序列化之后,$a["value"]["value"] 变成了 NULL,而不是一个对象引用。
也就是说,PHP 只对对象在序列化时才会生成对象引用标示(r)。对所有的标量类型和数组(也包括 NULL)序列化时都不会生成对象引用。但是如果明确使用了 & 符号作的引用,在序列化时,会被序列化为指针引用标示(R)。