当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 :(得分: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时,它按预期工作。所以也许在这里有更多的东西在你尝试序列化对象的实际代码中。