Php 同一对象是否应始终返回相同的序列化字符串?
当php返回一个序列化字符串时,它是只依赖于输入值还是外部源(环境)起作用 我问这个问题的原因是,我看到一些我认为相同的数组在每个会话中序列化时略有不同 我写的这篇文章表明,在同一个会话中,它们总是相同的:Php 同一对象是否应始终返回相同的序列化字符串?,php,serialization,Php,Serialization,当php返回一个序列化字符串时,它是只依赖于输入值还是外部源(环境)起作用 我问这个问题的原因是,我看到一些我认为相同的数组在每个会话中序列化时略有不同 我写的这篇文章表明,在同一个会话中,它们总是相同的: <?php $arr = array("something here", "foo" => "something else", "bar" => array( "nested" => "temp", 5232), 3434); $s = serial
<?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";
}
}
?>
因此,要么是某些原因导致它们在不同的连接上创建的方式不同,要么是我的数组看起来完全相同,但却不尽相同。请考虑以下示例:
$array1 = array('foo' => 'bar', 'baz' => 'quux');
$array2 = array('baz' => 'quux', 'foo' => 'bar');
var_dump($array1 == $array2);
var_dump(serialize($array1) == serialize($array2));
因此,相等的数组(非严格比较)可能不一定提供相同的序列化。但是如果要对数组进行排序,它们将提供相同的序列化;环境/平台等不会影响结果
通常,类可以使用old或by实现它们自己的序列化,因此不能保证每次都将同一对象序列化为同一字符串(例如,它可能包括时间或计数器等)。序列化的字符串是人类可读的。它们可以细分如下:
a:2:{i:0;s:14:"something here";}
第一个字母是数据类型,数组,数字是对象的长度/大小。接下来是一个0的整数,然后是一个长度为14个字符的字符串。现在你可以阅读格式了,你能看到有什么不同吗
当我运行你的程序时,它按预期工作。因此,这里可能还有更多类似于您试图序列化对象的实际代码。您可以发布不同的序列化数组字符串吗?您对序列化工作原理的解释让我直截了当地指出了这个问题,相同的值实际上是一个“s:1”中的字符串和另一个“d:1”中的数字/位数+1很好的答案,在我的例子中,它在调试时输出相同的数据,但数据类型实际上不同,比如:
array(“foo”=>7)
和array(“foo”=>“7”)
这是一个更简单的用例,没想到!