作为 PHP 开发人员,我是否有必要了解 serialize() 生成值的可存储表示的方式?

As a PHP developer, is it necessary for me to understand the way serialize() generates the storable representation of a value?

我正在使用 PHP 7.1.12 并且我正在尝试了解 [=40] 中最重要的内置函数之一的功能=] 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 开发者,我是否有必要理解上面的输出,或者我应该直接使用这个输出而不去深入了解它的细节?

请指导我这方面的知识。

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

字符串

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是如何序列化的,但是如果你很好奇,上面的解释会帮助你理解它是有逻辑的。希望对您有所帮助。

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

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

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

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