Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 同一对象是否应始终返回相同的序列化字符串?_Php_Serialization - Fatal编程技术网

Php 同一对象是否应始终返回相同的序列化字符串?

Php 同一对象是否应始终返回相同的序列化字符串?,php,serialization,Php,Serialization,当php返回一个序列化字符串时,它是只依赖于输入值还是外部源(环境)起作用 我问这个问题的原因是,我看到一些我认为相同的数组在每个会话中序列化时略有不同 我写的这篇文章表明,在同一个会话中,它们总是相同的: <?php $arr = array("something here", "foo" => "something else", "bar" => array( "nested" => "temp", 5232), 3434); $s = serial

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


因此,要么是某些原因导致它们在不同的连接上创建的方式不同,要么是我的数组看起来完全相同,但却不尽相同。

请考虑以下示例:

$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”)
这是一个更简单的用例,没想到!