深入对象与类的关系理论篇(序列化与类的关系)

来源:互联网 发布:中国人工智能 知乎 编辑:程序博客网 时间:2024/06/15 06:03

深入对象与类的关系理论篇(序列化与类的关系)

最近在一本书上,偶尔看到了对象与序列化的一个转换,然后和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 一下上面实例化出来的 xiaomingxiaohong

发现分别得出用有类似有键值对的数组

键值对

到了这里,我们可以很清楚的认识到,对象其实就是一堆数据,既然如此,那么我们就可以把这堆数据存储起来,以便于使用,这就是序列化

所谓序列化,就是把保存在内存当中的各种对象的属性保存起来,并且在用的时候还原。下面我们来尝试一下。

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 这个类,所以可以执行该方法。而数组就不能。不信你自己尝试。

结尾

对象就是数据,对象本身是不包过方法,对象有个指针所指向类,这个再去使用该类中的方法。

类和对象是不可以分割,实例化对象后,对象指针所值向类,如果找不到该类就会得不到想要的结果。

0 0
原创粉丝点击