目录
一、什么是php序列化?
二、在php中怎么进行序列化?
三、不同数据类型的序列化后的表达方式
1、空-NULL
2、整形
3、浮点型
4、boolean型
5、字符型
6、数组
7、对象序列化-公有修饰符
8、对象序列化-私有修饰符
9、对象序列化-保护修饰符
10、对象中调用对象的序列化
一、什么是php序列化?
序列化(Serialization)是将对象的状态信息(属性)转换为可以存储或传输的形式的过程。
将对象或数组转化为可存储/传输的字符串
二、在php中怎么进行序列化?
使用函数serialize()来将对象或者数组进行序列化,并返回一个包含字节流的字符串来表示。
三、不同数据类型的序列化后的表达方式
1、空-NULL
代码:
<?php
$s=null;
echo serialize($s);
?>
结果 :
N;
2、整形
代码:
<?php
$s=123;
echo serialize($s);
?>
结果:
i:123;
说明:
i代表int:123代表内容;
3、浮点型
代码:
<?php
$s=123.11;
echo serialize($s);
?>
结果:
d:123.11;
说明:
d代表double:123.11代表内容;
4、boolean型
<?php
$s=true;
$u=false;
echo serialize($s);
echo serialize($u);
?>
b:1;b:0;
说明:
b代表boolean:1代表为true;
b代表boolean:0代表为false;
5、字符型
<?php
$s='summer';echo serialize($s);
?>
s:6:"summer";
说明:6代表了后边字符串的长度,因为若字符串$s="s""unmmer"无法判断哪个"是字符串哪个是代码,所以需要靠前边数值确定字符串的长度。
s代表string:6字符串长度:"summer字符串内容";
6、数组
<?php
$s=array('spring','summer','autumn','winter');
echo serialize($s);?>
a:4:{i:0;s:6:"spring";i:1;s:6:"summer";i:2;s:6:"autumn";i:3;s:6:"winter";}
说明:php数组下标默认是从0开始
aarray:4数组中的元素个数:{i:0数组中第1个元素;s第1个元素的数据类型string:6第1个元素数据长度:"spring第1个元素数据内容";i:1数组中第2个元素;s第2个元素的数据类型string:6第2个元素数据长度:"summer第2个元素数据内容";i:2数组中第3个元素;s第3个元素的数据类型string:6第4个元素数据长度:"autumn第3个元素数据内容";i:3数组中第4个元素;s第4个元素的数据类型string:6第4个元素数据长度:"winter第4个元素数据内容";}
7、对象序列化-公有修饰符
只序列化成员属性,不序列化成员方法
<?php
class summer{
public $s='spring'; #定义了一个成员属性-s,并赋值为spring
public $u='chuntian';
function winter(){#定义了一个名为winter的成员方法
echo $this->s; #把s的方法输出出来
}
}
$a = new summer(); #summer类实例化成一个对象赋值给a
echo serialize($a) #把a序列化并展示出来?>
结果:
O:6:"summer":2:{s:1:"s";s:6:"spring";s:1:"u";s:8:"chuntian";}
说明:
O表示“Object”,在面向对象编程中译作“对象”:6表示类名的长度:"summer类名":2表示类中属性的个数:{s表示第1个属性名称为string类型:1表示第1个属性名称长度:"s第1个属性名称的内容";s表示第1个属性内容为string类型:6表示第1个属性内容长度:"spring第1个属性内容";s表示第2个属性名称为string类型:1表示第2个属性名称长度:"u第2个属性名称的内容";s表示第2个属性内容为string类型:8表示第2个属性内容长度:"chuntian第2个属性内容";}
8、对象序列化-私有修饰符
代码:
<?php
class summer{
public $s='spring'; #定义了一个成员属性-s,并赋值为spring
private $u='chuntian';
function winter(){#定义了一个名为winter的成员方法
echo $this->s; #把s的方法输出出来
}
}
$a = new summer(); #summer类实例化成一个对象赋值给a
echo serialize($a) #把a序列化并展示出来?>
结果:
O:6:"summer":2:{s:1:"s";s:6:"spring";s:9:"summeru";s:8:"chuntian";}
说明:
O表示“Object”,在面向对象编程中译作“对象”:6表示类名的长度:"summer类名":2表示类中属性的个数:{s表示第1个属性名称为string类型:1表示第1个属性名称长度:"s第1个属性名称的内容";s表示第1个属性内容为string类型:6表示第1个属性内容长度:"spring第1个属性内容";s表示第2个属性名称为string类型:9表示第2个属性名称长度:"summeru第2个属性名称的内容";s表示第2个属性内容为string类型:8表示第2个属性内容长度:"chuntian第2个属性内容";}
注:
可以看到私有修饰符定义的变量序列化后的名称长度和"summeru"的长度不同,且属性名称也与代码中的不同。
其中属性名称变成了"summeru" --属性从public变成private后,属性名称就变成 类名 + 属性名称
同时看出来长度也多出两个字符,那是因为私有属性中,长度为9的summeru其实在summer的首尾拥有两个空位,分别各占取一个字符串长度,summeru真实情况下应该写作 %00summer%00u,多出的两个字符串长度就是这两个%00。
实际保护属性名称为:空格 + 类名 + 空格 + 属性名称。(其中空格并不是真正的空格,是一个占一个字符串长度的特殊字符)
URL编码为:%00 +类名 + %00 + 属性名称。
9、对象序列化-保护修饰符
代码:
<?php
class test{
protected $pub='benben';
function jineng(){
echo $this->pub;
}
}
$a = new test();
echo serialize($a);
?>
结果:
O:4:"test":1:{s:6:"*pub";s:6:"benben";}
说明:
名称pub前多出一个*,并且名称长度也与实际观察到的长度不符合,多出了两个字符串长度。
特别说明:保护属性中多出的两个字符串长度:
实际保护属性名称为:空格 + * + 空格 + 属性名称。(其中空格并不是真正的空格,是一个占一个字符串长度的特殊字符)
URL编码为:%00 + * + %00 + 属性名称。
10、对象中调用对象的序列化
代码:
<?php
class summer{
public $s='spring'; #定义了一个成员属性-s,并赋值为spring
function winter(){#定义了一个名为winter的成员方法
echo $this->s; #把s的方法输出出来
}
}
class summer2{
var $u;
}
$b = new summer();
$a = new summer2();
$a->u =$b;
echo serialize($a) #把a序列化并展示出来?>
结果:
O:7:"summer2":1:{s:1:"u";O:6:"summer":1:{s:1:"s";s:6:"spring";}}
说明: