php中抽象类和接口的区别(PHP抽象类和接口用法实例详解)
php中抽象类和接口的区别
PHP抽象类和接口用法实例详解本文实例讲述了PHP抽象类和接口用法。分享给大家供大家参考,具体如下:
前言
对于oop,估计大多数人并不陌生。有些人除PHP外也学习不少其他语言,会发现php的不同之处,可能语法极其丑陋,但并不妨碍它成为世界上最好的语言(邪教语言)。PHP可以允许常量作为接口的一部分,而对于抽象的理解十分重要。
计算机上,对抽象的理解与自然语言中我们每天使用的抽象概念有所不同。比如,我们指代‘狗'、‘猫'等动物,我们会说‘那只狗/猫',他们就是具有狗/猫这类特征的具体实例。但是我们不能把猫和狗看作一类,也就是说你不能说狗是猫,我们可以把狗和猫都定义到动物这一类。所以我们把抽象定义为一个对象的基本特征,使他与其他对象明确区分开。
抽象类
抽象类里面可以有非抽象方法。但接口里只能有抽象方法。 声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
先看一个普通类:
|
<?php class appletree{ privated $catch ; piblic function tree( $sweet ){ $this -> catch = $sweet ; return $this -> catch ; } $apple = new appletree(); $eat = $apple ->tree( 'this apple is sweet' ); echo $eat ; ?> |
再看一个抽象类:
|
//appletree.php: <?php abstract class appletree{ privated $catch ; abstract public function tree1( $sweet ); public function tree2(){ echo 'smell' ; } public function _construct(){ //...... } } ?> |
|
<?php include_once ( 'appletree.php' ); class anothertree extends appletree{ public function tree1( $sweet ){ $this -> catch = 'this apple is' ; return $this -> catch . $sweet ; } } $apple = new appletree(); echo $apple ->tree1( 'sweet' ); ?> |
从普通类和抽象类可以看出:
抽象类和抽象方法前面定义必须有abstract,调用为extends。抽象类中可以有具体方法,并且具体方法可以在抽象类中实例化,然而抽象方法不可以在抽象类中实例化。
接口
oop模式中接口也是比不可少的一部分,接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
具体例子如下:
//fruit.php
|
<?php interface fruit{ public function apple( $sweet ); public function orange(); } ?> |
|
<?php include_once ( 'fruit.php' ); class fruittree implements fruit{ privated $catch ; public function apple( $sweet ){ $this -> catch = 'this fruit is' ; rerurn $this -> catch . $sweet ; } public function orange(){ return 'this orange is sweet' ; } } $tree = new fruittree(); echo $tree ->apple( 'sweet' ); echo $tree ->orange(); ?> |
接口和常量
一个网上看到的例子:(接口名和常量之间要用间隔符‘::'隔开,接口中可以用静态常量,变量不可以)
|
<?php interface TestInterface { const CONSTVAR = 'aaa' ; static staticvar = 111; public function alert( $str ); } class TestClass implements TestInterface { const CONSTVAR = 'bbb' ; public function __CONSTRUCT() { echo TestInterface::CONSTVAR; } public function alert( $str ) { echo $str ; } public function __DESTRUCT() { } } $test1 = new TestClass(); ?> |
我们可以看出接口和抽象类的区别:
1、接口中没有具体方法,都是抽象方法。
2、接口调用是implements,抽象类是extends。
3、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。
4、接口没有构造函数,抽象类可以有构造函数。
5、接口中的方法默认都是public类型的,而抽象类中的方法可以使用private,protected,public来修饰。
6、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。
使用选择
如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建将由一些不相关对象采用的功能,就使用接口。
如果必须从多个来源继承行为,就使用接口。
如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/jingege0318/article/details/54234468
- php连接mysql需要数据源吗(php连接mysql数据库最简单的实现方法)
- php符串使用教程(php使用scandir函数扫描指定目录下所有文件示例)
- phpob函数使用方法(php中isset与empty函数的困惑与用法分析)
- thinkphp5单例原理(Thinkphp5框架简单实现钩子Hook行为的方法示例)
- thinkphp 多维度展示数据(Thinkphp自定义生成缩略图尺寸的方法)
- php防session劫持(使用SMB共享来绕过php远程文件包含的限制执行RFI的利用)
- jqueryajax实现部分刷新(php+jQuery ajax实现的实时刷新显示数据功能示例)
- php语言程序设计基础面向对象(PHP面向对象程序设计之对象的遍历操作示例)
- php漏洞处理方法(php解决安全问题的方法实例)
- php读取远程的txt文件(php 根据URL下载远程图片、压缩包、pdf等文件到本地)
- php实现redis消息队列(redis+php实现微博三微博列表功能详解)
- iis上搭建php环境(vultr服务器windows server 2012 r2搭建IIS8+PHP+MYSQL+phpMyAdmin运行环境图文教程)
- php商城支付接口(php实现银联商务公众号+服务窗支付的示例代码)
- php中row函数(PHP中number_format函数的用法讲解)
- php函数使用教程讲解(php函数式编程简单示例)
- php提供哪些函数来避免sql的注入(PHP与SQL语句写一句话木马总结)
- 2主力后腰缺阵 泰山队奇兵有望获重用,赛季0出场,迎来中超首秀(泰山队奇兵有望获重用)
- 三分71 生死战爆发 篮网旧将丁威迪今天成奇兵,助队赢球(三分71生死战爆发)
- 《红 雄安》系列广播剧第一集 水上奇兵雁翎队(雄安系列广播剧第一集)
- 小说 小伙穿越成刘备,用现代知识指挥作战,众谋士都看呆了(小伙穿越成刘备)
- 解析葡萄牙6-1瑞士 进攻多点开花,贡萨洛-拉莫斯一战成名(解析葡萄牙6-1瑞士)
- 这支 奇兵队 腕大 有范儿还各怀绝技,毒贩杀人犯见了都要仓皇而逃(这支奇兵队腕大)
热门推荐
- springbootvue项目代码(Vue+SpringBoot实现支付宝沙箱支付的示例代码)
- python字符串匹配教程(Python字符串匹配之6种方法的使用详解)
- Sql Server中的Null值
- vueelementui动态表格(Vue Element前端应用开发之常规的JS处理函数)
- python真的能高效处理excel报表吗(Python数据报表之Excel操作模块用法分析)
- 阿里云服务器安全组在哪(阿里云服务器安全组设置规则)
- ubuntu开通端口(ubuntu开启22端口的实现)
- phpstudy默认不支持64位php的解决方法(phpstudy默认不支持64位php的解决方法)
- 查看docker运行状态命令(使用docker命令不需要敲sudo的操作)
- dedecms不生成文档(dedecms批量替换文章中超链接的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9