PHP面向对象之接口详解(代码实例)
本文目标:
1、了解PHP中接口的定义
2、了解PHP中接口的作用
3、了解PHP中接口的使用场景
4、了解PHP中接口的具体实现
还是承袭之前一贯的学习思路,我们学习一个知识,还是根据3w1h的思路来学习
(一)、了解PHP中接口的定义(What)
定义:接口就是把不同类的 <span style="background-color: rgb(255, 0, 0); color: rgb(255, 255, 255); border: 1px solid rgb(0, 0, 0);">共同行为</span>
<span style="color: rgb(0, 0, 0);"> </span>
<span style="color: rgb(0, 0, 0);">进行了定义,然后在不同的类里面实现不同的功能</span>
<span style="color: rgb(0, 0, 0);"> 或者我们可以理解成它是对事物的一种统一规范,它规定了某个事物必须有哪些行为,比如人这个接口,它就规定了人必须要具备的一些方法,比如吃、喝、拉、撒、走路<span style="color: rgb(0, 0, 0); font-family: monospace;">、</span>说话<span style="color: rgb(0, 0, 0); font-family: monospace;">、</span>眨眼睛<span style="color: rgb(0, 0, 0); font-family: monospace;">、</span>睡觉<span style="color: rgb(0, 0, 0); font-family: monospace;">、</span>思考等,缺少任何一个行为都不是一个正常的人了</span>
(二)、了解PHP中接口的作用(Why)
作用:
1、规范代码:定义接口有利于代码的规范:特别是对于一些大型项目而言,有了统一的接口后,一方面开发人员能有一个清晰的认识,一看接口就知道他们具体要实现哪些业务;同时也能防止由于开发人员随意命名而导致的命名不清晰和代码混乱,影响开发效率。
2、提高的代码的可维护性:比如你要做一个分销商城程序,其中里面有一个分销类,主要负责分销功能,刚开始的时候你可能会把你刚开始想到的一些分销功能都封装到这个分销类里面。可是随着时间的推移,你之后可能会发现现有的类已经不能够满足你的新的需求,然后你就需要重新设计这个类,但是最坏的情况是你会发现此刻这个类好像根本就没什么用了,但是代码的其他地方有可能还会引用这个类,如果完全去修改,会导致非常麻烦。但是如果一开始你把它定义成一个接口,把分销的一些主要功能放在接口里,然后再另外定义一个分销类时去具体的实现这些接口,然后你只需要用这个接口去引用已经实现这个接口的相关的类就可以了,就算以后要换的话只不过是引用另一个类而已,这样就可以提高代码的可维护性和可拓展性。
3、让代码更具备高内聚,低耦合的原则
(三)、了解PHP中接口的使用场景(Where)
场景:结合它的作用,使用场景基本上如下
1、如果为了保证一个类更具规范性,我们可以为这个类定义一个接口,那么所有继承这个接口的所有类,都必须要实现接口里定义的方法
2、如果希望提高代码的可维护性,可重用性和可扩展性,我们也可以考虑它,特别是在参与开发大型项目的时候,一定要先考虑好,哪些接口需要先定义好,这样就等同于先把规范确定好了,规范确定好了,分工合作的时候,效率才会提升
(四)、了解PHP中接口的具体实现(How)
总结:
1、接口的定义 interface 接口名称{ }
2、接口里面的方法 是没有{},也就是说里面的方法是没有具体的实现部分
3、类实现接口的定义 通过关键字implements,比如 class A implements 接口{}
4、类一旦要实现某个接口,就必须要实现接口定义好的所有方法
5、接口不能被实例化
6、通过instanceof 来判断某个类的实例是不是实现了一个接口,比如A对象实例 instanceof B接口
如果返回true,就表示A对象实例对应的类 是实现了B接口
7、通过extends可以让一个接口 继承 另外一个接口
8、当一个类要实现一个子接口时,它不仅要实现子接口里面的方法,同时也要实现父接口的所有方法
每个总结都是通过实践得来的,下面我们一一来通过具体的代码来演示上面的总结
(五)、具体代码
1、案例一
实践目标:
1、接口的定义 interface 接口名称{ }
2、接口里面的方法 是没有{},也就是说里面的方法是没有具体的实现部分
<?php //接口定义 interface Action{ public function eat(); public function walk(); public function sleep(); } ?>
运行结果:是空白的说明没有报错
2、案例二
实践目标:
1、类要实现一个接口的定义 通过关键字implements,比如 class A implements 接口{}
2、类一旦要实现某个接口,就必须要实现接口定义好的所有方法
<?php //接口定义 interface Action{ public function eat(); public function walk(); public function sleep(); } //定义实现接口的类 class Monkey implements Action{ //一旦要实现一个接口,就必须要实现接口里面的所有方法 public function eat(){} public function walk(){} public function sleep(){} } $monkey = new Monkey(); ?>
没有实现接口的方法的运行结果为:
Fatal error: Class Monkey contains 3 abstract methods and must therefore be declared abstract or implement the remaining methods (Action::eat, Action::walk, Action::sleep) in D:\E-class\class-code\classing\index.php on line 11
实现了接口的运行结果为:
空白说明是正确的
3、案例三
实践目标:
1、接口不能被实例化
<?php //接口定义 interface Action{ public function eat(); public function walk(); public function sleep(); } $action = new Action(); ?>
运行结果为:
Fatal error: Uncaught Error: Cannot instantiate interface Action in D:\E-class\class-code\classing\index.php:9 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 9
4、案例四
实践目标:
1、通过instanceof 来判断某个类的实例是不是实现了一个接口,比如A对象实例 instance of B接口
如果返回true,就表示A对象实例对应的类 是实现了B接口
<?php //接口定义 interface Action{ public function eat(); public function walk(); public function sleep(); } //定义实现接口的类 class Monkey implements Action{ public function eat(){} public function walk(){} public function sleep(){} } $monkey = new Monkey(); print_r( $monkey instanceof Action ); ?>
运行结果为:1
5、案例五
实践目标:
1、通过extends可以让一个接口 继承 另外一个接口
<?php //接口定义 interface Action{ public function eat(); public function walk(); public function sleep(); } //接口继承 interface HigherAction extends Action{ public function talk(); public function think(); } ?>
6、案例六
实践目标:
1、当一个类要实现一个子接口时,它不仅要实现子接口里面的方法,同时也要实现父接口的所有方法
<?php //接口定义 interface Action{ public function eat(); public function walk(); public function sleep(); } //接口继承 interface HigherAction extends Action{ public function talk(); public function think(); } //定义实现子接口的类 class Human implements HigherAction{ public function eat(){} public function talk(){} public function walk(){} public function sleep(){} public function think(){} } $human = new Human(); ?>
当Human类只实现HigherAction的2个方法的时候,运行结果为:
Fatal error: Class Human contains 3 abstract methods and must therefore be declared abstract or implement the remaining methods (HigherAction::think, Action::walk, Action::sleep) in D:\E-class\class-code\classing\index.php on line 14
当Human类实现了HigherAction和Action的所有方法的时候,运行结果为:
空白,说明是正确的
(六)、学以致用
问题:分销系统想必对很多人来说都不陌生,但是分销系统也有很多种类,比如常见的不违法有2级分销,稍微有点违法的就是3级分销,其实还有更多繁杂的分销系统,但是不管是哪种分销系统,他们都有类似的方法,我们希望把这些方法做成一个接口,然后具体怎么实现,就交由2级分销和3级分销2个类,怎么做?
思路分析:
1、先想好分销的公共方法
2、把这些方法封装到分销接口中
3、定义2个类,让这2个类分别去实现这个分销接口
具体代码:
<?php //分销接口定义 interface Commission{ //获取会员的直接上级 public function getParent($uid); //获取会员的当期级别 public function getLevel($uid); //获取会员的累计佣金 public function getTotalCommission($uid); //获取会员当期可提现佣金 public function getCurrCommission($uid); //获取会员的累计提现佣金 public function getTotalApplyPrice($uid); } //2级分销 class TwoLevelCommission implements Commission{ //获取会员的直接上级 public function getParent($uid){} //获取会员的当期级别 public function getLevel($uid){} //获取会员的累计佣金 public function getTotalCommission($uid){} //获取会员当期可提现佣金 public function getCurrCommission($uid){} //获取会员的累计提现佣金 public function getTotalApplyPrice($uid){} } //3级分销 class ThreeLevelCommission implements Commission{ //获取会员的直接上级 public function getParent($uid){} //获取会员的当期级别 public function getLevel($uid){} //获取会员的累计佣金 public function getTotalCommission($uid){} //获取会员当期可提现佣金 public function getCurrCommission($uid){} //获取会员的累计提现佣金 public function getTotalApplyPrice($uid){} } ?>
(七)、总结
1、本文主要是讲了接口的定义和作用以及实现
希望本文能给大家带来一定的帮助,谢谢!!!
以上是PHP面向对象之接口详解(代码实例)的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

