ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

PHP serialize()与unserialize()

2022-08-22 21:04:49  阅读:390  来源: 互联网

标签:base64 函数 serialize unserialize PHP 序列化


大多数时候,PHP开发人员需要在文件或数据库中存储一个复杂的数组。复杂的数组是那些具有多个单一数据类型或数组元素的数组。

在本教程中,我们将向您展示如何使用 serialize() 和 unserialize() 函数来实现存储和读取复杂数据。

 

PHP serialize()函数

serialize()是PHP内置函数,用于序列化指定定数组。serialize()函数接受一个参数,该参数是我们要序列化的数据,并返回一个序列化的字符串.

语法

serialize(value)

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

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

例子:

<?php
// say you have an array something like this 
$multidimentional_array= array(
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 4, 7) 
       ),
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 5, 7) 
       ),
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 8, 7) 
    )
);

// serialize 
$serialized_array=serialize($multidimentional_array);
print_r($serialized_array);
?>

输出:

a:3:{i:0;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:4;i:2;i:7;}}i:1;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:5;i:2;i:7;}}i:2;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:8;i:2;i:7;}}}

序列化文本如上所示。现在,该文本可以存储在数据库中,并且当我们需要在前端显示数据时,我们可以对数据进行反序列化并恢复为原始格式。

 

PHP unserialize()函数

unserialize() 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。

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

unserialize(string $str)

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

例子:

<?php
$serialized_data = serialize(array('Math', 'Language', 'Science'));
echo  $serialized_data . '<br>';
// Unserialize the data
$var1 = unserialize($serialized_data);
// Show the unserialized data;
var_dump ($var1);
?>

输出:

a:3:{i:0;s:4:"Math";i:1;s:8:"Language";i:2;s:7:"Science";}
array(3) {    [0]=>    string(4) "Math"    [1]=>    string(8) "Language"    [2]=>    string(7) "Science"  } 

 

现在,让我们来看看 serialize() 和 unserialize() 两者如何在实践中被使用:

<?php
$myvar = ['hello',  42, [1, 'two'], 'apple'];

// Serialize the above data 
$string = serialize($myvar);

// Unserialize the data in $string 
$newvar = unserialize($string);

// Print the unserialized data 
print_r($newvar);

?>

该示例的输出如下:

Array
(
   [0] => hello
   [1] => 42
   [2] => Array
       (
           [0] => 1
           [1] => two
       )
   [3] => apple
)

 

PHP serialize()和unserialize()注意事项

当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。

// to safely serialize
$save_in_db = base64_encode(serialize($value));

// to unserialize value fetched from db...
$value = unserialize(base64_decode($fetched_from_db));

但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。

//定义一个用来序列化对象的函数
function my_serialize( $obj ) 
{ 
   return base64_encode(gzcompress(serialize($obj))); 
} 
//反序列化
function my_unserialize($txt) 
{ 
   return unserialize(gzuncompress(base64_decode($txt))); 
}

以上就是本文的全部内容,希望对大家的学习有所帮助。更多教程请访问码农之家

标签:base64,函数,serialize,unserialize,PHP,序列化
来源: https://www.cnblogs.com/myhomepages/p/16614200.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有