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 $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
Jun 21 PHP
php中json_encode中文编码问题分析
Sep 13 PHP
php模板原理讲解
Nov 13 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
Dec 25 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
Jul 30 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
浅谈php优化需要注意的地方
Nov 27 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
php实现随机生成易于记忆的密码
Jun 19 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
thinkPHP商城公告功能开发问题分析
Dec 01 PHP
PHP设计模式(观察者模式)
Jul 07 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
PHP 变量定义和变量替换的方法
2009/07/30 PHP
php 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
2013/06/25 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
python中解析json格式文件的方法示例
2017/05/03 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
幼儿园儿童节主持词
2014/03/21 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
工作时间证明
2015/06/15 职场文书
社会实践心得体会范文
2016/01/14 职场文书
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技