PHP面向对象之抽象类(abstract)与接口(interface)
一 名词解释
抽象类&抽象方法(abstract):具有抽象方法的类为抽象类,抽象方法即为没有内容的空方法,要求子类进行完善内容,抽象类不能实例化,只能继承,通过extends来实现,抽象类中也可以定义普通方法。
接口(interface):接口是一组成员声明方法的集合,包含空的成员方法和常量,空的方法要求继承类去具体实现。成员方法为public,属性为常量。继承是一级一级层次式,如果某一层出现问题,整个继承就会出现意外。而接口只影响实现接口的类,接口可以在破坏原来的继承基础上对类扩展。接口可以实现多继承。抽象类及普通类都可以实现接口,通过关键字implements。
二 Example
###abstrct
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | abstract class Foo{ /* * 如果需要限制子类的方法名,那么可以定义一个抽象类 * 如果一个类中含有抽象方法 那么该类必须是一个抽象类 即用abstract修饰 * 抽象方法不含有代码体 因为子类覆盖该方法 所以不需要代码体 */ abstract public function bar(); //抽象类中可以含有普通方法 public function foos(){ echo '普通方法已执行' ; } } class Foo2 extends Foo{ public function bar(){ echo 'bar方法已执行' ; } } class Foo3 extends Foo{ public function bar(){ echo 'bar方法又执行了' ; } } ( new Foo2())->bar(); //output: 'bar方法已执行' ( new Foo2())->foos(); //output: '普通方法已执行' ( new Foo3())->bar(); //output: 'bar方法又执行了' |
###interface
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | //接口通过interface声明 interface Model{ //接口中定义的方法可以接收参数 public function query( $sql ); } interface Db{ //连接方式 public function connect(); //执行方式 public function exec (); } //一个类可以实现多个接口,通过implements继承 class DbPdo implements Db,Model{ public function connect(){ echo 'Pdo连接方式' ; } public function exec () { echo 'Pdo执行方式' ; } //必须和接口中的方法保持一致 public function query( $sql ){ echo '查询语句:' . $sql ; } } class DbMysqli implements Db{ public function connect() { echo 'Mysqli连接方式' ; } public function exec (){ echo 'Mysqli执行方式' ; } } $pdo = new DbPdo(); $pdo ->connect(); //output: 'Pdo连接方式' $pdo -> exec (); //output: 'Pdo执行方式' $pdo ->query( 'select * from db' ); //output: '查询语句:select * from db' $mysqli = new DbMysqli(); $mysqli ->connect(); //output: 'Mysqli连接方式' $mysqli -> exec (); //output: 'Mysqli执行方式' |
三 abstract与interface的区别
1 接口只能用implements实现 抽象类用extends继承实现
2 接口没有数据成员,只能定义常量,抽象类则可以有数据成员
3 接口方法只能用public来修饰 抽象类方法可以用protected private public来修饰
4 接口中不可以有普通方法,抽象类可以有普通方法
5 一个类可以实现多个接口,但只能继承一个抽象类

发布评论
还没有评论,快来抢沙发吧!