1 抽象类可以有成员变量、常量; 成员方法可以实现, 可以不实现; 可以有布局方法;
2 抽象类中的成员方法未实现的, 必须用abstract关键字润色; 定义成抽象的方法不能有方法体, 但必须在子类中定义同名的成员方法,
而且必须被实现(有方法体);
3 抽象类的方法不能定义为private类, 如果抽象类方法定义为protected, 那么子类中实现的方法该当声明为protected或者public;
<?phpabstract 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>"; //有方法体,输出一条语句 }}?>
<?phpclass 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()方法?>
抽象类的意义:规范化的浸染, 规定子类必须跟父类定义方法同等;
运用范围:在大型项目中, 团队比较大, 哀求比较严格的情形下利用, 在小项目中不适宜。
接口(interface)
统共分为两种:
运用型接口: API(application interface) 数据对外访问的一个入口
数据型接口: 构造规范, 规范我们类要以什么格式进行定义
接口不能声明变量,可以有常量;成员方法不能实现(不能有方法体);不能有布局函数;
接口中定义的所有方法都必须是public, 这是接口的特性。
接口多继续
接口继续接口 extends
抽象类继续接口 implements
类继续接口 implements
<?phpinterface 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() { //实现接口中的第二个方法 //详细的实现内容由子类自决定 }}?>
抽象类与接口的差异
对接口的利用办法是通过关键字implements来实现的, 而对付抽象类的操作是利用类继续的关键字extends实现的, 利用时要特殊把稳。
接口没有数据成员, 但是抽象类有数据成员, 抽象类可以实现数据的封装。
接口没有布局函数, 抽象类可以有布局函数。
接口中的方法必须是public类型, 而抽象类中的方法可以利用private、protected或public来润色。
一个类可以同时实现多个接口, 但是只能实现一个抽象类。
相同点:抽象方法和接口的函数体内不能写任何东西, 连两个大括号都不能写! 如:function getName();
比较 类(class) 抽象类(abstract class) 接口(interface)
常量 有 有 有
成员属性 有 有 无
成员方法 有 有 无
抽象方法 无 有 有
静态属性 有 有 无
静态方法 有 有 无
布局方法 有 有 无
析构方法 有 有 无
实例化 能 不能 不能
接口的意义:跟抽象类一样, 用于规范分支的构造, 它比抽象类更加严格, 一样平常用于团队比较大, 分支比较多的情形下利用。
口试题?
1 抽象类是不是类?
是类, 带有class 关键字, 但是不能被实例化, 而只能被继续。
2 接口是不是类?
接口不是类, 但是能够被类实现。
3 类能够实现多继续吗?
A extends B,C{} 缺点的
可以通过继续链实现多继续 A extends B B extends C