php反序列化基础知识一

php 反序列化知识

什么是php序列化?

php序列化是将 对象,字符串,数组,常见数据类型转换为一种可存储的字符串格式类型。
平时最常见的就是将对象Object进行序列化,在php序列化中使用serialize() 函数进行序列化,unserizlize()函数进行反序列化。

如下,一个简单的demo1对象序列化及反序列化后的结果
代码

<?php
class demo1{
    public $k="k1";
    public $a1;
    public $num=1;
    public  function f1($var){
        echo $var;
    }
}
$c2=new demo1();
echo(serialize($c2));//序列化demo1对象
echo "\n";
var_dump(unserialize(serialize($c2)));//反序列化
?>

输出
在这里插入图片描述

对整型,字符串,数组进行序列化

<?php
$Int=999;
echo(serialize($Int));//序列化整形
echo "\n";
$str1="test";
echo(serialize($str1)); //序列化字符串
echo "\n";
$arr=[10,20.1,"30"];
echo(serialize($arr));//序列化数组
?>

输出
在这里插入图片描述

在上面的序列化结果中 i:999 ,i 表示Integer类型,数值是999;s:4:“test” 中,s表示是字符串类型,4是表示字符串值长度为4,最后的"test" 是字符串的值。
数组序列化 a:3:{i:0;i:10;i:1;d:20.100000000000001;i:2;s:2:“30”;},开头的a表示是array数组类型,3 表示数组长度为3,i:0;i:10; 这里依次表示为数组下标索引为0,Integer类型值是10

在demo1对象序列化结果中:O:5:“demo1”:3:{s:1:“k”;s:2:“k1”;s:2:“a1”;N;s:3:“num”;i:1;},开头O表示是一个对象类型Object,5表示对象类名长度,demo1是类名,3表示对象类中有3个成员属性。大括号 {}里面依次是成员属性的表示,再看s:1:“k”;s:2:“k1”;这一部分对一个成员属性的格式描述 ,s:1:“k” 这一部分描述的是数据类型及成员属性的变量名,s:2:“k1” 这一部分描述的是成员属性的值部分。

s:2:“a1”;N;成员属性中由于变量a1没有赋初值,以N表示(Null)

需要注意的是对象中的function函数f1() 并没有被反序列化

在类对象进行序列化时,不同的权限修饰符修饰成员属性会有不同的序列化结果

<?php
class demo1{
    public $k="k1";
    private $a1;
    protected $num=1;
    public  function f1($var){
        echo $var;
    }
}
$c2=new demo1();
//var_dump(base64_encode(serialize($c2)));
var_dump((serialize($c2)));//序列化demo1对象
?>

运行结果
在这里插入图片描述

在这里插入图片描述不同权限修饰符修饰的结果

当类对象中变量不同修饰符序列化后的变化
权限  						序列化变量名
public 变量名;  				"变量名" (正常不变)
private 变量名;				"%00类名%00变量名"
protected 变量名;  			"%00*%00变量名"

在很多下情况需要注意如果使用echo进行输出类对象的序列化输出,默认会把%00空格吃掉,在丢失%00空格的情况下反序列化会失败

不同数据类型的序列化后结果格式

序列化后的结构为
类型:Integer  	 格式: i:值
类型:String   	 格式: s:字符串变量名长度:变量名
类型:Boolean	 格式: b:1或者0
类型:array		 格式: a:数组长度:{(索引类型:下标索引);(类型:)}
类型:Object		 格式: O:对象类名长度:类名:成员属性数量:{此处根据不同数据类型描述赋值}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值