您的位置:首页 > 编程语言 > PHP开发

PHP面向对象 1.8 抽象类与接口

2015-12-07 09:58 423 查看
抽象类与接口类似,都是一种比较特殊的类。抽象类是一种特殊的类,而接口是一种特殊的抽象类

1. 抽象类

抽象方法没有方法体,指没有花括号及其中的内容,而是直接在声明方法时直接在后面加上分号结束。声明抽象方法还要使用关键字abstract修饰。

abstract function fun1();//不能有花括号及其中的内容,直接在方法名的括号后面加上分号,并且用abstract修饰


只要在声明类时有一个方法是抽象方法,那么这个类就是抽象类,抽象类也要使用abstract关键字修饰。在抽象类中可以有不是抽象的成员方法和成员属性,但访问权限不能使用private关键字修饰为私有的。

<?php
abstract class Person{
protected $name;       //声明一个存储人的名字的成员
protected $country;        //声明一个存储人的国家的成员

function __construct($name = "",$country = "china"){
$this->name = $name;
$this->country = $country;
}
//在抽象类中声明一个没有方法体的抽象方法
abstract function say();

//在抽象类中声明一个没有方法体的抽象方法
abstract function eat();

//在抽象类中可以声明正常的非抽象方法
function run(){
echo "使用两条腿走路<br/>";    //有方法体,输出一条语句
}
}


抽象类中由于含有没有被实现的抽象方法,所以抽象类是不能被实例化的,即创建不了对象,也就没法直接使用它。

抽象类为子类定义公共的接口,将它的操作交给子类实现,相当于为子类定义了一种规范。

子类必须把父类中的抽象方法全部实现,否则子类中还存在抽象方法,所以还是抽象类,不能实例化对象

//声明一个类去继承抽象类Person
class ChineseMan extends Person{
//将父类中的抽象方法覆盖,按自己的需求去实现
function say(){
echo $this->name."是".$this->country."人,讲汉语<br/>";//实现内容
}

function eat(){
echo $this->name."使用筷子吃饭<br/>";
}
}

class Americans extends Person{
function say(){
echo $this->name."是".$this->country."人,讲英语";

}

function eat(){
echo $this->name."使用刀叉吃饭<br/>";
}
}

$chineseMan = new ChineseMan("常智","中国");
$americans = new Americans("chris-chang","美国");
$chineseMan -> say();
$chineseMan -> eat();

$americans -> say();
$americans -> eat();


2. 接口技术

为了解决PHP只能单继承的问题,PHP引入接口。接口中声明的方法必须都是抽象抽象方法。另外不能在接口中声明变量,只能使用const关键字声明为常量成员属性。

interface 接口名称{     //使用interface关键字声明接口
//常量成员       //接口中的成员属性只能是常量,不能是变量
//抽象方法       //接口中的所有方法必须是抽象方法
}


接口中的所有的方法都要求是抽象方法,所以就不需要在方法前使用abstarct关键字标识,而且在接口中也不需要显式地使用public访问权限进行修饰,接口的声明使用interface关键字,可以直接使用接口名称在接口外面获取常量成员的值

一个接口可以继承另一个接口

<?php
interface One{
const CONSTANT = 'CONSTANT VALUE';
function fun1();
function fun2();
}

interface Two extends One{  //继承One接口
function fun3();
function fun4();
}


如果要通过类去继承接口,需要使用implements关键字是实现,下面是使用Three抽象类实现One接口中的方法。但如果要想实例化对象,这个抽象类还需要有子类把所有的抽象方法都实现才行。

<?php
//声明一个抽象类实现接口One的fun2()
abstract class Three implements One{
function fun2(){
//实现内容
}
}

//声明一个类实现接口One中的全部方法
class Four implements One{
function fun1(){
//实现内容
}

function fun2(){
//实现内容
}
}


PHP是单继承,一个类只能有一个父类,但是一个类可以实现多个接口,将要实现的多个接口之间使用逗号隔开,而且在子类中要将所有接口中的抽象方法全部实现才可以创建对象

class 类名 implements 接口一,接口二,...,接口n{//一个类实现多个接口
//实现接口中的抽象方法
}


可以同时使用”extends”关键字继承一个类,即在继承一个类的同时实现多个接口,但是一定要先使用extends继承一个类,再去使用implements实现多个接口

class 类名 extends 父类名 implements 接口一,接口二,接口三....,接口n{
//实现接口中的抽象方法
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: