
3.3 通过类实例化对象

类是对象的模板,所以对象需要通过类来实例。
3.3.1 实例化对象
类定义完成以后,接下来便可以使用类中的成员和方法了。但不像使用函数那么简单,因为类是一个抽象的描述,是功能相似的一组对象的集合。如果想使用类中的方法和属性,首先需要把它落实到一个实体,也就是对象上。所以需要先实例化一个对象,通过该对象调用方法和属性。
实例化是通过关键字new完成的,具体格式如下:

【例3-1】(实例文件:ch03\Chap3.1.php)实例化对象。

在IE浏览器中运行结果为“小明想学习PHP”。
3.3.2 对象中成员的访问
访问成员属性和成员方法是一样的,都是使用实例化对象调用。具体的格式如下:

下面通过一个实例进行介绍。
【例3-2】(实例文件:ch03\Chap3.2.php)访问对象的属性和方法。

在IE浏览器中运行结果如图3-1所示。

图3-1 访问对象的属性和方法
3.3.3 特殊的对象引用$this
3.3.2节介绍了在对象外访问对象的属性和方法,即“对象->成员属性、方法”。如果想在对象的内部,让对象里的方法访问本身对象的属性或方法时,如何实现呢?
因为对象里面的所有的成员都要用对象调用,包括对象的内部成员之间的调用,所以PHP提供了一个对本身对象的引用$this。每个对象里面都有一个对象的引用$this代表这个对象,完成对象内部成员的调用。
【例3-3】(实例文件:ch03\Chap3.3.php)$this的应用。

在IE浏览器中运行结果如图3-2所示。

图3-2 $this的应用
3.3.4 构造函数与析构函数
构造函数是类中的一个特殊函数,当使用new关键字实例化对象时,相当于调用了类的构造函数。实例化对象时自动调用,用于给对象的属性赋初值。
析构函数也是类中的特殊函数,在对象被销毁释放之前自动调用,并且该函数不能带有任何的参数。
1. 构造函数
PHP 5允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
当一个类实例化一个对象时,可能会有很多的类属性。例如下面Person类中的成员属性:

定义一个Person类的对象,并对这个类的成员属性赋初值。代码如下:

可以发现,如果赋初值比较多,写起来相当麻烦。为此,PHP引入构造函数。构造函数是生成对象时自动执行的成员方法,作用是初始化对象。构造函数可以没有参数,也可以有多个参数。定义构造函数的语法格式如下:

【例3-4】(实例文件:ch03\Chap3.4.php)构造函数的应用。

在IE浏览器中运行结果如图3-3所示。
从例3-4可以看出,使用构造函数,在实例化对象时只需一条语句即可完成对成员变量的赋值。
注意:如果子类中定义了构造函数,则不会隐式调用其父类的构造函数;要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。如果子类没有定义构造函数,则会如同一个普通的类方法一样,从父类继承。

图3-3 构造函数的应用
2. 析构函数
析构函数会在到某个对象的所有引用都被删除或者当对象显示销毁时执行,作用是释放内存。定义析构函数的语法格式如下:

【例3-5】(实例文件:ch03\Chap3.5.php)析构函数的应用。

在IE浏览器中运行结果如图3-4所示。

图3-4 析构函数的应用
提示:PHP采用的是一种“垃圾回收”机制,自动清除不再使用的对象,释放内存。也就是说,即使不使用unset()函数,析构函数也会自动被调用。