一文带你吃透什么是PHP中的序列化
作者:金刀大菜牙 发布时间:2023-06-12 19:44:20
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;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//
}
}
如果你的作业类包含对 Eloquent 模型的引用,这个特性允许你自定义序列化过程。它包含上面看到的钩子的实现:
namespace Illuminate\Queue;
trait SerializesModels
{
use SerializesAndRestoresModelIdentifiers;
/**
* Prepare the instance for serialization.
*
* @return array
*/
public function __sleep()
{
// ...
}
/**
* Restore the model after serialization.
*
* @return void
*/
public function __wakeup()
{
// ...
}
/**
* Prepare the instance values for serialization.
*
* @return array
*/
public function __serialize()
{
// ...
}
/**
* Restore the model after serialization.
*
* @param array $values
* @return void
*/
public function __unserialize(array $values)
{
// ...
}
}
如Laravel 文档中所述:
如果你的排队作业在其构造函数中接受 Eloquent 模型,则只有模型的标识符将被序列化到队列中。当实际处理作业时,队列系统将自动从数据库中重新检索完整的模型实例及其加载的关系。这种模型序列化方法允许将更小的作业有效负载发送到您的队列驱动程序。
5. 最后
serialize()
并且unserialize()
是 PHP 的默认序列化技术。事实上,其他编程语言中有许多库允许你根据 PHP 标准序列化对象和数据结构,例如 Java 中的这个库:
github.com/marcospassos/java-php-serializer
除了这种特定格式,您还可以使用 JSON 标准将数据传输到外部服务。PHP 通过两个函数支持这种序列化:json_encode
和json_decode
。
来源:https://juejin.cn/post/7222874734186692645
猜你喜欢
- 一、软件准备:以下均为截止2005-4-20的最新正式版本PHP(5.1.2):http://www.php.netMySQL(5.0.19
- 因客户需求,要把数据库里的索引编号做成五位长度的,且能自动累加编号,我只会在SQL中使用Identity自动编号:Create Table
- 相信用过Gmail的人都知道Gmail有一个草稿自动保存的功能,每过一段时间,Gmail都会自动保存邮件草稿,这样在一些突 * 况下就能快速地
- 今天发现了一个显示ORACLE语法的好网站。内容太多,就不一一摘录了,记在这里,也方便自己查找。http://ss64.com/ora/ 目
- 看了网站LOGO设计规范的思考的第一部分关于logo设计基础,现在接着来谈谈网络LOGO的设计。四、网络LOGO的设计 古代皇家的纹章,有条
- 如何使整个页面内容居中,如何使高度适应内容自动伸缩。这是学习CSS布局最常见的问题。下面就给出一个实际的例子,并详细解释。(本文的经验和是蓝
- 通常说到外键,只会提到“外键的目的是确定资料的参考完整性(referential integrity)。”,但是外键具体包含哪些动作和含义呢
- 本文中介绍的主要是SQL语句,请大家不要在Access中使用。SQL的分类:DDL—数据定义语言(CREATE,ALTE
- 国外纷纷传言IE8将是Internet Explorer的最后一个版本,这个猜测来源于Microsoft的CEO Steve
- 简介:设计稿尺寸标注与取色专用工具,适用于设计、界面开发与网页前端安装包仅700KB,全绿色独有的双模式切换可支持双屏显示器,一面设计,一面
- 今天遇到这个问题,上网查到以下解决方法:1.检查你的磁盘剩余空间是否足够,如果没有磁盘剩余空间,则清理磁盘,腾出空间
- 在Flash中使用ASP需要的条件:1。你的ISP的server必须支持Active Server Pages并且最好支持数据库2。你应该要
- 现在正在搞三层开发,用ASP和VB6.0,但是现在苦于没有找到合适的方法来调试自己写的DLL文件,效率相当低。 &n
- jqGrid是一个优秀的基于jQuery的DataGrid框架,想必大伙儿也不陌生,网上基于ASP的资料很少,我提供一个,数据格式是json
- 绘制一个线框图是你在制作一个网站前必须要经历的过程。线框图能够帮助你合理的组织并简化你内容和元素,是网站内容布局的基本视觉表现方式,是网站开
- 如何使DIV居中,div垂直居中,div水平居中.这个问题在用CSS来设计网页的时候经常会遇到,如果用传统的表格来布局是很简单的,CSS里就
- 笔者通过一周的时间,询问了许多设计人员真实用户,以便确保这六个方面确实是大多数用户所不喜并且有非常大的概率普遍存在于众多的医疗网站之中。那么
- MySQL是一个真正的多用户、多线程SQL数据库服务器。MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mys
- 本文给出了MySQL数据库中定义外键的必要性、具体的定义步骤和相关的一些基本操作,供大家参考!定义数据表假如某个电脑生产商,它的数据库中保存
- 1. 游戏是更注重于体验的产品,所以应该将游戏本省做得更加炫动和增加参与感觉。2. 网络游戏和单击游戏的区别在于社会化的添加,所以运用好这样