目录
1 背景
(1)在PHP中,每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。
(2)一个类可以包含有属于自己的属性(常量,变量)和方法(函数)。
(3)由于类的实例化对象比较抽象,不方便用于传输和存储。
tips(类与对象):
- 类为class,对象是object;举个例子,车为一个大类,大类再分小类如自行车、卡车;而具体的某台车为一个对象。
2 序列化与反序列化的定义
序列化与反序列化过程在php、python等多种语言中普遍存在。
- 序列化:程序将对象状态转换为可存储或传输的字节序列的过程(即将对象状态转换为可存储或可传输的过程)
- 反序列化:程序把存储或传输的字节序列恢复为对象的过程。
- 核心思想:对象状态的保存和重建。
PHP中的序列化与反序列化,基本都是围绕serialize()
和unserialize()
两个函数展开的。
3 作用及优点
序列化的意义:在传递和保存对象时,为保证对象的完整性和可传递性,程序将对象转换为有序字节流,以保存在本地文件中,并且可以以特定的格式在进程之间跨平台、安全的进行通信。比如从java平台传递到php平台。
反序列化的意义:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
序列化的优点:
- 将对象转为字节流存储到硬盘上(实际上是存放在数据库,一般是redis数据库-键值对数据库),当JVM停机的话,字节流还会在硬盘上默默等待,等待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象。
- 序列化后的二进制序列能够减少存储空间(永久性保存对象)。
- 序列化成字节流形式的对象可以进行网络传输。
- 通过序列化可以在进程间传递对象。
tips:
实际上用redis数据库作为缓存,一般用于存储序列化后的字符串,待字符串需要使用时,再反序列化为对象,方便调用。
4 例子:测试php代码中序列化与反序列化执行过程
4.1 测试环境
服务器:在虚拟机中安装win2008及phpstudy,参考《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》。
客户端:真实机浏览器。
4.2 测试序列化过程
(1)在服务器网站根目录下新建一个文件夹serialize_unserialize,再在该文件夹下新建一个txt文件,输入以下内容,并重命名为serialize.php。
<meta charset = "utf-8">
<?php
//定义一个stu类,类中有4个属性,暂未定义方法。
class stu{
public $name;
public $sex;
public $age;
public $score;
}
//创建对象1
$stu1=new stu();
$stu1->name="gzz";
$stu1->sex=true;
$stu1->age=