2012-01-06 30 views
2

當php返回一個序列化的字符串時,它只依賴於輸入值還是在外部源(環境)中播放任何部分?同一個對象應該總是返回相同的序列化字符串嗎?

我問這個問題的原因是,我看到一些我認爲相同的數組,每次會話的序列化略有不同。

我寫這這表明他們總是在同一個會話中的相同:

<?php 
    $arr = array("something here", "foo" => "something else", "bar" => array("nested" => "temp", 5232), 3434); 

    $s = serialize($arr); 

    for($i = 1; $i <= 100; $i++) 
    { 
     $s2 = serialize($arr); 
     if($s2 != $s) 
     { 
      echo "They are not always the same"; 
      break; 
     } 
     if($i == 100) 
     { 
      echo "They are always the same"; 
     } 
    } 
?> 

因此,無論有什麼東西使他們可以在不同的連接,我的陣列出現以不同的方式創建以某種方式不相同。

+0

你可以發佈不同的序列化數組字符串嗎? – Yogu 2012-01-06 14:20:53

回答

2

序列化的字符串是人類可讀的。他們可以細分如下:

a:2:{i:0;s:14:"something here";} 

第一個字母是數據類型,數組,數字是對象的長度/大小。接下來你有一個0的整數,然後是一個長度爲14個字符的字符串。所以現在你可以閱讀格式你能看到任何差異?

當我運行code on codepad時,它按預期工作。所以也許在這裏玩的更多,就像你試圖序列化一個對象的實際代碼一樣。

+0

你對序列化如何工作的解釋導致了我對問題的解釋,相同的值實際上是一個「s:1」中的字符串,而另一個「d:1」中是一個數字/數字, – 2012-01-06 14:57:23

4

考慮下面的例子:

$array1 = array('foo' => 'bar', 'baz' => 'quux'); 
$array2 = array('baz' => 'quux', 'foo' => 'bar'); 

var_dump($array1 == $array2); 
var_dump(serialize($array1) == serialize($array2)); 

所以陣列,其是相等的(不嚴格的比較)可能未必能得到相同的序列化。但是如果你要對數組進行排序,他們會給出相同的序列化;環境/平臺等不影響結果。

在一般情況下,類可以實現自己的序列化,無論是使用舊__sleep() and __wakeup()implementing Serializable,所以沒有保證相同的對象序列化到相同的字符串每次(例如,它可能包括時間或計數器等)。

+0

+1這是對我的更好的答案。 – Treffynnon 2012-01-06 14:34:01

+1

+1好的答案,在我的情況下它在調試時輸出相同,但數據類型實際上是不同的,如:array(「foo」=> 7)'''array(「foo」=>「7」)' – 2012-01-06 15:15:20

+0

這是一個更簡單的用例,沒有想到! – cmbuckley 2012-01-06 16:52:38

相關問題