1、抽象类和接口this
一、抽象类spa
1)什么是抽象类?code
抽象类就是包含抽象方法的类对象
抽象类其实就是一种规范blog
具备抽象方法的类必定是抽象类继承
2)什么是抽象方法?接口
没有实现的成员方法,可是又给咱们指引了一个目标游戏
3)为何要使用抽象类io
要为以后的程序定义规范function
4)何时使用抽象类
在须要对程序进行规范性定义时
5)如何声明抽象类
使用 abstract 声明一个抽象类
含有抽象方法的类必定是抽象类
抽象类不必定包含抽象方法
抽象方法必定要使用 abstract 关键字进行声明,该方法必定没有方法体,以分号结尾
抽象方法不能声明为私有的或是 final 修饰的
抽象类不容许直接使用(实例化)
抽象类要使用必须利用子类继承并在子类中将抽象方法一次性所有实现后,方可以使用这些成员方法
抽象类中的抽象方法的声明格式在利用子类继承并实现方法时的格式必须保持一致(参数个数、是否为静态)
//声明一个抽象类,具备抽象方法的类必定是抽象类,必须使用“abstract”来声明 abstract class Person{ private $name="autumn"; private $sex="男"; private $age=25; public function info(){ echo "姓名:".$this->name.",性别:".$this->sex.",年龄:".$this->age; } public function say(){ echo "haha"; } //声明抽象方法 abstract public function sleep(); abstract public function eat(); } //抽象类不容许直接被实例化使用 //只有全部的抽象方法在子类中所有同时被实现了,这些方法才可以使用 class Admin extends Person { public function sleep(){ echo "我爱睡懒觉"; } public function eat(){ echo "我爱吃肉"; } } $p=new Admin; $p->sleep();
二、接口
1)什么是接口?
全部的成员方法都为抽象方法的抽象类
2)为何要使用接口?
定义一种都没法实现的规范
3)如何使用接口
使用 interface 关键字进行接口的声明,而不是class,后跟接口名
接口当中不容许包含成员属性
接口当中的成员方法必须是未实现的方法,无需使用 abstract 声明
接口不容许直接实例化
继承接口使用 implements 而不是extends
一个类能够继承多个接口,接口和接口之间使用“,”分隔
一个类只容许继承一个父类,若要同时继承一个父类和多个接口,要先继承类再继承接口
interface Person{ //接口不容许包含成员属性 //private $name="autumn"; //接口能够定义常量 const DB_HOST="localhost"; //成员方法不须要使用abstract声明 function sleep(); function eat(); } interface Play{ function play(); } interface Sport{ function sport(); } class Boy{ public function boy(){ echo "i am a boy"; } } //接口不容许直接被实例化使用 //只有全部的抽象方法在子类中所有同时被实现了,这些方法才可以使用 //一个类能够同时继承多个接口,但只能继承一个类 class Admin extends Boy implements Person,Play,Sport{ function sleep(){ echo "我爱睡懒觉"; } function eat(){ echo "我爱吃肉"; } function play(){ echo "我不爱玩游戏"; } function sport(){ echo "我爱运动"; } } $p=new Admin; $p->sleep(); $p->sport();
三、抽象类和接口的区别
1)抽象类使用 abstract 声明,接口使用 interface 声明
2)接口当中的方法必定都是抽象方法,抽象类当中的方法不必定全都是抽象方法
3)接口和抽象类都是对子类定义一种规范而产生的
4)接口是抽象类的特殊状况
5)继承接口使用 implements ,继承抽象类使用 extends
6)接口能够被同时继承多个,而抽象类只能一次被继承一个
2、对象的多态
一、什么是多态?
声明的类能够表现出多种形态或者行为
二、为何要使用多态?
可使代码更加简便或具备更高的可重用性,让程序具备高可扩展性
三、何时使用多态?
给程序留出必定的接口,调用不一样的类,实现不一样的功能
interface Usb{ function start(); function run(); function stop(); } class UDisk implements Usb{ public function start(){ echo "U盘开始..."; } public function run(){ echo "U盘运行..."; } public function stop(){ echo "U盘结束..."; } } class UMouse implements Usb{ public function start(){ echo "鼠标开始..."; } public function run(){ echo "鼠标运行..."; } public function stop(){ echo "鼠标结束..."; } } class UCamera implements Usb{ public function start(){ echo "摄像头开始..."; } public function run(){ echo "摄像头运行..."; } public function stop(){ echo "摄像头结束..."; } } //未继承接口的类 class UFan{ public function start(){ echo "风扇开始..."; } public function run(){ echo "风扇运行..."; } public function stop(){ echo "风扇结束..."; } } class Computer{ //类型约束,约束实例化对象必须为继承自Usb类的子类所实例化的 public function useUsb(Usb $obj){ $obj->start(); $obj->run(); $obj->stop(); } } $c=new Computer; $c->useUsb(new UCamera); echo "<hr>"; $c->useUsb(new UFan); //会报错