抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。
接口:它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。
(1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。
(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。
(3)抽象类中可以有构造方法,但是接口没有构造方法。
(4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。
(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。
(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。
<?php
// PHP抽象类示例
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . PHP_EOL;
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('DYP_') . PHP_EOL;
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('DYP_') . PHP_EOL;
// 执行结果
/*
ConcreteClass1
DYP_ConcreteClass1
ConcreteClass2
DYP_ConcreteClass2
*/
<?php
// 接口示例
// 小灵通接口
interface Xlt
{
public function tel();
}
// mp3接口
interface Mp3
{
public function music();
}
// mp4接口
interface Mp4 extends Mp3
{
public function video();
}
// 手机类(包含所有功能)
class Mobile implements Xlt,Mp4
{
public function tel(){ // 重写打电话
echo '正在打电话....'.PHP_EOL;
}
public function music(){ // 重写听歌
echo '我在听歌...'.PHP_EOL;
}
public function video(){ // 重写视频
echo '播放视频中....'.PHP_EOL;
}
}
$obj = new Mobile();
$obj->tel();
$obj->music();
$obj->video();
// 执行结果
/*
正在打电话....
我在听歌...
播放视频中....
*/
<?php
// 抽象类示例2
abstract class Stu { // 定义抽象类
const TITLE = '代元培';
abstract public function name($age, $sex); // 定义抽象方法
}
class Sure extends Stu { // 继承抽象类
public function name($age, $sex){
$str = self::TITLE;
$str .= '年龄是'.$age.',性别是'.$sex.PHP_EOL;
return $str;
}
}
// 抽象类不能被实例化,不能 new Stu,不然报错。
// 抽象方法必须继承,不然报错。
$obj = new Sure();
echo $obj->name(28,'男');
// 执行结果
// 代元培年龄是28,性别是男