PHP 序列化和反序列化函数实例详解


Posted in PHP onJuly 18, 2020

序列化与反序列化

把复杂的数据类型压缩到一个字符串中

serialize() 把变量和它们的值编码成文本形式
unserialize() 恢复原先变量 

1.创建一个$arr数组用于储存用户基本信息,并在浏览器中输出查看结果;

$arr=array();
$arr['name']='张三';
$arr['age']='22';
$arr['sex']='男';
$arr['phone']='123456789';
$arr['address']='上海市浦东新区';
var_dump($arr);

输出结果:

array(5) { 
["name"]=> string(6) "张三" 
["age"]=> string(2) "22" 
["sex"]=> string(3) "男" 
["phone"]=> string(9) "123456789" 
["address"]=> string(21) "上海市浦东新区"
 }

2.将$arr数组进行序列化赋值给$info字符串,并在浏览器中输出查看结果;

$info=serialize($arr);
var_dump($info);

输出结果:

string(140) "a:5:{s:4:"name";s:6:"张三";s:3:"age";s:2:"22";s:3:"sex";s:3:"男";s:5:"phone";s:9:"123456789";s:7:"address";s:21:"上海市浦东新区";}"

使用序列化serialize($arr)函数,将数组中元素的键和值按照规则顺序连接成字符串。a:5标志序列化为array包含5个键值对,s:4标志内容为字符串包含4个字符。

通过序列化我们可以将一些模块化的数据使用字符串的形式存储在数据库或session等,可以减少创建众多繁琐的数据表字段,当然序列化为字符串存储会增加额外的空间,应合理的设计和应用。

3.最后使用unserialize($info)反序列化将字符串还原成我们需要的数组模式;

$zhangsan=unserialize($info);
var_dump($zhangsan);

输出结果:

array(5) {
["name"]=> string(6) "张三" 
["age"]=> string(2) "22" 
["sex"]=> string(3) "男" 
["phone"]=> string(9) "123456789" 
["address"]=> string(21) "上海市浦东新区" 
}

PHP序列化反序列化serialize和unserialize函数

昨天网上看到一道面试题,如下:

“类的属性可以序列化后保存到session中,从而以后可以恢复整个类,这要用到的函数是?”

我记得原来老师说过序列化函数是"serialize",查了下,果不其然,今天记录下,免得忘记。

<?php
  class aa{
    public $a = 1;
    private $b = 2;
    protected $c = 3;
 
    function afun(){
      return $this->a;
    }
    function bfun(){
      return $this->b;
    }
    function __destruct(){
      echo "变量销毁了";
    }
  }
 
  $v = new aa;
  echo $v->afun();
  $se = serialize($v);
  unset($v); //这里先销毁$v,这个时候会自动调用析构函数
  echo "<hr />";
  $v = unserialize($se); //再反序列化
  echo $v->bfun();

看看运行结果

PHP 序列化和反序列化函数实例详解

如果觉得还不明显, 好,我们在改一下代码

aa.class.php

<?php
  class aa{
    public $a = 1;
    private $b = 2;
    protected $c = 3;
 
    function afun(){
      return '$a的值是:'.$this->a;
    }
    function bfun(){
      return '$b的值是:'.$this->b;
    }
  }

a1.php

<?php
  require './demo8.php';
  Session_start();
  $v = new aa();
  $_SESSION['v'] = serialize($v);

a2.php

<?php
  require './demo8.php';
  Session_start();
  $v = unserialize($_SESSION['v']);
  echo $v->bfun();

再看看结果是不是一目了然了呢,好了,试验做完了,结论调用下公论。
例子中的对象我们还可以换为数组等其他类型,效果都是一样的!
其实serialize()就是将PHP中的变量如对象(object),数组(array)等等的值序列化为字符串后存储起来.序列化的字符串我们可以存储在其他地方如数据库、Session、Cookie等,序列化的操作并不会丢失这些值的类型和结构。这样这些变量的数据就可以在PHP页面、甚至是不同PHP程序间传递了。
而unserialize()就是把序列化的字符串转换回PHP的值。

这里再引用一段PHP手册上的说明,看了上面的例子,应该很容易明白下面这些话的意思了
想要将已序列化的字符串变回 PHP 的值,可使用 unserialize()。serialize() 可处理除了 resource 之外的任何类型。甚至可以 serialize() 那些包含了指向其自身引用的数组。你正 serialize() 的数组/对象中的引用也将被存储。

当序列化对象时,PHP 将试图在序列动作之前调用该对象的成员函数 __sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用 __wakeup() 成员函数
unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。返回的是转换之后的值,可为 integer、float、string、array 或 object。如果传递的字符串不可解序列化,则返回 FALSE。

以上所述是小编给大家介绍的PHP 序列化和反序列化函数实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP 变量定义和变量替换的方法
Jul 30 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
Jan 15 PHP
php获取当前时间的毫秒数的方法
Jan 26 PHP
PHP获取数组长度或某个值出现次数的方法
Feb 11 PHP
php字符串按照单词进行反转的方法
Mar 14 PHP
PHP中JSON的应用技巧
Oct 10 PHP
PHP获取指定日期是星期几的实现方法
Nov 30 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
PHP手机号码及邮箱正则表达式实例解析
Jul 11 PHP
php头像上传预览实例代码
May 02 #PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
May 02 #PHP
AJAX的使用方法详解
Apr 29 #PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 #PHP
PHP编程实现csv文件导入mysql数据库的方法
Apr 29 #PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 #PHP
PHP中Notice错误常见解决方法
Apr 28 #PHP
You might like
php 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
js实现文本上下来回滚动
2017/02/03 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
Saltstack快速入门简单汇总
2016/03/01 Python
PyQt5实现下载进度条效果
2018/04/19 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
python实现大转盘抽奖效果
2019/01/22 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
Python切图九宫格的实现方法
2019/10/10 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
党员公开承诺书范文
2014/03/25 职场文书
国际金融专业自荐信
2014/07/05 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
高三语文复习计划
2015/01/19 职场文书
教师工作态度自我评价
2015/03/05 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
人民调解协议书
2016/03/21 职场文书
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技
nginx静态资源的服务器配置方法
2022/07/07 Servers