第6章 面向对象的PHP

本章将介绍面向对象开发的概念,以及这些概念是如何在PHP中实现的。

PHP的面向对象实现提供了一个全面的面向对象语言所能提供的所有特性。随着本章内容的深入,我们将详细介绍每一个特性。

在本章中,我们主要介绍以下内容:

■面向对象的概念

■类、属性和操作

■类属性

■类常量

■类方法的调用

■继承

■访问修饰符

■静态方法

■类型提示

■延迟静态绑定

■对象克隆

■抽象类

■类设计

■设计的实现

■高级的面向对象功能

6.1 理解面向对象的概念

对于软件开发来说,当今编程语言大多支持甚至要求使用面向对象的方法。面向对象(OO)的开发方法试图在系统中引入对象的分类、关系和属性,从而有助于程序开发和代码重用。

6.1.1 类和对象

在面向对象软件的上下文中,对象可以用于表示几乎所有实物和概念——可以表示物理对象,例如“桌子”或者“客户”;也可以表示只有在软件中才有意义的概念性对象,如“文本输入区域”或者“文件”。通常,在软件中,我们对对象最感兴趣,这些对象当然既包括现实世界存在的实物对象,也包括需要在软件中表示的概念性对象。

面向对象软件由一系列具有属性和操作的自包含对象组成,这些对象之间能够交互,从而达到我们的要求。对象的属性是与对象相关的特性或变量。对象的操作则是对象可以执行的、用来改变其自身或对外部产生影响的方法、行为或函数(属性可以与成员变量和特性这些词交替使用,而操作也可以与方法交替使用)。

面向对象软件的一个重要优点是支持和鼓励封装的能力——封装也叫数据隐藏。从本质上说,访问一个对象中的数据只能通过对象的操作来实现,对象的操作也就是对象的接口。

一个对象的功能取决于对象使用的数据。在不改变对象的接口的情况下,能很容易地修改对象实现的细节,从而提高性能、添加新性能或修复bug。在整个项目中,修改接口可能会带来一些连锁反应,但是封装允许在不影响项目其他部分的情况下进行修改或修复bug。

在软件开发的其他领域中,面向对象已经成为一种标准,而面向功能或过程的软件则被认为是过时的。不幸的是,由于种种原因,大多数Web脚本仍然是使用一种面向功能的特殊方法来设计和编写的。

存在这种情况的原因是多方面的:一方面,多数Web项目相对比较小而且直观。我们可以拿起锯子就做一个木制的调味品的架子而不用仔细规划其制作方法。同样,对于Web项目,由于网站规模太小,设计者也可以这样不经过仔细规划而成功地完成大多数Web项目。然而,如果不经过计划就拿起锯子来建造一栋房子,房子的质量就没有保证了。同样的道理也适用于大型的软件项目——如果我们要想保证其质量的话。

许多Web项目就是从一系列具有超链接的页面发展成为复杂的Web应用程序的。这些复杂的应用程序,不管是使用对话框和窗口,或者是动态生成的HTML页面来表示,都需要使用适当的方法对开发方法加以规划。面向对象可以帮助我们管理项目中的复杂度,提高代码的可重用性,从而减少维护费用。

在面向对象的软件中,对象是一个被保存数据和操作这些数据的操作方法的唯一、可标识的集合。例如,我们可以定义两个代表按钮的对象,虽然它们具有相同的"OK"标签,而且宽都是60像素,高都是20像素,其他属性也都相同,但是仍然要将两个按钮作为不同的对象处理。在软件中,我们用不同的变量作为对象的句柄(唯一标识符)。

对象可以按类进行分类。类是表示彼此之间可能互不相同,但是必须具有一些共同点的对象集合。虽然类所包含的对象可能具有不同属性值,但是,这些对象都具有以相同方式实现的相同操作以及表示相同事物的相同属性。

名词“自行车”可以被认为是描述了多辆不同自行车的类,这些对象具有相同的特性或属性(譬如两个车轮,一种颜色和一种尺寸大小)以及相同的操作(例如,移动)。

我自己的自行车可以被认为是这种自行车类的一个对象。它拥有所有自行车的共同特征,与其他自行车一样,都有一个操作——移动,移动方式也与其他自行车一样,虽然我的自行车很少使用。它的属性却有唯一值,因为我的自行车是绿色的,并不是所有自行车都是这种颜色的。