PHP抽象类与接口的区别详解


Posted in PHP onMarch 21, 2019

对于面向对象开发,抽象类与接口这两个东西是比较难理解的;就算是对于有一定经验的程序员来说也如此。下面根据自己的理解来讲述一下这两个东西,如有什么不对的,还望不吝赐教。

抽象类:是基于类来说,其本身就是类,只是一种特殊的类,不能直接实例,可以在类里定义方法,属性。类似于模版,规范后让子类实现详细功能。

接口:主要基于方法的规范,有点像抽象类里的抽象方法,只是其相对于抽象方法来说,更加独立。可让某个类通过组合多个方法来形成新的类。

抽象类与接口的相同点:

1、都是用于声明某一种事物,规范名称、参数,形成模块,未有详细的实现细节。

2、都是通过类来实现相关的细节工作

3、语法上,抽象类的抽象方法与接口一样,不能有方法体,即{}符号

4、都可以用继承,接口可以继承接口形成新的接口,抽象类可以继承抽象类从而形成新的抽象类

抽象类与接口的不同点:

1、抽象类可以有属性、普通方法、抽象方法,但接口不能有属性、普通方法、可以有常量

2、抽象类内未必有抽象方法,但接口内一定会有“抽象”方法

3、语法上有不同

4、抽象类用abstract关键字在类前声明,且有class声明为类,接口是用interface来声明,但不能用class来声明,因为接口不是类。

5、抽象类的抽象方法一定要用abstract来声明,而接口则不需要

6、抽象类是用extends关键字让子类继承父类后,在子类实现详细的抽象方法。而接口则是用implements让普通类在类里实现接口的详细方法,且接口可以一次性实现多个方法,用逗号分开各个接口就可

各自的特点:

抽象类内未必有抽象方法,但有抽象方法的类,则必是抽象类

抽象类内,即便全是具体方法,也不能够实例化,只要新建类来继承后,实例继承类才可以

接口可以让一个类一次性实现多个不同的方法

接口本身就是抽象的,但注意不是抽象类,因为接口不是类,只是其方法是抽象的。所以,其也是抽象的

应用与结合:

以下的代码是基于自己的思考,未在实际开发中应用,只是这种写法有点奇特。让抽象与接口结合起来。

一、抽象类与接口的结合

<?php 
/* 
写此程序源于自己的猜测,想在抽象类里实现某一接口。 
*/ 
interface work{ 
  public function say(); 
}
abstract class a implements work{ 
  public function showlove(){ 
    echo 'love you<br />'; 
  } 
}
class b extends a{ 
  public function say(){ 
    echo 'hello, i m in b'; 
  } 
}
$k=new b(); 
$k->say();
/* 
以上程序能正常执行
普通类implements接口后,就变成了抽象类了,这就好像是直接给抽象类增加了一个抽象方法。
*/

二、接口与继承的结合

父类是普通类,子类继承后,同时在子类里实现接口。

疑问:这样的做法是否有意义,在实际开发中是否有这样的应用?

<?php
interface kk{ 
  public function say(); 
}
class a { 
  public function show(){ 
    echo '我是父类<br />'; 
  } 
}
class b extends a implements kk{ 
  public function say(){ 
    echo '我是继承A类,同时实现say接口的<br />'; 
  }
}
$b=new b(); 
$b->show();//我是父类
$b->say();//我是继承A类,同时实现say接口的

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
php快速url重写更新版[需php 5.30以上]
Apr 25 PHP
php header示例代码(推荐)
Sep 08 PHP
让PHP更快的提供文件下载的代码
Jun 13 PHP
利用PHP生成静态HTML文档的原理
Oct 29 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
PHP动态柱状图实现方法
Mar 30 PHP
php实现可逆加密的方法
Aug 11 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
tp5.1框架数据库子查询操作实例分析
May 26 PHP
Nginx+php配置文件及原理解析
Dec 09 PHP
PHP CURL使用详解
Mar 21 #PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 #PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 #PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
Mar 21 #PHP
启用OPCache提高PHP程序性能的方法
Mar 21 #PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 #PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 #PHP
You might like
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
javascript 页面划词搜索JS
2009/09/28 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
取消选中单选框radio的三种方式示例介绍
2013/12/23 Javascript
js实现弹窗居中的简单实例
2016/10/09 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
Python中url标签使用知识点总结
2020/01/16 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
Python常用类型转换实现代码实例
2020/07/28 Python
python 对xml解析的示例
2021/02/27 Python
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
德国机车企业:FC-Moto
2017/10/27 全球购物
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
应届毕业生的自我鉴定
2013/11/13 职场文书
客房主管岗位职责
2013/12/09 职场文书
师范生的个人求职信范文
2014/01/04 职场文书
新闻发布会策划方案
2014/06/12 职场文书
暑期培训班招生方案
2014/08/26 职场文书
单位租房协议书样本
2014/10/30 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis