一、抽象方法和抽象类
1.抽象方法:一个方法如果没有方法体(没有{},直接分号结束,使用abstrract关键字修饰的方法),即是抽象方法
2.抽象类:如果类中有一个方法是抽象方法,则这个类是抽象类,该类使用abstract来修饰
注意:
1.抽象类中不一定必须有方法2.抽象类中有抽象方法3.抽象类不能创建对象4.其他方面与一般类完全一样5.抽象类必须有子类,子类将抽象类的抽象方法覆盖,就有方法体了6.子类必须覆盖全部抽象方法,才能创建对象,如果只实现部分抽象方法,则子类还是抽象类
3.抽象方法的作用:规定了子类必须有(覆盖)这个方法,具体功能交给子类(按自己的功能)实现
4.抽象类的作用:抽象类要求了子类的结构,就是一个规范(程序员不能不写某种方法)
abstract class Person { abstract function eat(); abstract function sleep(); function walk(){} }; class Men extends Person { function eat(){ echo "吃米饭"; } function sleep(){ echo "睡床"; } }; class Women extends Person { function eat(){ echo "吃面"; } function sleep(){ echo "睡床"; } }; $s=new Men; $s->eat();//吃米饭
二、面向对象的接口技术
1.接口是一种特殊的抽象类(有抽象类所有特性)
2.接口与一般抽象类的区别(接口也是一种规范)
a.接口内所有方法必须全是抽象方法b.接口中属性必须是常量(const声明)c.接口内权限必须是public(默认即是,不必声明),抽象类可以有protectedd.声明接口不使用class,而是interfacee.接口中的抽象方法不需要abstract特殊声明,因为都是f.可以用类::访问属性/方法
interface Demo { const NAME="wo"; function test();}
3.接口的特性
a.接口可以继承另一个接口(extends),但只有扩展关系,没有覆盖关系b.可以使用一般类实现接口的*全部方法*(抽象方法必须全部覆盖),即有覆盖关系c.可以使用抽象类来实现接口的*部分方法*,即有覆盖关系d.只要是覆盖关系,即使用类/抽象类来实现接口,就要用implements关键字e.extends:一个类只能有一个父类f.implements:可以在使用extends继承其他类的同时,进行对接口的实现,可以实现多个接口(一定要先extends,再implements)g.实现多个接口,以逗号分开多个接口名即可
interface Demo { const NAME="wo"; function test1(); function test2(); }; interface Test extends Demo { function test3(); }; class World { function test4(){ } }; interface Abc { function test5(); } class Fina extends World implements Test,Abc { function test1(){ echo "test1"; } function test2(){ echo "test2"; } function test3(){ echo "test3"; } function test4(){ echo "test4"; } function test5(){ echo "test5"; } }; $p=new Fina; $p->test1();//test1 $p->test2();//test2 $p->test3();//test3 $p->test4();//test4 $p->test5();//test5
三、多态性(各个子类的形态功能不同)
1.必须有继承关系,父类最好是接口或抽象类,如下为模拟USB接口下鼠标和键盘的多态,以及使用者进行调用的情况
interface USB { const WIDTH = 12; const HEIGHT = 3; function load(); function run(); function stop(); }; class Mouse implements USB { function load(){ echo "加载鼠标成功!"; } function run(){ echo "运行鼠标功能!"; } function stop(){ echo "鼠标工作结束!"; } }; class Keyboard implements USB { function load(){ echo "加载键盘成功!"; } function run(){ echo "运行键盘功能!"; } function stop(){ echo "键盘工作结束!"; } }; class Computer { //只要是继承自USB抽象类的对象,不论什么设备,都执行三个方法 function useUSB(USB $usb){ $usb->load(); $usb->run(); $usb->stop(); } }; class Workers { function work(){ $c=new Computer; $m=new Mouse; $k=new Keyboard; $c->useUSB($m); $c->useUSB($k); } }; $w=new Workers; $w->work(); //加载鼠标成功! //运行鼠标功能! //鼠标工作结束! //加载键盘成功! //运行键盘功能! //键盘工作结束!