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

本文探讨了面向对象编程中的对象与类的关系,解释了类是对象的抽象描述,对象是类的具体实例。进一步讨论了序列化在PHP中的作用,将对象转化为可存储的数据形式,便于保存和恢复。通过实例展示了对象与数组在序列化后的区别,强调了对象的类标识在序列化过程中的重要性。
摘要由CSDN通过智能技术生成

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

最近在一本书上,偶尔看到了对象与序列化的一个转换,然后和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 这个类,所以可以执行该方法。而数组就不能。不信你自己尝试。

结尾

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值