3

我想知道为什么我在 php 中的序列化不能按预期工作:

<?
$x = "whatever...";
$y = array(&$x, "test, 1-2, 1-2...", &$x);
$yy = unserialize(serialize(&$y));
$y[0] = "blah";
echo($yy[0]); // prints 'whatever', was expecting 'blah'
?>
4

2 回答 2

6

&忽略serialize

似乎您正在尝试从 to 创建符号表别名(引用)yyy但您不能在此处执行此操作。当您传递&y给 时serialize,它不会将传递的值视为引用或在线序列化。此外,它返回一个全新的值,而不是对原始值的引用。您必须单独创建别名:

$yy = &$y;
$yy = unserialize(serialize($y));

我也不确定您要做什么,或者它与序列化有什么关系。

于 2012-09-25T20:45:06.783 回答
1

正如 Explosion Pills 的回答所说unserialize“返回一个全新的值”。 但是,序列化将保持“相对”引用。 (从技术上讲,PHP 中没有相对引用这样的东西,但它是一种概念化它的好方法。)

如果你在一个数组中收集你的引用和引用变量,序列化数组将保存引用关系。它不会保留原始引用,但会在unserialize.

$vars = array();
$vars['x'] = 'initval';
$vars['xref'] =& $vars['x'];
$vars2 = unserialize( serialize( $vars ) );
$vars2['x'] = 'newval';
echo $vars2['xref']; // prints "newval"

对于对象中的内部引用,它的工作方式相同。

于 2013-05-22T19:09:50.017 回答