<?php
/**
*要充分发挥抽象类的特点,就必须牢记以下规则:
*某个类只要包含至少一个抽象方法就必须声明为抽象类
*声明为抽象的方法,在实现的时候必须包含相同的或者更低的访问级别。例如,如果某个方法在抽象类中的访问级别是受保护的,在继承中它就必须是受保护的或者公共的,而不能是私有的。
*不能使用new关键字创建抽象类的实力。
*被声明为抽象的方法不能包含函数体。
*如果将扩展的类也声明为抽象的,在扩展抽象类时,就可以不用实现所有的抽线方法。在创建具有层次结构的对象时,这种做法很有用的。
*/
//在类的声明中使用abstract修饰符就可以将某个类声明为抽象的。
//下面的代码中定义了一个抽象类,其中包含了一个具有完整实现的方法和一个将在继承类中实现的抽象方法。
/* 定义一个抽象基本类 */
abstract class Car {
//任何基类方法
abstract function getMaximumSpeed(); //不用出现方法体
}
//这个类是抽象的,不能实例化。要获得一个实例化,首先必须扩展它。
//创建一个从 Car 类继承的名 FastCar 的类,并且定义一个getMaximumSpeed() 方法。
/* 继承抽象类 */
class FastCar extends Car {
function getMaximumSpeed() {
return 150;
}
}
//有一个可以实例化的类 FastCar.
//下一步,可以创建另外一个类 Street ,它将用到抽象类提供的公共功能。
/* 使用抽象类提供的公共功能 */
class Street {
protected $speedLimit;
protected $cars;
public function __construct($speedLimit = 200) {
$this->cars = array(); //对变量进行初始化
$this->speedLimit = $speedLimit;
}
public function isStreetLegal($car) {
if($car->getMaximumSpeed() < $this->speedLimit) {
return true;
} else {
return false;
}
}
public function addCar($car) {
if($this->isStreetLegal($car)) {
echo ‘The Car was allowed on the road.‘;
$this->cars[] = $car;
} else {
echo ‘The Car is too fast and was not allowed on the road.‘;
}
}
}
//Street 类包含了一个 addCar() 方法,作用是获得一个派生的 Car 类的实力。
//现在,可以是使用 Street 类,并且向 addCar() 方法传入一个 FastCar 类的实例。 //addCar() 方法调用了 isStreetLegal() 方法,而这个方法将会调用定义在 FastCar 类中的 getMaximumSpeed() 方法。
$street = new Street();
$street->addCar(new FastCar()); //The Car was allowed on the road.
//使用抽象类,我们就可以确定所有继承自Car的对象都会实现getMaximumSpeed()方法,从而共享这个公共的功能。如果继承子Car的类没有定义这个方法,就会导致语法错误,程序也就不会运行。这种限制确保了在实例化层次上的兼容性,这样我们就不需要在发生错误了之后调试代码以找出某个对象没有宝华特定方法的原因了。
//然而,抽象类也有一些限制。PHP 只支持从一个基类继承,而不支持从两个或者更多的抽象类继承。从两个或更多的基类继承的能努力通常被称为多重继承,PHP在设计上是禁止这种功能的。原因在于,当两个或更多的类定义了具有相同原型且完整实现的方法时,从多个类继承会导致不必要的复杂性。当发现需要从两个或更多抽象类继承时,可以将基类的方法拆开,然后使用接口达到相同的目的。