文章教程

7.3.1继承

9/17/2020 9:38:49 PM 人评论 次浏览

7.3 类的继承和多态

继承和多态是面向对象程序设计思想的重要机制。类可以继承其他类的内容,包括成员变量和成员函数。而从同一个类中继承得到的子类也具有多态性,即相同的函数名在不同子类中有不同的实现。就如同子女会从父母那里继承到人类共有的特性,而子女也具有自己的特性。本节将介绍PHP语言中继承和多态的机制。

7.3.1 继承

通过继承机制,用户可以很方便地继承其他类的工作成果。如果有一个设计完成的类A,可以从其派生出一个子类B,类B拥有类A的所有属性和函数,这个过程叫做继承。类A被称为类B的父类。

可以使用extends关键字定义派生类。例如,存在一个类A,定义代码如下:

class A {

var propertyA; //类A的成员变量

function functionA;  // 类A的成员函数

}

从类A派生一个类B,代码如下:

class B extends A {

var propertyB; //类B的成员变量

function functionB;  // 类B的成员函数

}

从类B中可以访问到类A中的成员变量和成员函数,例如:

objB = new B;    // 定义一个类B的对象objB

echo(objB->propertyA);  // 访问类A的成员变量

objB->functionA();   // 访问类A的成员函数

因为类B是从类A派生来的,所以它继承了类A的属性和方法。

【例7-13】 一个关于类继承的实例。

<?PHP

class Users {

public $userName;

function __construct($name="") {

$this->userName = $name;

}

public function dispUserName() {

echo($this->userName);

}

}

class UserLogin extends Users {

private $lastLoginTime;

function __construct($name="") {

$this->userName = $name;

$cur_time = getdate();

$this->lastLoginTime =$cur_time['year'] . "-" . $cur_time['mon'] . "-" . $cur_time['mday'] . " " . $cur_time['hours'] . ":" . $cur_time['minutes'] . ":" . $cur_time['seconds'] . "\n";

}

function dispLoginTime() {

echo("登录时间为:" . $this->lastLoginTime);

}

}

//声明3个对象

$myUser_1 = new UserLogin('admin');

$myUser_2 = new UserLogin('lee');

$myUser_3 = new UserLogin('zhang');

//分别调用父类和子类的函数

$myUser_1->dispUserName();

$myUser_1->dispLoginTime();

$myUser_2->dispUserName();

$myUser_2->dispLoginTime();

$myUser_3->dispUserName();

$myUser_3->dispLoginTime();

?>

在上面的PHP程序中,首先定义了一个类Users,用于保存用户的基本信息。类Users包含一个成员变量$userName 和一个成员函数 dispUserName()。dispUserName()用于显示成员变量$userName的内容。

类UserLogin是类Users的子类,它包含一个私有变量$lastLoginTime,用于保存用户最后一次登录的日期和时间。在类 UserLogin 的构造函数中,程序调用 getdate()函数获取当前的系统时间,然后将其赋值到成员变量$lastLoginTime 中。类 UserLogin 还包含一个成员函数dispLoginTime(),用于显示变量$lastLoginTime的内容。

在两个类的定义代码后面,程序中声明了3个UserLogin对象。然后分别使用这3个对象调用类Users的dispUserName()函数和类UserLogin的dispLoginTime()函数。

7.3.2 抽象类和多态

使用面向对象程序设计思想可以通过对类的继承实现应用程序的层次化设计。类的继承关系是树状的,从一个根类中可以派生出多个子类,而子类还可以派生出其他子类,依此类推。每个子类都可以从父类中继承成员变量和成员函数,实际上相当于继承了一套程序设计框架。

PHP支持抽象类的概念。抽象类是包含抽象函数的类,而抽象函数不包含任何实现的代码,只能在子类中实现抽象函数的代码。例如,在绘制各种图形时,都可以指定绘图使用的颜色($Color 变量),也需要包含一个绘制动作(Draw 函数)。而在绘制不同图形时,还需要指定一些特殊的属性。例如,在画线时需要指定起点和终点的坐标,在画圆时需要指定圆心和半径等。可以定义一个抽象类Shape,包含所有绘图类所包含的$Color变量和Draw函数;分别定义画线类MyLine和画圆类MyCircle,具体实现Draw函数。所谓多态,指抽象类中定义的一个函数,可以在其子类中重新实现,不同子类中的实现方法也不相同。

在PHP中,可以使用abstract关键字定义抽象类。在抽象类中,通常需要定义一些抽象函数。抽象函数同样需要使用abstract关键字来定义。语法如下:

abstract class 抽象类名称{

var 成员变量

abstract function 抽象函数

}

【例7-14】 下面通过一个实例来演示抽象类和多态。首先创建一个抽象类Shape,它定义了一个画图类的基本框架,代码如下:

abstract class Shape {

var $color;  // 指定画图用的颜色

abstract function draw();

}

如果从抽象类中派生一个类,则必须给出抽象函数的具体实现,否则会提示错误信息。例如,创建类Shape的子类circle,代码如下:

class circle extends Shape {

var $x, $y, $radius;  // 定义圆心坐标和半径

}

编译PHP程序,会提示如下错误信息:

PHP Fatal error: Class circle contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Shape::draw) in C:\workspace\test\hello.php on line 9

说明类circle中必须实现抽象类Shape中的抽象函数draw()。在类circle中实现函数draw(),代码如下:

class circle extends Shape {

public $x, $y, $radius;  // 定义圆心坐标和半径

function draw() {

echo("Draw Cicle: Color $this->color; ($this->x, $this->y); Radius$this->radius\n");

}

}

再从类Shape中派生出画直线的类line,代码如下:

class line extends Shape {

public $x1, $y1, $x2, $y2; // 起止坐标值

function draw() {

echo("Draw Line: Color $this->color; ($this->x1, $this->y1) => ($this->x2, $this->y2)\n");

}

}

可以看到,在不同的子类中,抽象函数draw()有不同的实现。

定义一个类 circle 的对象$mycircle,对类中的成员变量进行赋值,然后调用 draw()函数,代码如下:

$mycircle = new circle();

$mycircle->x = 100;

$mycircle->y = 100;

$mycircle->radius = 50;

$mycircle->color = "red";

$mycircle->draw();

输出结果如下:

Draw Cicle: Color red; (100, 100); Radius 50

定义一个类 line的对象$myline,对类中的成员变量进行赋值,然后调用 draw()函数,代码如下:

$myline = new line();

$myline->x1 = 100;

$myline->y1 = 100;

$myline->x2 = 200;

$myline->y2 = 200;

$myline->color = "blue";

$myline->draw();

输出结果如下:

Draw Line: Color blue; (100, 100) => (200, 200)

教程类别