当您需要保存对象的状态以供以后使用时,序列化对象很有用。例如,您可能有一个用户对象来保存用户偏好等。由于网络是无状态的,您将在每个请求中丢失该对象。但是,如果您要说序列化该对象并将其保存在会话变量中,则可以通过反序列化来重建该对象,从而使您不必重建在上次请求期间已经拥有的新对象。
附带说明:序列化然后反序列化对象也将完成对象的深层复制,其中(克隆)只会执行浅层复制。
序列化示例
<?php
class User {
private $name = "";
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
/*
public function __sleep() {
print "sleep";
}
public function __wakeup() {
print "wakeup";
}
*/
}
$user = new User("Andrew Schools");
$userSerialized = serialize($user); // usually you would save this in a session or DB
$user2 = unserialize($userSerialized);
echo $user->getName();
echo "<br />";
echo $user2->getName();
echo "<br />";
var_dump($user);
var_dump($user2);
?>
这应该打印出以下内容:
Andrew Schools
Andrew Schools
class User#1 (1) {
private $name =>
string(14) "Andrew Schools"
}
class User#2 (1) {
private $name =>
string(14) "Andrew Schools"
}
如您所见,我可以将对象恢复到序列化之前的状态。此外, __sleep() 函数在序列化开始之前触发,因此您可以进行任何清理。并且在反序列化之后调用__wakeup,以便在对象恢复后可以做一些额外的任务。