序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
10年的漳州网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都营销网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整漳州建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“漳州网站设计”,“漳州网站推广”以来,每个客户项目都认真落实执行。
PHP中的序列化和反序列化分别通过函数serialize()和unserialize()即可实现。serialize()的参数可以是resource类型外的所有变量类型,最常见的是用来序列化对象,unseialize()将serialize的返回结果作为参数,进行反序列化,得到原对象。
简单分析PHP中序列化用法介绍
序列化在我们学习php中都会有用到了对于序列化我们常用的函数有serialize和unserialize了,希望以下这篇文章能够帮助到各位了解到PHP中序列化用法,具体如下:
0x00 序列化函数
serialize():返回带有变量类型和值的字符串
unserialize():想要将已序列化的字符串变回 PHP 的值
测试代码:
?php
class test{
var $a;
var $b;
function __construct($a,$b,$c){
$a = $a;
$this-b = $b;
}
}
class test1 extends test{
function __construct($a){
$this-a = $a;
}
}
$a = 'hello';
$b = 123;
$c = false;
$d = new test('helloa','hellob','helloc');
$e = new test1('hello');
var_dump(serialize($a));
var_dump(serialize($b));
var_dump(serialize($c));
var_dump(serialize($d));
var_dump(serialize($e));
?
运行结果:
string 's:5:"hello";' (length=12)
string 'i:123;' (length=6)
string 'b:0;' (length=4)
string 'O:4:"test":2:{s:1:"a";N;s:1:"b";s:6:"hellob";}' (length=46)
string 'O:5:"test1":2:{s:1:"a";s:5:"hello";s:1:"b";N;}' (length=46)
序列化字符串格式: 变量类型:变量长度:变量内容 。
如果序列化的是一个对象,序列化字符串格式为:
变量类型:类名长度:类名:属性数量:{属性类型:属性名长度:属性名;属性值类型:属性值长度:属性值内容}
将上述结果反序列化输出,执行结果:
string 'hello' (length=5)
int 123
boolean false
object(test)[1]
public 'a' = null
public 'b' = string 'hellob' (length=6)
object(test1)[1]
public 'a' = string 'hello' (length=5)
public 'b' = null
0x01 对象序列化
当序列化对象时,PHP 将在序列动作之前调用该对象的成员函数 sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用 wakeup()成员函数。
在serialize()函数执行时,会先检查类中是否定义了 sleep()函数,如果存在,则首先调用 sleep()函数,如果不存在,就保留序列字符串中的所有属性。
在unserialize()函数执行时,会先检查是否定义了 wakeup()函数。如果 wakeup()存在,将执行__wakeup()函数,会使变量被重新赋值。
serialize()测试代码:
?php
class test{
var $a;
var $b;
function __construct($a,$b,$c){
$this-a = $a;
$this-b = $b;
}
function __sleep(){
echo "b has changed"."\n";
$this-b = 'hib';
return $this-b;
}
function __wakeup(){
echo "a has changed"."\n";
$this-a = 'hia';
}
}
class test1 extends test{
function __construct($a){
$this-a = $a;
}
}
$d = new test('helloa','hellob','helloc');
$e = new test1('hello');
serialize($d);
serialize($e);
var_dump($d);
var_dump($e);
?
执行结果:
b has changed b has changed
object(test)[1]
public 'a' = string 'helloa' (length=6)
public 'b' = string 'hib' (length=3)
object(test1)[2]
public 'a' = string 'hello' (length=5)
public 'b' = string 'hib' (length=3)
unserialize()测试代码:
class test{
var $a;
var $b;
function __construct($a,$b,$c){
$this-a = $a;
$this-b = $b;
}
function __sleep(){
echo "b has changed"."\n";
$this-b = 'hib';
return $this-b;
}
function __wakeup(){
echo "a has changed"."\n";
$this-a = 'hia';
}
}
class test1 extends test{
function __construct($a){
$this-a = $a;
}
}
$d = 'O:4:"test":2:{s:1:"a";N;s:1:"b";s:6:"hellob";}' ;
把复杂的数据类型压缩到一个字符串中
serialize() 把变量和它们的值编码成文本形式
unserialize() 恢复原先变量
eg:
结果:a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}
Array ( [0] = Moe [1] = Larry [2] = Curly )
当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:
margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。
如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:
如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:
当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。