第二十回、PHP基础教程,面向对象的基本概念及类的定义

什么是面向对象

起初,“面向对象”是专指在程序设计中采用封装、继承、抽象等设计方法。可是,这个定义显然不能再适合现在情况。面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Program)。

传统的程序开发存在着以下的问题:

1.软件重用性差 ,2.软件可维护性差,3.无很好的扩展性。

面向对象程序设计的要素:

1. 抽象性 , 2. 封装性 ,3.共享性 ,4. 强调对象结构而不是程序结构

面向对象的三大特点(封装,继承,多态)缺一不可。

1.1.2 什么是类

所谓类就是指由变量和作用于变量的函数组成的集合。类提供了一种对现实世界中事物的描述方式。通过有效的使用类,我们可以将描述同一对象的多个变量和函数组合在一起,作为一个整体使用,从而使编写出来的程序更直观,更合理,更易于维护。

举一个比较通俗的例子,我们可以创建一个名为Bike的类来描述现实生活中的一辆自行车。

首先,我们设定该类中的变量包括踏板$pedals,链条$chain,前轮$front wheel,后轮$rear wheel,刹车$brakes,以及手柄$handle。然后,我们创建停车Stop(),加速Accelerate(),左转TurnLeft()和右转TurnRight()等函数。这样,我们就有了一个可以描述自行车这一对象所有行为和属性的类。例如,我们可以将$front wheel 和$rear wheel变量传入TurnLeft()函数,从而得到某种输出结果。

也许有人会问上述例子虽然有趣,但是我们完全可以使用常规的变量和函数实现同样功能,为什么一定要坚持使用这么烦琐的类呢?当然,如果我们在脚本中只需要描述一辆自行车的话,定义一个类似乎没有什么特殊的价值。但是,如果当脚本需要涉及多辆自行车时呢?如果我们还是采用常规的为每辆自行车都定义变量和函数的方法,那么光是跟踪每个变量,确保正确的变量输入正确的函数就是一项相当复杂的工作。相反,如果采用类的方式,就可以有效的减少所需变量的数量。此外,一个已经定义的类还可以被包含在其它文件或脚本中,从而实现代码的重复利用。

基本语法:

class 类名

{

……

}

举例:

class myClass//定义一个名为myClass的类

{

public $name;

var $price;

//为这个类定义了两个成员属性$name和$price

function vod()//为这个类定义了一个成员方法vod

{

return “PHP进阶”;

}

}

注释:

var是PHP4中使用的变量定义形式,在PHP5中被public取代,建议使用public。

6.2.1 类的实例化

类被定义后并不能像自定义函数一样拿来直接的使用,要使用类,必需对其进行实例化,也就是将类所表现的对象进行实例化。

基本语法:

$varName=new 类名(参数列表);

//不需要向类中传递参数时,使用空的小括号,否则将实参放入小括号中

$x=$varName->name;

//使用”->”访问对象中的内容,注意这里name前没有$符号了

阶段实例:

<?php

class myClass

{

public $key;

var $name;

function vod()

{

echo “PHP高级编程进阶”;

}

}

$my=new myClass();

$my->name=”PHP”;

//给myClass类中的属性name赋值”php”

echo $my->name;

//输出属性name的值”PHP”

echo $my->vod();

//访问类中的方法vod(),输出”PHP高级编程进阶”

?>

6.2.2 通过一个类创建一个或多个对象

通过一个类创建一个或多个对象我们需要多次使用new函数。

例:

$my1=new myClass();

$my2=new myClass();

$my3=new myClass();

通过一个myClass创建了三个对象$my1、$my2、$my3。

6.2.3类中$this关键字的使用

$this关键字是用来访问当前对象中的对象属性和对象方法的系统变量。它使用在书写一个类的源码中。

例:

Class myClass

{

public $name;

public $price;

function vod()

{

$this->name;

}

……

$this-vod();

//使用$this访问本身的vod()方法

 ……

}