首页 > 编程笔记 > PHP笔记

PHP serialize()与unserialize():序列化与反序列化

我们在开发的过程中有时会遇到需要把对象或者数组进行序列化存储,反序列化输出的情况。特别是当需要把数组存储到 MySQL 数据库中时,就需要将数组进行序列化操作。

所谓序列化,就是将一个在内存中的变量转换为可保存或传输的字符串的过程。而反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来可以轻松的完成数据的存储和传输操作,使得程序更具维护性。

1、序列化

所有 PHP 里面的值都可以使用 serialize() 函数将其转换为一个可以存储的字符串,也就是序列化。而 unserialize() 函数能够重新把字符串变回 PHP 原来的值,也就是反序列化。

以对象为例,当序列化一个对象时,将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。另外,为了能够反序列化一个对象,这个对象的类必须已经定义过。如果序列化类 A 的一个对象,将会返回一个跟类 A 相关,而且包含了对象所有变量值的字符串。

如果要想在另外一个文件中反序列化一个对象,那么这个对象的类必须在反序列化之前定义,可以通过包含一个定义该类的文件或使用函数 spl_autoload_register() 来实现。

serialize() 函数的语法格式如下:

serialize(mixed $value)

其中 $value 就是要序列化的变量。

serialize() 函数可以处理除了 resource(资源)之外的任何类型。当序列化对象时,PHP 会在序列动作之前调用该对象的 __sleep() 成员函数。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 反序列化对象时,将调用 __wakeup() 成员函数。

【示例】使用 serialize() 函数序列化一个对象。
<?php
    class WebSit{
        public $name;
        public $url;

        function __construct($name, $url){
            $this->name = $name;
            $this->url  = $url;
        }
    }

    $websit  = new WebSit('新宝库', 'https://www.xinbaoku.com/php/');
    $ser_str = serialize($websit);
    echo $ser_str;
?>
运行结果如下:

O:6:"WebSit":2:{s:4:"name";s:16:"新宝库";s:3:"url";s:27:"https://www.xinbaoku.com/php/";}

2、反序列化

当使用 serialize() 函数将对象序列化后,可以将这个得到的字符串保存到文件或者数据库中,然后在需要的地方使用 unserialize() 函数将这个字符串反序列化,unserialize() 函数的语法格式如下:

unserialize(string $str)

其中,$str 为使用 serialize() 函数序列化后的字符串。如果传入的字符串不可被反序列化,则会返回 FALSE,并产生一个 E_NOTICE。

【示例】反序列化上面得到的字符串。
<?php
    class WebSit{
        public $name;
        public $url;

        function __construct($name, $url){
            $this->name = $name;
            $this->url  = $url;
        }
    }

    $str = 'O:6:"WebSit":2:{s:4:"name";s:16:"新宝库";s:3:"url";s:27:"https://www.xinbaoku.com/php/";}';
    $websit = unserialize($str);
    var_dump($websit);
?>
运行结果如下:

object(WebSit)#1 (2) { ["name"]=> string(16) "新宝库" ["url"]=> string(27) "https://www.xinbaoku.com/php/" }

所有教程

优秀文章