通过上一节的学习咱们已经懂得了如何去定义一个类,本节将会给大家介绍如何将一个定义好的类实例化成对象以及如何使用对象,访问对象中的数据域以及方法,修改其中数据域的值等。其中也会穿插一些关于数据时如何存放在内存当中的小知识

实例化

那设计图咱们已经做好了,如何通过这么一个设计图来制作我们的产品呢?在 php 中我们通过关键字 new 来实例化一个类。如下所示:

$变量名 = new 类名();

比如我们要把上一节的 person 类实例化:

<!--?php 

class person {

    var $name;
    var $sex;
    var $age;
    var $hight;
    var $weight;
    var $phoneNum;
    var $address;

    function canSpeakEnglish() {
        echo "I can speak English";
    }

    function canProgram() {
        echo "I can program";
    }

    function canDesign() {
        echo "I can design";
    }

}

$person1 = new person();      //实例化类person,创建对象person1
$person2 = new person();      //实例化类person,创建对象person2
$person3 = new person();      //实例化类person,创建对象person3

?-->

如此一来我们就有 person 类实例化出了三个对象$person1,$person2,$person3。请注意,这里的每个对象都是独立的。上面的代码相当于实例出来3个人来, 每个人之间是没有联系的, 只能说明他们都是人类,每个人都有自己的姓名, 性别和年龄的属性,每个人都有说话和走路的方法,只要是类里面体现出来的成员属性和成员方法,实例化出来的对象里面就包含了这些属性和方法。

为了解释清楚为何对象之间相互独立,我们得先了解一点 php 中变量的在内存中的储存机制。

关于变量的储存机制

对像在 php 里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的。程序运行时,对象由相应的类实例化并被加载到内存当中,那么,对象在内存里面是怎么体现的呢?内存从罗辑上说大体上是分为 4 段,栈空间段堆空间段代码段初使化静态段, 程序里面不同的声明放在不同的内存段里面,栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型 1, 10, 100, 1000, 10000, 100000 等等,在内存里面占用空间是等长的,都是 64 位 4 个字节。 数据长度不定长,而且占有空间很大的数据类型的数据则放在堆内存里面栈内存是可以直接存取的,而堆内存是不可以直接存取的内存。对于我们的对象来说就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可以使用对象了

说了这么多估计大家都给绕晕了,请看图:

在程序运行到这段代码

$person1 = new person();
$person2 = new person();

的时候

OOP-PHP-CH03-IMG1

如图所示,程序将会在堆内存中申请出一个空间,用于存放对象的各个参数;在盏内存中申请出一个空间,用于存放堆内存中该对象存放空间的首地址。即 $person1 存放的是该对象在堆内存中的存放首地址,而存放首地址记录该对象在堆内存中的位置。

相信大家也都看出来了,$person1 变量就相当于一个指针,记录着该对象的存放位置。

可以看出 $p1=new Person(); 等号右边是真正的对象实例,在堆内存里面的实体,上图一共有 2 次 new Person(),所以会在堆里面开辟 2 个空间,产生 2 个实例对象,所以每个对象之间都是相互独立的,他们都使用自己的占有空间。

使用

在了解了对象的储存机制以后我们言归正传,在类实例化出对象后,我们要怎样访问,修改数据域,调用里面的方法呢?

下面来介绍一下我们的一个特殊的操作符“->”,没错他长得是不是非常的像箭头,它的使用方法非常简单:

$对象名 -> 数据域;
$对象名 -> 方法;

举个栗子,比方说我要访问 $person1 对象里面的内容,可以这样写:

<!--?php 

//省略类的定义,若有需要请参考上文。

$person1 = new person();

$person1->name = "Cindy";  //修改 person1 对象的名字为"Cindy"
echo $person1->name;       //输出 person1 的名字

$person1->sex = "female";  //修改 person1 对象的性别为女性
$person1->age = 16;        //修改 person1 对象的年龄为16岁
if ($person1->age <= 18) { //如果 person1 的年龄少于18岁则输出
    echo "She just a girl.."; 
}

?-->

好吧其实你会发现“->”运算符他不仅长得像箭头,其实他就是一个箭头,指向在堆内存中你想要访问的内容。