目录
一、序列化的概念
将对象或者数组转化为可存储的字符串
在PHP中使用serialize()函数来将对象或者数组进行序列化,并返回一个包含字节流的字符串来表示。
我们使用类的序列化比较多,所以这里就用一个序列化对象的例子来演示:
<?php
class TEST {
public $data;
private $pass;
public function __construct($data, $pass)
{
$this->data = $data;
$this->pass = $pass;
}
}
$number = 34;
$str = 'user';
$bool = true;
$null = NULL;
$arr = array('a' => 10, 'b' => 200);
$test = new TEST('uu', true);
var_dump(serialize($number));
var_dump(serialize($str));
var_dump(serialize($bool));
var_dump(serialize($null));
var_dump(serialize($arr));
var_dump(serialize($test));
?>
结果:
string(5) "i:34;"
string(11) "s:4:"user";"
string(4) "b:1;"
string(2) "N;"
string(33) "a:2:{s:1:"a";i:10;s:1:"b";i:200;}"
string(57) "O:4:"TEST":2:{s:4:"data";s:2:"uu";s:10:" TEST pass";b:1;}"
所以序列化对于不同类型得到的字符串格式为:
- String: s:size:value;
- Integer: i:value;
- Boolean: b:value;(保存1或0)
- Null: N;
- Array: a:size:{key definition;value definition;(repeated per element)}
- Object: O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}
私有属性的成员变量序列化:
<?php
class TEST {
private $data='私有属性';
function self()
{
echo $this->data;
}
}
$a = new TEST();
echo serialize($a);
?>
结果:
为什么会出现不明符号,因为变量是private的所以序列号的时候会在两侧加入空字节,而且是private属性的变量都会在变量前面加上加上类名。
二、序列化和反序列化的作用:
1、为了有效地存储或传递数据,同时不丢失其类型和结构,经常需要利用序列化和反序列化函数对数据进行处理。
2、反序列化函数返回字符串,此字符串包含了表示值的字节流,可以存储于任何地方
3、反序列化函数对单一的已序列化的变量进行操作,将其转换成员来的值
3、这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性
PHP语言中常用的序列化和反序列化函数有serialize、unserialize、json_encode、json_decode
有些很简单的比喻也可以去了解到,方便理解。
三、PHP序列化函数
serialize函数
序列化是将变量或对象转换成字符串的过程。
举例:
<?php
class LOL {
public $name = '滑板鞋'; //放在类外为变量 //放在类内为成员属性
private $sex = '女';
protected $jn = '拔毛';
function xixue () {
echo $this->name;// $this 是在当前类里调用
echo $this->jn;
}
}
$a = new LOL();
print_r($a);
echo PHP_EOL; //把LOL实体化后的对象a,输出
echo serialize($a);
输出:
LOL Object
(
[name] => 滑板鞋
[sex:LOL:private] => 女
[jn:protected] => 拔毛
)
O:3:"LOL":3:{s:4:"name";s:9:"滑板鞋";s:8:" LOL sex";s:3:"女";s:5:" * jn";s:6:"拔毛";}
四、各种数据类型序列化后的效果
(1) NULL的序列化
在PHP中,NULL被序列化为N。
<?php
$str=NULL;
$xl_str=serialize($str);
print_r($xl_str);
?>
输出:
N;
(2) Boolean型数据的序列化
Boolean型数据被序列化成b:。其中,表示0或1。当boolean型数据为false时,为0,否则为1
<?php
$str1=true;
$str2=false;
$xl_str1=serialize($str1);
$xl_str2=serialize($str2);
print_r($xl_str1);
echo PHP_EOL;
print_r($xl_str2);
?>
输出:
b:1;
b:0;
(3) Integer型数据的序列化
Interger型(整型)数据被序列化为i:.其中为一个整型数,范围为:-2147483648——2147483647,如果被序列化的数字超过这个范围,则会被序列化为浮点型而不是整型。如果序列化后的数字超过这个范围,则反序列化时不会反悔期望的数值(PHP本身序列化时不会发生这个问题)
<?php
$str1=123;
$xl_str1=serialize($str1);
print_r($xl_str1);
?>
输出:
i:123;
(4)Double型数据的序列化
Double型Double型(浮点型)数据被序列化为d:。其中为一个浮点数,其范围与PHP的浮点数范围一样,可以表示成整数形式、浮点数形式和科学计数法形式。如果序列化无穷大,则为INF;如果序列化负无穷大则为-INF。如果序列化后的数字超过PHP能表示的最大值,则反序列化时返无穷大(INF);如果如果序列化的数据为非数字,则被序列化为NAN,NAN反序列化时返回0,其他语言可以将NAN反序列化为相应的语言所支持的NAN表示形式数据的序列化。
<?php
$double1=1.23;
$xl_str1=serialize($double1);
print_r($xl_str1);
?>
输出:
d:1.23;
(5) String型数据的序列化
String型(字符串型)数据序列化为s:<length>:"<value>"
<?php
$str1="test xiaohua";
$xl_str1=serialize($str1);
print_r($xl_str1);
?>
输出:
s:12:"test xiaohua";
(6) 数组的序列化
数组序列化通常被序列化为
a:<n>:{<key 1><value 1><key 2><value 2><key3><value 3><key 4><value 4>…}
<n>表示数组个数
<key>表示数组下标
<value>表示与下标相对应的数组元素值
<?php
$shu=array('xiaohua1','xiaohua2','xiaohua3');
$xl_str1=serialize($shu);
print_r($xl_str1);
?>
输出:
a:3:{i:0;s:8:"xiaohua1";i:1;s:8:"xiaohua2";i:2;s:8:"xiaohua3";}
(7) 对象的序列化
对象通常被序列化称:
O:<length>:"<class name>":<n>:{<field name 1><field value 1><field name 2><field value 2>...<field name n><field value n>}
<length>:对象类名字符串长度
<class name>:对象的类名
<n>:对象中字段数 包括var、protected、private、public声明的字段,不包括static和const声明的静态字符串
<field name 1><field value 1>:每个字段对应的每个字段名
<?php
class xiaohua{
public $str='xiaohua';
public $str2="huahua";
function Func(){
print("this is Func''");
}
}
$aaa=new xiaohua;
$se=serialize($aaa);
print $se;
?>
输出:
O:7:"xiaohua":2:{s:3:"str";s:7:"xiaohua";s:4:"str2";s:6:"huahua";}
解读:O表示对象,7是字段长度,对象内容为xiaohua,2表示xiaohua对象有两个成员属性。s表示字符串类型,3是字段值长度 字段名称是str。s表示字符串7表示字段值长度 字段名称是xiaohua