我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一文带你吃透什么是PHP中的序列化

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一文带你吃透什么是PHP中的序列化

1. php 中的序列化

在 PHP 中,序列化是将数据结构或对象转换为可以存储或传输的字符串表示的过程,经过序列化之后的对象或者数据结构,就可以保存到数据库、缓存或通过网络连接发送它,然后后面从序列化字符串重新创建对象或数据结构。

以下是如何在 PHP 中序列化对象的例子:

class User
{
    public $name;
    public $email;
​
    public function __construct($name, $email)
    {
        $this->name = $name;
        $this->email = $email;
    }
}
​
$user = new User('John', 'john@example.com');
​
$serializedUser = serialize($user);
​
echo $serializedUser;

此代码的输出将是$user对象的字符串表示形式,类似于:

O:4:"User":2:{s:4:"name";s:4:"John";s:5:"email";s:17:"john@example.com";}

PHP 中的序列化格式相当简单。序列化字符串由一系列数据类型和值组成,每个数据类型和值由冒号分隔。例如,整数的序列化字符串为i:123,而字符串的序列化字符串为s:5:"Hello"

要将此字符串反序列化回其原始形式,可以使用以下unserialize()函数:

$unserializedUser = unserialize($serializedUser);
​
echo $unserializedUser->name; // John
echo $unserializedUser->email; // john@example.com

2. 序列化和反序列化过程中的钩子

PHP 中有两个钩子可用于与此过程进行交互。你可以在一个类中定义这些钩子函数,它会在你序列化或者反序列化对象的时候自动调用。这对于在序列化或取反列化对象时执行自定义操作很有用,例如记录或验证。

__sleep() 钩子:这个钩子在序列化时被调用。在对象的属性被序列化之前,它允许开发人员指定哪些属性应该被序列化,哪些属性不被序列化。

class MyClass 
{
    private $data;
    private $secret;
​
    public function __sleep() {
        return ['data'];
    }
}

__wakeup() 钩子:这个钩子在反序列化时被调用。在对象的属性被反序列化之后,它允许开发人员在对象被反序列化后对其执行任何必要的初始化或设置。

class MyClass 
{
    private $data;
    private $secret;
​
    public function __wakeup() {
        $this->secret = '123456';
    }
}

3. 如何使用序列化与外部服务通信

要使用序列化与外部服务通信,可以使用 PHP 的内置函数来发送 HTTP 请求,例如file_get_contents()curl_exec(),然后你可以将序列化数据作为请求中的参数传递,外部服务可以在其端反序列化数据以访问信息。

下面是使用序列化将数据发送到外部服务的示例:

$data = [
    "name" => "John", 
    "age" => 30
];
​
// Serialize the data
$serializedData = serialize($data);
​
// Send the serialized data to the external service using HTTP POST
$ch = curl_init("http://example.com/service");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "data=" . $serializedData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
​
// Handle the response from the service
echo $response;

在外部服务上,您可以使用该unserialize()函数将序列化数据转换回 PHP 数据结构或对象。

// Get the serialized data from the HTTP POST request
$serializedData = $_POST['data'];
​
// Unserialize the data
$data = unserialize($serializedData);
​
// Use the data
echo "Name: " . $data['name'] . "\n";
echo "Age: " . $data['age'] . "\n";

4. 序列化实例 - Laravel Queue

当 Laravel 将 Job 类存储到队列服务(可以是 Redis、AWS SQS 或类似的服务)中时,对象被序列化。当你在 Laravel 中创建一个新的 Job 类时,它附带了 SerializesModels 特性。

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
​
class ExampleJob implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;
    use SerializesModels;
​
    
    public function __construct()
    {
        //
    }
​
    
    public function handle()
    {
        //
    }
}

如果你的作业类包含对 Eloquent 模型的引用,这个特性允许你自定义序列化过程。它包含上面看到的钩子的实现:

namespace Illuminate\Queue;
​
trait SerializesModels
{
    use SerializesAndRestoresModelIdentifiers;
​
    
    public function __sleep()
    {
        // ...
    }
​
    
    public function __wakeup()
    {
        // ...
    }
​
    
    public function __serialize()
    {
        // ...
    }
​
    
    public function __unserialize(array $values)
    {
        // ...
    }
}

如Laravel 文档中所述:

如果你的排队作业在其构造函数中接受 Eloquent 模型,则只有模型的标识符将被序列化到队列中。当实际处理作业时,队列系统将自动从数据库中重新检索完整的模型实例及其加载的关系。这种模型序列化方法允许将更小的作业有效负载发送到您的队列驱动程序。

5. 最后

serialize()并且unserialize() 是 PHP 的默认序列化技术。事实上,其他编程语言中有许多库允许你根据 PHP 标准序列化对象和数据结构,例如 Java 中的这个库:

github.com/marcospassos/java-php-serializer

除了这种特定格式,您还可以使用 JSON 标准将数据传输到外部服务。PHP 通过两个函数支持这种序列化:json_encodejson_decode

到此这篇关于一文带你吃透什么是PHP中的序列化的文章就介绍到这了,更多相关PHP序列化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一文带你吃透什么是PHP中的序列化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文带你吃透什么是PHP中的序列化

在 PHP 中,序列化是将数据结构或对象转换为可以存储或传输的字符串表示的过程。本文将通过一些简单的示例为大家介绍一下PHP序列化的相关知识,需要的可以参考一下
2023-05-18

PHP中的序列化和反序列化是什么

这篇“PHP中的序列化和反序列化是什么”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“PHP中的序列化和反序列化是什么”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让
2023-06-06

php中json序列化为[]的弊端是什么

这篇文章主要介绍了php中json序列化为[]的弊端是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php中json序列化为[]的弊端是什么文章都会有所收获,下面我们一起来看看吧。在 PHP 中表示空的ma
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录