在 PHP 中,序列化是将数据结构或对象转换为可以存储或传输的字符串表示的过程。本文将通过一些简单的示例为大家介绍一下PHP序列化的相关知识,需要的可以参考一下
1. php 中的序列化
在 PHP 中,序列化是将数据结构或对象转换为可以存储或传输的字符串表示的过程,经过序列化之后的对象或者数据结构,就可以保存到数据库、缓存或通过网络连接发送它,然后后面从序列化字符串重新创建对象或数据结构。
以下是如何在 PHP 中序列化对象的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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()
函数:
1 2 3 4 | $unserializedUser = unserialize( $serializedUser ); echo $unserializedUser ->name; // John echo $unserializedUser ->email; // john@example.com |
2. 序列化和反序列化过程中的钩子
PHP 中有两个钩子可用于与此过程进行交互。你可以在一个类中定义这些钩子函数,它会在你序列化或者反序列化对象的时候自动调用。这对于在序列化或取反列化对象时执行自定义操作很有用,例如记录或验证。
__sleep() 钩子:这个钩子在序列化时被调用。在对象的属性被序列化之前,它允许开发人员指定哪些属性应该被序列化,哪些属性不被序列化。
1 2 3 4 5 6 7 8 9 | class MyClass { private $data ; private $secret ; public function __sleep() { return [ 'data' ]; } } |
__wakeup() 钩子:这个钩子在反序列化时被调用。在对象的属性被反序列化之后,它允许开发人员在对象被反序列化后对其执行任何必要的初始化或设置。
1 2 3 4 5 6 7 8 9 | class MyClass { private $data ; private $secret ; public function __wakeup() { $this ->secret = '123456' ; } } |
3. 如何使用序列化与外部服务通信
要使用序列化与外部服务通信,可以使用 PHP 的内置函数来发送 HTTP 请求,例如file_get_contents()
或curl_exec()
,然后你可以将序列化数据作为请求中的参数传递,外部服务可以在其端反序列化数据以访问信息。
下面是使用序列化将数据发送到外部服务的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $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 数据结构或对象。
1 2 3 4 5 6 7 8 9 | // 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" ; |
来源:微点阅读 https://www.weidianyuedu.com