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
- dedecms版本介绍(解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法)
- php错误提示问题(php提示Creating default object from empty value 的问题解决方法)
- thinkphp接口开发实例(ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解)
- php网站经典案例(PHP生成短网址的思路以及实现方法的详解)
- thinkphp5框架怎么设置(thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例)
- php运用redis实现抢购实例(PHP+redis实现微博的拉模型案例详解)
- php cgi是什么意思(PHP7内核CGI与FastCGI详解)
- linux如何安装php环境(Linux下安装Memcached服务器和客户端与PHP使用示例)
- php网页浏览功能的具体实现(php实现网页上一页下一页翻页过程详解)
- php开发微信小程序后台步骤流程(基于PHP实现微信小程序客服消息功能)
- php抽象入门教程(php抽象方法和普通方法的区别点总结)
- js脚本语言原理(实例说明js脚本语言和php脚本语言的区别)
- php 创建定时任务(PHP扩展Swoole实现实时异步任务队列示例)
- thinkphp前后端配合(thinkPHP+LayUI 流加载实现功能)
- php7优化技巧(php7性能提升的原因详解)
- thinkphp标签详解(thinkphp整合系列之极验滑动验证码geetest功能)
- 三分71 生死战爆发 篮网旧将丁威迪今天成奇兵,助队赢球(三分71生死战爆发)
- 《红 雄安》系列广播剧第一集 水上奇兵雁翎队(雄安系列广播剧第一集)
- 小说 小伙穿越成刘备,用现代知识指挥作战,众谋士都看呆了(小伙穿越成刘备)
- 解析葡萄牙6-1瑞士 进攻多点开花,贡萨洛-拉莫斯一战成名(解析葡萄牙6-1瑞士)
- 这支 奇兵队 腕大 有范儿还各怀绝技,毒贩杀人犯见了都要仓皇而逃(这支奇兵队腕大)
- 雄藩崛起 奇兵队与幕末长州藩军事改革(雄藩崛起奇兵队与幕末长州藩军事改革)
热门推荐
- python图像变换教程(详解python-图像处理映射变换)
- linuxdocker命令使用教程(seata docker 高可用部署的详细介绍)
- $.ajax的用法
- ubuntu如何卸载clion(Ubuntu16.04安装clion全过程及步骤详解)
- html怎么引入sass(利用CSS的Sass预处理器框架来制作居中效果)
- vue 父组件传值(Vue两个同级组件传值实现)
- python爬微信好友(python抓取需要扫微信登陆页面)
- vuecli项目入门(vue-cli4.5.x快速搭建项目)
- 阿里云mysql如何接入(阿里云服务器安装Mysql数据库的详细教程)
- laravel8 前后端分离方案(laravel 根据不同组织加载不同视图的实现)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9