PHP面向对象 1.8 抽象类与接口
抽象类与接口类似,都是一种比较特殊的类。抽象类是一种特殊的类,而接口是一种特殊的抽象类
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{
//实现接口中的抽象方法
}
还没有评论,来说两句吧...