php反序列化--1--PHP序列化

目录

一、什么是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";}}

 说明:

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

midsummer_woo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值