在PHP中序列化一个引用

4
我想知道为什么我的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'
?>

5
请合理命名变量,当代码中充斥着 $x 和 $y 时,阅读起来非常困难。 - Madara's Ghost
你可能想要避免在函数调用中通过引用传递参数。 - Stephen M. Harris
2个回答

6
serialize 方法忽略 & 符号。看起来你正在尝试从 yyy 创建符号表别名(引用),但在此处无法执行此操作。当你将 &y 传递给 serialize 时,它不会将传递的值视为引用或进行内联序列化。此外,它返回一个全新的值,而不是对原始值的引用。你必须单独创建别名。
$yy = &$y;
$yy = unserialize(serialize($y));

我也不太确定你试图做什么,或者它与序列化有什么关系。


1
那个最后的变量应该是 $yy 吗? - Robbie

2
根据Explosion Pills的回答statesunserialize“返回一个全新的值”。然而,序列化将保持“相对”的引用关系。(在PHP中,技术上不存在相对引用,但这是一种很好的概念化方法。)如果您将被引用和引用变量收集到一个数组中,则对该数组进行序列化将保存引用关系。它不会维护原始引用,但会自动在unserialize返回的新数组的上下文中重新创建它。
$vars = array();
$vars['x'] = 'initval';
$vars['xref'] =& $vars['x'];
$vars2 = unserialize( serialize( $vars ) );
$vars2['x'] = 'newval';
echo $vars2['xref']; // prints "newval"

它在对象内部引用方面的工作方式相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接