我想知道为什么我在 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'
?>
我想知道为什么我在 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'
?>
被&
忽略serialize
。
似乎您正在尝试从 to 创建符号表别名(引用)y
,yy
但您不能在此处执行此操作。当您传递&y
给 时serialize
,它不会将传递的值视为引用或在线序列化。此外,它返回一个全新的值,而不是对原始值的引用。您必须单独创建别名:
$yy = &$y;
$yy = unserialize(serialize($y));
我也不确定您要做什么,或者它与序列化有什么关系。
正如 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"
对于对象中的内部引用,它的工作方式相同。