如何使用Go语言实现面向对象的事件驱动编程引言:面向对象的编程范式被广泛应用于软件开发中,而事件驱动编程是一种常见的编程模式,它通过事件的触发和处理来实现程序的流程控制。本文将介绍如何使用Go语言实现面向对象的事件驱动编程,并提供代码示例。一、事件驱动编程的概念事件驱动编程是一种基于事件和消息的编程模式,它将程序的流程控制转移到事件的触发和处理上。在事件驱动

当对象在Jackson库中具有父子关系时,将使用@JsonIdentityInfo注释。@JsonIdentityInfo 注解 用于在序列化和反序列化过程中指示对象身份。ObjectIdGenerators.PropertyGenerator是一个抽象占位符类,用于表示要使用的对象标识符来自POJO属性的情况。语法@Target(value={ANNOTATION_TYPE,TYPE,FIELD,METHOD,PARAMETER})@Retention(value=RUNTIME)public

Go语言支持面向对象编程,通过类型定义和方法关联实现。它不支持传统继承,而是通过组合实现。接口提供了类型间的一致性,允许定义抽象方法。实战案例展示了如何使用OOP管理客户信息,包括创建、获取、更新和删除客户操作。

Go语言支持面向对象编程,通过struct定义对象,使用指针接收器定义方法,并通过接口实现多态。面向对象特性在Go语言中提供了代码重用、可维护性和封装,但也存在缺乏传统类和继承的概念以及方法签名强制类型转换的局限性。

