抽象方法
在OPP语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法作为外部代码访问它的接口。而抽象类是方便继承引入的。抽象类中的抽象方法就是没有方法体的方法,所谓没有方法体就是没有花括号以及其中的内容,而是在声明方法时直接在方法名后面加上分号结束。抽象方法用abstract关键字修饰。
abstract function fun1();
abstract function fun2();
只要声明类时有一个方法是抽象方法,那么这个类就是抽象类,抽象类也要使用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();//抽象方法
}
抽象类不能被实例化,即创建不了对象,也就不能直接使用它。使用抽象类就包含继承关系,它是为子类定义公共接口,将它的操作(可能是部分也可能是全部)交给子类去实现。当子类继承抽象类以后,就必须把抽象类中的抽象方法按照子类自己的需要去实现。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法,所以还是抽象类,也不能实例化对象。
//必须要实现父类所有抽象方法才能被实例化
class chianeseMan extends Person{
function say(){
echo $this->name."是".$this->country."人,讲汉语<p/>";
}
function eat(){
echo $this->name."用筷子吃饭<p/>";
}
}
class Americans extends Person{
function say(){
echo $this->name."是".$this->country."人,讲英语<p/>";
}
function eat(){
echo $this->name."用刀子和叉子吃饭<br/>";
}
}
$chineseman=new chianeseMan("若见");
$americans=new Americans("alerx","美国");
$chineseman->say();
$chineseman->eat();
$americans->say();
$americans->eat();
//结果如下
若见是china人,讲汉语
若见用筷子吃饭
alerx是美国人,讲英语
alerx用刀子和叉子吃饭
接口技术
因为PHP只支持单继承,也就是说一个类只能继承一个父类。当声明的新类继承抽象类实现模板以后,他就不能有其他父类了,为了解决这个问题,PHP引入接口。接口是一种特殊的抽象类,抽象类是一种特殊的类,所以接口也是一种特殊的类。如果抽象类中的所有方法都是抽象方法,我们就可以换另外一种声明方式,使用接口技术。接口中声明的方法必须都是抽象方法,另外不能在接口中声明变量,只能使用const关键字声明为常量的成员属性,而且接口中所有成员都必须有public的访问权限。接口声明用interface关键字标识。
interface 接口名称{ //使用interface关键字声明接口
//常量名 //接口中成员属性只能声明常量 不能是变量
//抽象方法 //接口中所有方法必须都是抽象方法 不能有非抽象方法的存在
}
interface one{
//默认都是public
const CONST="CONST VALUE";
//接口中所有方法都要求是抽象方法,所有不需要在方法前加abstract关键字标识
function fun1();
function fun2();
}
如果需要使用接口中的成员,则需要通过子类去实现接口中的全部抽象方法,然后创建子类的对象去调用在子类中实现后的方法。但是通过类去继承接口使用implements关键字实现,如果需要使用抽象类去实现接口中的部分方法,也需要使用implements关键字实现。
//通过类去继承接口
class For implement one {
function fun1(){
//具体实现的内容
}
function fun2(){
//具体实现的内容
}
}
//抽象类去实现接口
abstract class Three implement one {
function fun1(){
//具体实现的内容
}
}