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{
    //实现接口中的抽象方法
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值