2012-09-25 34 views
2

參考,我想知道爲什麼預期我的PHP序列不起作用:序列化在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

請確實給你的變量命名。當它充滿$ x和$ y時,讀取代碼非常困難 –

+0

您可能[想避免在函數調用中通過引用傳遞參數](http://php.net/manual/en/language.references.pass。 PHP)。 –

回答

6

&serialize忽略。

看起來好像你正在試圖創建一個符號表別名(參考)從yyy,但你不能這樣做。當您通過&yserialize時,它不會將傳遞的值作爲參考或串行化。此外,它返回一個全新的值,而不是對原始值的引用。你將不得不單獨創建別名:

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

我也真的不知道你想要做什麼要麼,或者它與系列化做什麼。

+0

+1很好的答案。意圖看起來像一個深刻的複製黑客。 – Gavin

+1

應該最後一個變量$ yy? – Robbie

0

As Explosion Pills'answer statesunserialize「返回一個全新的值」。然而,序列化將保持「相對」引用。 (從技術上講,PHP中沒有相對引用的東西,但它是將其概念化的一種好方法)。

如果您在數組中收集引用和引用變量,則序列化數組將保存引用關係。它不會保留原始參考,但會在由unserialize返回的新數組的上下文中自動重新創建它。

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

它對於對象中的內部引用的工作方式相同。