<?php /** *为了声明接口,需要使用关键字interface *interface IExampleInterface {} *说明(大多数开发人员选择在节后名称前加上大写字母I作为前缀,以便在代码和生成的文档中将其与类区别开来) *和继承抽象类需要使用extends关键字不同的是,实现接口使用的是implements关键字。 *class ExampleClass implements IExampleInterface {} *前面提到过,接口优于抽象类的一点是每个类可以使用多个接口。当希望在一个类中实现两个或者两个以上接口时,我们可以用逗号将它们隔开。例如,如果有一个具有数组风格的对象,希望它同时具有迭代和计数的功能,那么我们可以定义这样的一个类。 *class MyArrayLikeObject implements Iterator, Countable {} * * */ interface ISpeedInfo { function getMaximumSpeed(); } class Car { //任何基类方法 } class FastCar extends Car implements ISpeedInfo { function getMaximumSpeed() { return 150; } } class BadCar extends FastCar{} $a = new FastCar(); echo $a->getMaximumSpeed();//150 echo '<br />'; class Street extends FastCar { protected $speedLimit; protected $cars; public function __construct($speedLimit = 200) { $this->cars = array(); //初始化变量 $this->speedLimit = $speedLimit; } function isStreetLegal($car) { if($car instanceof ISpeedInfo) { if($car->getMaximumSpeed() < $this->speedLimit) { return true; } else { return false; } } else { //扩展类必须实现ISpeedInfo才能使street合法 return false; } } public function addCar($car) { if($this->isStreeLegal($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.'; } } } /* class Street extends FastCar{} */ $a = new Street(); echo $a->getMaximumSpeed(); //150