深入对象与类的关系理论篇(序列化与类的关系)
最近在一本书上,偶尔看到了对象与序列化的一个转换,然后和PHP的朋友商讨,什么是序列化,发现很多人不知道序列化是什么,什么时候用序列化?甚至有些用PHP的网友连对象都有点搞不灵清。所以就萌生了写一篇类似专题的文章来分享一下自己的知识。
什么是面向对象?
面向对象与具体的语言无关。类是具体抽象的组织,对象是类具体的存在。 类实例化出来对象,换句话说,就是类是一个模子,我们把泥浆倒进模子里面(实例化)就成了一个对象。
什么是对象的“形”与“本” ?
要回答类与对象的本质的这个问题,我们可以先对象的“形”来讲起。
类是我们对一组对象的描述。
class Person
{
public $name;
public $gender;
public function say()
{
echo $this->name . 'is' . $this->gender;
}
}
这里就是一个类的型,它具有两个属性,一个姓名,一个性别,有一个开口说话的方法。
我们接下来可以产生这个类的实例
person类实例化出两个对象,一个小明,一个小红
$xiaoming = new Person();
$xiaoming->gender = 'boy';
$xiaoming->name = 'xiaoming';
$xiaoming->say();
$xiaohong = new Person();
$xiaohong->name = 'xiaohong';
$xiaohong->gender = 'female';
$xiaohong->say();
类定义了一系列的属性和方法,并提供了实际的操作的细节,这些方法可以对属性进行加工,比如在上面的两个对象中,小明一个say()方法对gender和name属性进行了加工,并且echo 输入了。
类与对象的关系是一种“服务”与“被服务”的关系。
类是属性和方法的集合,也就是说类是属性和方法的组成
序列化
我们var_dump 一下上面实例化出来的 $xiaoming, $xiaohong
发现分别得出用有类似有键值对的数组
到了这里,我们可以很清楚的认识到,对象其实就是一堆数据,既然如此,那么我们就可以把这堆数据存储起来,以便于使用,这就是序列化
所谓序列化,就是把保存在内存当中的各种对象的属性保存起来,并且在用的时候还原。下面我们来尝试一下。
class Person
{
public $name;
public $gender;
public function say()
{
echo $this->name . 'is' . $this->gender;
}
}
$xiaoming = new Person();
$xiaoming->gender = 'boy';
$xiaoming->name = 'xiaoming';
$xiaoming->say();
$str = serialize($xiaoming);
file_put_contents('./aaa.txt',$str );
我们可以打开aaa.txt 看到
O:6:"Person":2:{s:4:"name";s:8:"xiaoming";s:6:"gender";s:3:"boy";}
在需要的时候,我们反序列化取出这个对象
class Person
{
public $name;
public $gender;
public function say()
{
echo $this->name . 'is' . $this->gender;
}
}
$str = file_get_contents('./aaa.txt');
$xiaoming = unserialize($str);
$xiaoming->say();
我们可以继续使用这个对象。
注意:在序列化与反序列化中,我们都需要包含类和对象的定义,不然出现在反序列化中,找不到该类的定义,而找不到里面的方法,获取不到正确的结果
由同一个类生成不同的对象,拥有各自不同的属性,但共享了空间中方法区域的代码,也就是共享了我们这个class类
对象与数组的关系
对象是什么,我们不好理解,但是数组是什么,我们好理解。数组的概念比较简单。下面我们用对象与数组的对比,来帮助我们理解,序列化
$xiaoming = array('name'=>'xiaoming','gender'=>'female');
echo serialize($xiaoming);
结果
a:2:{s:4:“name”;s:8:“xiaoming”;s:6:“gender”;s:6:“female”;}
结论
可以清楚的看出,对象和数组的序列化得出来的效果一模一样,但是在对象中有个指针,值香他所属的类。在上面序列化的Person这几个字符,就标识了这个对象属于这个Person 这个类,所以可以执行该方法。而数组就不能。不信你自己尝试。
结尾
对象就是数据,对象本身是不包过方法,对象有个指针所指向类,这个再去使用该类中的方法。
类和对象是不可以分割,实例化对象后,对象指针所值向类,如果找不到该类就会得不到想要的结果。