0

我正在使用PHP 7.1.12,我正在尝试了解 PHP 中最重要的内置函数之一的功能serialize()

我知道它serialize()用于生成传递给它的值的可存储表示。

我认为这意味着serialize()使用其内部功能将接收到的值转换为一些字符串。这是我的看法正确serialize()吗?

考虑下面的代码:

<?php

$a = [];
$a[] = $a;
echo "\na: ".serialize($a);

$b = [];
$b[] =& $b;
echo "\nb: ".serialize($b);

输出 :

a: a:1:{i:0;a:0:{}}
b: a:1:{i:0;a:1:{i:0;R:2;}}

在输出中,我无法理解字母i、a、R从何处进入输出。另外,我无法理解这个输出是如何形成的serialize()

所以,我的问题是;作为一名 PHP 开发人员,我是否有必要了解上面的输出,或者我应该直接使用这个输出而不涉及它的细节?

请在这方面指导我。

4

2 回答 2

1

以下是对这些字符含义的一般解释。

细绳

s:size:value;

整数

i:value;

布尔值

b:value; (store '1' or '0')

空值

N;

大批

a:size:{key definition;value definition;(repeated per element)}

目的

O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}

我们不需要知道 PHP 是如何序列化的,但是如果你很好奇,上面的解释将有助于理解其中的一些逻辑。我希望这有帮助。

于 2017-12-19T05:22:01.953 回答
1

PHP 序列化格式的另一个特点是它会正确地保留引用:这里的重要部分是 R:2;元素。它的意思是“引用第二个值。由于 PHP 中的对象表现出类似引用的行为,序列化还确保相同的对象出现两次在反序列化时确实是同一个对象:

$b = [];
$b[] =& $b;
echo "\nb: ".serialize($b);

output:b: a:1:{i:0;a:1:{i:0;R:2;}}

整个数组是第一个值,第一个索引是第二个值,所以这就是引用的内容。

于 2017-12-19T05:39:53.070 回答