• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 深入了解PHP中的序列化和反序列化

深入了解PHP中的序列化和反序列化

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了PHP序列化,PHP反序列化等相关知识,希望对您有所帮助

深入了解PHP中的序列化和反序列化


序列化

序列化格式

在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。

序列化函数原型如下:

string serialize ( mixed $value )

先看下面的例子:

class CC {    public $data;    private $pass;     public function __construct($data, $pass)    {        $this->data = $data;        $this->pass = $pass;    }}$number = 34;$str = 'uusama';$bool = true;$null = NULL;$arr = array('a' => 1, 'b' => 2);$cc = new CC('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($cc));

输出结果为:

string(5) "i:34;"string(13) "s:6:"uusama";"string(4) "b:1;"string(2) "N;"string(30) "a:2:{s:1:"a";i:1;s:1:"b";i:2;}"string(52) "O:2:"CC":2:{s:4:"data";s:2:"uu";s:8:" CC 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)}

序列化对象

从上面的例子中我们可以看出序列化对象的时候,只会保存属性值。

那么对象中的常量会不会保存呢?

如果是继承,父类的变量会不会保存呢

class CB {    public $CB_data = 'cb';} class CC extends CB{    const SECOND = 60;         public $data;    private $pass;        public function __construct($data, $pass)    {        $this->data = $data;        $this->pass = $pass;    }         public function setPass($pass)    {        $this->pass = $pass;    }}$cc = new CC('uu', true);var_dump(serialize($cc));

输出结果为:

string(75) "O:2:"CC":3:{s:4:"data";s:2:"uu";s:8:" CC pass";b:1;s:7:"CB_data";s:2:"cb";}"

显然,序列化对象时,不会保存常量的值。对于父类中的变量,则会保留。


对象序列化自定义

在序列化对象的时候,对于对象中的一些敏感属性,我们不需要保存,这又该如何处理呢?

当调用serialize()函数序列化对象时,该函数会检查类中是否存在一个魔术方法__sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。可以通过重载这个方法,从而自定义序列化行为。该方法原型如下:

public array __sleep ( void )

该方法返回一个包含对象中所有应被序列化的变量名称的数组

该方法未返回任何内容,则 NULL 被序列化,并产生一个E_NOTICE级别的错误

__sleep()不能返回父类的私有成员的名字。这样做会产生一个E_NOTICE级别的错误。这时只能用Serializable接口来替代。

常用于保存那些大对象时的清理工作,避免保存过多冗余数据

看下面的例子:

class User{    const SITE = 'uusama';         public $username;    public $nickname;    private $password;         public function __construct($username, $nickname, $password)    {        $this->username = $username;        $this->nickname = $nickname;        $this->password = $password;    }         // 重载序列化调用的方法    public function __sleep()    {        // 返回需要序列化的变量名,过滤掉password变量        return array('username', 'nickname');    }}$user = new User('uusama', 'uu', '123456');var_dump(serialize($user));

返回结果如下,显然序列化的时候忽略了 password 字段的值。

string(67) "O:4:"User":2:{s:8:"username";s:6:"uusama";s:8:"nickname";s:2:"uu";}"


序列化对象存储

通过上面的介绍,我们可以把一个复制的对象或者数据序列化成一个序列字符串,保存值的同事还保存了他们的结构。

我们可以把序列化之后的值保存起来,存在文件或者缓存里面。不推荐存在数据库里面,可读性查,而且不便于迁移维护,不便于查询。

$user = new User('uusama', 'uu', '123456');$ser = serialize($user);// 保存在本地file_put_contents('user.ser', $ser);

反序列化

使用方法

通过上面的讲解,我们可以将对象序列化为字符串并保存起来,那么如何把这些序列化后的字符串恢复成原样呢?PHP提供了反序列函数:

mixed unserialize ( string $str )

unserialize()反序列化函数用于将单一的已序列化的变量转换回 PHP 的值。

如果传递的字符串不可解序列化,则返回 FALSE,并产生一个E_NOTICE

返回的是转换之后的值,可为integer``float、string、array或object

若被反序列化的变量是一个对象,在成功重新构造对象之后,PHP会自动地试图去调用__wakeup()成员函数(如果存在的话)

看下面的例子:

class User{    const SITE = 'uusama';         public $username;    public $nickname;    private $password;    private $order;         public function __construct($username, $nickname, $password)    {      &nb
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入了解PHP中的序列化和反序列化

相关文章

  • Photoshop绘制超强质感立体按钮
  • vue.js如何实现可拖拽菜单
  • 如何撰写良好的描述标签 description tag?
  • 怎么利用Node.js进行html页面跳转
  • SQL语句中的with as该怎么用
  • 设置一个无需输入密码的WordPress登录表单
  • CorelDRAW实例教程:绘制创意风格的游戏海报教程
  • vue中的math.sqrt的用法是什么
  • Laravel中Kafka的使用详解
  • 介绍Javascript实现定时器倒计时

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 织梦Dedecms系统实现按“字母检索”搜索功能
    • Discuz论坛游客无法查看文章中的图片怎么办?
    • nginx隐藏index.php的设置方法
    • 帝国cms批量替换字段值SQL语法
    • 解决LNMP环境安装WordPress不显示主题,无法编辑的教程
    • PHP微信小程序解包过程实例详解
    • Javascript如何获取用户输入的值
    • 微信小程序页面向下滚动时tab栏固定页面顶部实例讲解
    • IllustratorUI设计教程:解析多重填充与多重描边
    • PHP实现获取url地址中顶级域名的方法示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有