PHP序列化的概念

目录

一、序列化的概念

二、序列化和反序列化的作用:

三、PHP序列化函数

四、各种数据类型序列化后的效果

(1) NULL的序列化

(2) Boolean型数据的序列化

(3) Integer型数据的序列化

(4)Double型数据的序列化

(5) String型数据的序列化

(6) 数组的序列化

(7) 对象的序列化


一、序列化的概念

将对象或者数组转化为可存储的字符串

在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

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值