抽象方法和接口

抽象方法

在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(){
        //具体实现的内容
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值