php 序列化反序列化

2023-11-29 22:53:04 举报文章

PHP 是一种广泛使用的脚本语言,具有强大的序列化和反序列化能力。序列化指的是将数据结构或对象转换为字节流的过程,而反序列化则是将字节流转换回原始数据结构或对象的过程。PHP 提供了简单易用的序列化和反序列化函数,使得在应用程序中保存和恢复数据变得更加便捷。本文将探讨 PHP 序列化和反序列化的原理,并通过一些示例来演示其使用。

序列化在很多情况下非常有用,比如在网络传输、缓存存储和数据持久化等方面。假设我们有一个包含用户信息的数组:

//by www.qzphp.cn
<?php
$user = array( 'username' => 'JohnDoe', 'email' => 'johndoe@example.com', 'age' => 25);
?>

我们可以使用 serialize() 函数将该数组序列化为字节流:

//by www.qzphp.cn
<?php
$serializedUser = serialize($user);
echo $serializedUser;
?>

输出结果类似于:a:3:{s:8:"username";s:7:"JohnDoe";s:5:"email";s:19:"johndoe@example.com";s:3:"age";i:25;}

反序列化是将序列化的字节流转换回原始数据结构或对象的过程。我们可以使用 unserialize() 函数来反序列化之前序列化的字节流:

//by www.qzphp.cn
<?php
$unserializedUser = unserialize($serializedUser);
print_r($unserializedUser);
?>

输出结果为:

//by www.qzphp.cn
Array( [username] => JohnDoe [email] => johndoe@example.com [age] => 25)

值得注意的是,当我们对对象进行序列化时,PHP 只会保存对象的属性,而忽略方法。当我们对对象进行反序列化时,PHP 将会自动重新创建对象并恢复其属性。

例如,我们有一个名为 User 的类:

//by www.qzphp.cn
<?php
class User {
 private $username;
 private $email;
 private $age;
 public function __construct($username, $email, $age) {
 $this->username = $username;
 $this->email = $email;
 $this->age = $age;
}
 public function getUsername() {
 return $this->username;
}
 public function getEmail() {
 return $this->email;
}
 public function getAge() {
 return $this->age;
}
}
?>

我们可以创建一个 User 对象,并将其序列化:

//by www.qzphp.cn
<?php
$user = new User('JohnDoe', 'johndoe@example.com', 25);
$serializedUser = serialize($user);
echo $serializedUser;
?>

输出结果类似于:O:4:"User":3:{s:8:"username";s:7:"JohnDoe";s:5:"email";s:19:"johndoe@example.com";s:3:"age";i:25;}

我们可以使用 unserialize() 函数来反序列化该对象:

//by www.qzphp.cn
<?php
$unserializedUser = unserialize($serializedUser);
echo $unserializedUser->getUsername();
 // 输出 "
JohnDoe"
echo $unserializedUser->getEmail();
 // 输出 "
johndoe@example.com"
echo $unserializedUser->getAge();
 // 输出 25
?></
pre>

通过序列化和反序列化,我们可以方便地保存和恢复复杂的数据结构和对象,以满足我们的需求。

总结起来,PHP 的序列化和反序列化功能强大且简便。我们可以使用 serialize() 函数将数据结构或对象转换为字节流,用 unserialize() 函数将字节流转换回原始数据结构或对象。这对于网络传输、缓存存储和数据持久化等方面非常有用。同时,需要注意的是,在对对象进行序列化和反序列化时,PHP 只会保存对象的属性,而忽略方法。

如果你认为本文可读性较差,内容错误,或者文章排版错乱,请点击举报文章按钮,我们会立即处理!