解析PHP面向对象编程中的享元模式在面向对象编程中,设计模式是一种常用的软件设计方法,它可以提高代码的可读性、可维护性和可扩展性。享元模式(Flyweightpattern)是设计模式中的一种,它通过共享对象来降低内存的开销。本文将探讨如何在PHP中使用享元模式来提高程序性能。什么是享元模式?享元模式是一种结构型设计模式,它的目的是在不同对象之间共享相同的

PHP中OOP最佳实践包括命名约定、接口与抽象类、继承与多态、依赖注入。实战案例包括:使用仓库模式管理数据,使用策略模式实现排序。

在Golang(Go语言)中并没有传统意义上的类的概念,但它提供了一种称为结构体的数据类型,通过结构体可以实现类似类的面向对象特性。在本文中,我们将介绍如何使用结构体实现面向对象的特性,并提供具体的代码示例。结构体的定义和使用首先,让我们看一下结构体的定义和使用方式。在Golang中,结构体可以通过type关键字定义,然后在需要的地方使用。结构体中可以包含属

C#(CSharp)是一门强大而受欢迎的面向对象编程语言,广泛应用于软件开发领域。在C#开发过程中,了解面向对象编程(OOP)的基本概念和设计原则是非常重要的。面向对象编程是一种编程范式,它将现实世界中的事物抽象为对象,并通过对象之间的交互来实现系统功能。在C#中,类是面向对象编程的基本构建块,用于定义对象的属性和行为。在进行C#开发时,有几个重要的设计原
