人们习惯于按有组织的层次关系思考问题。因此,毫不奇怪,继承这个概念广泛应用于日常生活的很多方面。很多系统都相当依赖于层次概念,公司管理结构、美国税务系统和我们对动植物世界的研究体系只是其中的几个例子。因为面向对象程序设计的前提是:对于要用代码实现的真实世界环境,能够用更接近人的方式对这个环境的性质和行为进行建模,所以还能够表示层次关系就非常有意义。
例如,假设应用程序将类命名为Employee,用来表示从员工中提取的特征和行为。表示这些特征的类成员包括以下几项。
- name:员工姓名。
- age :员工年龄。
- salary :员工工资。
- yearsEmployed :员工在公司里的工作年数。
Employee 类的方法包括以下几项:
- dowork:完成一些与工作相关的任务。
- eatLunck :午餐休息。
- takeVacation :度过两个星期的假期。
这些特征和行为可能与所有类型的员工都有关,而且,无论员工在公司里的作用或职位是什么。但是很明显,员工之间也有差别;例如,主管可以拥有股票,能够侵占公司,而其他员工就没有这样的奢望。助理必须能记录备忘录,办公室管理人员需要建立供应名单。由于存在这些差别,倘若必须为所有类共有的属性创建和维护冗余的类结构,效率就太低了。OOP开发范型考虑了这一点,允许继承现有的类,根据现有的类创建新类。
在PHP中,类继承通过extends关键字实现。代码清单中展示了这一点,在此首先创建一个Employee类,然后创建一个继承自Employee的Executive类。
PS:继承自其它类的类称为子类,子类所继承的类称为父类或基类。
<?php // Define a base Employee class class Employee { private $name; // Define a setter for the private $name member. function setName($name) { if ($name == "") echo "Name cannot be blank!"; else $this->name = $name; } // Define a getter for the private $name member function getName() { return "My name is ".$this->name."<br />"; } } //end Employee class // Define an Executive class that inherits Employee class Executive extends Employee { // Define a method unique to Employee function pillageCompany() { echo "I'm selling company assets to finance my yacht!"; } } //end Executive class // Create a new Executive object $exec = new Executive(); // Call the setName() method, defined in the Employee class $exec->setName("Richard"); // Call the getName() method echo $exec->getName(); // Call the pillageCompany() method $exec->pillageCompany(); ?>
执行的结果:
My name is Richard I'm selling company assets to finance my yacht!
因为所有员工都有姓名,所以Executive类继承了Employee类,避免了必须重新创建name成员及相应获取方法和设置方法的麻烦。然后可以专心实现主管所特有的性质,在这里就是一个名为pillageCompany()的方法。此方法只在Executive类型的对象中可用,在Employee类或其他类中都不能使用(除非是继承自Executive的类)。下面的示例演示了这个概念,这里给出了一个继承自Executive的CEO类:
<?php class Employee{ ... } class Executive enxtends Employee{ ... } class CEO extends Executive{ function getFacelift(){ echo "nip nip tuck tuck"; } } $ceo= new CEO(); $ceo->setName("Bernie"); $ceo->pillageCompany(); $ceo->getFacelift(); ?>
因为CEO继承自Executive,所以CEO类型的对象也具有Executive可用的所有成员和方法。除了getFacelift()方法,Executive也为CEO类型的对象所唯一保留。
下面补个简单的例子:
<?php class Fruit { private $name ; function __construct($name) { $this->name = $name; } function showName() { echo $this->name."<br />"; } } class Apple extends Fruit { private $color; function __construct() { parent::__construct("苹果"); $this->color = "红色"; } function showColor() { echo $this->color; } } $apple = new Apple(); $apple->showName(); $apple->showColor(); ?>