PHP面向对象之抽象类与接口
本课摘要
abstract
关键字声明一个抽象类- 抽象类的继承和使用
- 接口的使用
1. abstract
关键字声明一个抽象类
抽象类
就是一个半成品
, 不能被实例化, 必须被继承, 并实现里面所有的方法.- 抽象类中, 可以有
非抽象方法
.
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. 接口的使用
接口
中只能有常量成员属性
, 和抽象方法
- 一个子类, 可以实现多个接口
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() { //实现接口中的第二个方法
//具体的实现内容由子类自决定
}
}