同一个对象是否总是返回相同的序列化字符串?

时间:2012-01-06 14:16:50

标签: php serialization

当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";
        }
    }
?>

所以要么在不同的连接上有不同的东西导致它们被创建,我的数组看起来是相同的,不知道是不是。

2 个答案:

答案 0 :(得分: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来实现自己的序列化,因此无法保证每次都将相同的对象序列化为相同的字符串(例如,它可能包含时间或柜台等。)。

答案 1 :(得分:2)

序列化字符串是人类可读的。它们可以分解如下:

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

第一个字母是数据类型,数组,数字是对象的长度/大小。所以接下来你有一个0的整数,然后是一个长度为14个字符的字符串。所以现在你可以阅读格式,你能看到任何差异吗?

当我运行你的code on codepad时,它按预期工作。所以也许在这里有更多的东西在你尝试序列化对象的实际代码中。