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

本课摘要

  1. abstract 关键字声明一个抽象类
  2. 抽象类的继承和使用
  3. 接口的使用

1. abstract 关键字声明一个抽象类

  1. 抽象类就是一个半成品, 不能被实例化, 必须被继承, 并实现里面所有的方法.
  2. 抽象类中, 可以有非抽象方法.
abstract class Person {             //声明一个抽象类,要使用abstract关键字标识
    protected $name;             //声明一个存储人的名子的成员
    protected $country;           //声明一个存储人的国家的成员

    function __construct($name="", $country="china") {  //构造方法用来创建对象并初使化成员属性
        $this->name = $name;                      //为成员属性name在创建对象时赋初值
        $this->country = $country;                  //为成员属性country在创建对象时赋初值
    }

    abstract function say();   //在抽象类中声明一个没有方法体的抽象方法,使用abstract关键字标识

    abstract function eat();   //在抽象类中声明另一个没有方法体的抽象方法,使用abstract关键字标识

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

2. 抽象类的继承和使用

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

    function eat() {                 //将父类中的抽象方法覆盖,按自已的需求去实现
        echo $this->name."使用筷子吃饭<br>";                    //实现的内容
    }
}

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

    function eat() {                //将父类中的抽象方法覆盖,按自已的需求去实现
        echo $this->name."使用刀子和叉子吃饭<br>";              //实现的内容
    }
}

$chineseMan = new ChineseMan("高洛峰", "中国");      //将第一个Person的子类实例化对象
$americans =new Americans("alex", "美国");             //将第二个Person的子类实例化对象

$chineseMan->say();              //通过第一个对象调用子类中已经实例父类中抽象方法的say()方法
$chineseMan->eat();               //通过第一个对象调用子类中已经实例父类中抽象方法的eat()方法

$americans->say();               //通过第二个对象调用子类中已经实例父类中抽象方法的say()方法
$americans->eat();                //通过第二个对象调用子类中已经实例父类中抽象方法的eat()方法

3. 接口的使用

  1. 接口中只能有常量成员属性, 和抽象方法
  2. 一个子类, 可以实现多个接口
interface One {                              //声明一个接口使用interface关键字,One为接口名称
    const CONSTANT = 'CONSTANT value';       //在接口中声明一个常量成员属性,和在类中声明一样
    function fun1();                         //在接口中声明一个抽象方法“fun1()”
    function fun2();                         //在接口中声明另一个抽象方法“fun2()”
}

abstract class Three implements One {          //声明一个抽象类去实现接口One中的第二个方法
    function fun2() {                       //只实现接口中的一个抽象方法
        //具体的实现内容由子类自决定
    }
}

class Four implements One {                 //声明一个类实现接口One中的全部抽象方法
    function fun1() {                      //实现接口中第一个方法
        //具体的实现内容由子类自决定
    }

    function fun2() {                     //实现接口中的第二个方法
        //具体的实现内容由子类自决定
    }
}