PHP中的序列化与反序列化

今天在学习面向对象时,里边的一个两个魔术方法__sleep()和__wake()让我一开始有点困惑,这两个方法分别是让类序列化和反序列化时使用的,因为看的是视频,老师说的很笼统,就自己在网上查了一下,下边是我总结的内容:

1.序列化是将对象通过一系列的操作转化为字符串的过程。

2.什么时候需要序列化?

1)对象在网络上传输时

2)对象保存到文件中时

3.序列化与__sleep()魔法方法的关系:相当于对象与构造函数之间的关系,即没有系统会隐形调用,有的话系统就不会再补充,直接调用我们自己写的。

4.__sleep()可以干什么?__sleep()需要返回一个数组,数组的一个成员对应着对象的一个属性名字,默认为全部属性的名字,而我们自己创建的__sleep()函数可以剔除我们不需要的属性名字,这样在序列化时就不会返回该属性值了,这有点类似于我们外出旅游时选衣服,要选出自己在这段时间会用的衣服。

在序列化时,系统会先调用__sleep()魔术方法,然后在里边对数据进行筛选,就像要出门挑选要带的衣服一样,默认是一个对象的全部属性,然后再调用serialize()函数就像这样:

<?php
class Animal{
	public $name;
	public $age;
	public $height;
	function __construct($name,$age,$heigh){
		$this->name=$name;
		$this->age=$age;
		$this->height=$heigh;

	}
	function __sleep(){
		$this->name="小白猫";
		return ['name','age',];

	}
	function __wakeup(){

	}
}
$cat=new Animal("小花猫",5,20);
var_dump(serialize($cat));

?>

在上边的例子中最后输出序列化内容是这样:

5.序列化的过程与回调函数的关系:回调函数概念是一个函数的参数是另一个函数的返回值,而在序列化时,serialize()函数的参数就是__sleep()函数的返回值,所以序列化的过程就是一次回调函数的执行过程。

而反序列化则是序列化的相反过程,关键字是unserialize,用法和原理与序列化的用法差不多,,没有返回值,把刚上边的改成这样:

结果就变成了数组类型的了,是不是很神奇?

猜你喜欢

转载自blog.csdn.net/sinat_35161044/article/details/81877697