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

问题描述 投票:0回答:2

我正在使用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开发人员,我是否有必要了解上面的输出,或者我是否应该直接使用此输出而不进入其详细信息?

请指导我这方面。

php serialization representation storable
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如何序列化,但如果你很好奇,上面的解释将有助于理解它有一些逻辑。我希望这有帮助。


1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.