PHP serialize()与unserialize()
2022/8/23 1:52:47
本文主要是介绍PHP serialize()与unserialize(),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
大多数时候,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))); }
以上就是本文的全部内容,希望对大家的学习有所帮助。更多教程请访问码农之家
这篇关于PHP serialize()与unserialize()的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-19php8的协程和hyperf的协程有什么区别?-icode9专业技术文章分享
- 2024-12-19php8 的fiber是什么?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-11-29使用PHP 将ETH账户的资产汇集到一个账户
- 2024-11-23怎么实现安卓+php 热更新方案?-icode9专业技术文章分享
- 2024-11-22PHP 中怎么实现判断多个值是否为空、null 或者为 false?-icode9专业技术文章分享
- 2024-11-11开源 PHP 商城项目 CRMEB 二次开发和部署教程
- 2024-11-09怎么使用php在kaufland平台刊登商品?-icode9专业技术文章分享
- 2024-11-05PHP的抽象类和接口是什么,有什么区别-icode9专业技术文章分享