关于PHP中interface的用处详解


Posted in PHP onJuly 26, 2020

确实,PHP 接口是有它的目的的。

它们是契约,是给其他开发人员的说明手册。然而,还是很难理解接口有什么用。

基础

接口是抽象的类,无法直接实例化,但是可被实现。

这是一个基本的例

interface MyInterface {
public function setName(string $name);
public function getName();
}
 
class MyClass implements MyInterface {
private $name;
 
public function setName(string $name) {
$this->name = $name;
}
 
public function getName() {
return $this->name;
}
}

MyClass 必须实现 setName() 和 getName() 方法。如果你不照做,你就会遇到致命错误。

Fatal error: Class MyClass contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (MyInterface::setName, MyInterface::getName)

此外,接口中定义的方法的访问性必须为公开的,并且接口中不能定义类成员。

原因

开发者使用接口来描述一个或者一组类的共同行为。

但是为什么只负责封装实现而不负责处理每个类的详细信息呢?

为了解耦!

接口允许你在不更改详细信息的情况下更改实现,也就是你使用此实现的方式。

更多高级示例

任何缓存系统都需要以下功能

  • 存储 / 设置缓存中的内容
  • 获取缓存中的内容
  • 删除缓存中的内容

基于此,我们可以创建如下的缓存接口

interface CacheInterface {
public function set(string $key, $val);
public function get(string $key);
public function delete(string $key);
}

以这种方式,就可以让开发者知道需要实现缓存接口,具体怎么实现,我们不需要知道。结果就是我们可以在不修改使用方式的情况下方便地切换缓存系统

因此,在不改变缓存系统在项目中的使用方式的情况下更改缓存系统是很容易的。

Symfony 示例

我们来看刚才例子的具体应用。对于 Symfony 而言,如果你想要实现任何缓存系统,最佳实践就是按照下面的方式来做

use Symfony\Contracts\Cache\CacheInterface;
 
class MyClass {
private $cache;
public function __construct(CacheInterface $cache)
{
$this->cache = $cache;
}
}

通过依赖注入,将缓存接口注入到我们的类中。下次我们修改缓存系统时,MyClass 类不需要做任何的改变。

多实现 VS 多继承

PHP 不支持多继承,下面这种方式是不可能的

class MyClass extends ClassX, ClassY {}

之所以不允许这样做部分原因是由于 Diamond 问题.

不过,你可以这么做

class ClassY extends ClassX {}
class MyClass extends ClassY {}

但是 ClassX 和 ClassY 可能处理不同的事情,因此使用继承没有任何意义。

如果你想要执行多种行为,那么你可以多个接口

class MyClass implements InterfaceX, InterfaceY {}

换句话说,你可以让一些类共享一部分功能而不是共享一个父类。

总结

PHP 接口是类的方法模板,这对于解耦实现及使用是非常有帮助的。

当你需要保持灵活性并确保所有开发人员都遵循一组规则时,此功能特别有用。

到此这篇关于关于PHP中interface的用处的文章就介绍到这了,更多相关PHP中interface用处内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
使用PHP导出Redis数据到另一个Redis中的代码
Mar 12 PHP
PHP中使用imagick生成PSD文件缩略图教程
Jan 26 PHP
PHP正则表达式入门教程(推荐)
May 18 PHP
Yii CGridView用法实例详解
Jul 12 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
PHP工厂模式的日常使用
Mar 20 PHP
php use和include区别总结
Oct 13 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
May 29 PHP
Laravel中如何轻松容易的输出完整的SQL语句
Jul 26 #PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 #PHP
php实现商城购物车的思路和源码分析
Jul 23 #PHP
PHP安全之register_globals的on和off的区别
Jul 23 #PHP
PHP代码覆盖率统计详解
Jul 22 #PHP
php实现统计IP数及在线人数的示例代码
Jul 22 #PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 #PHP
You might like
详解:――如何将图片储存在数据库里
2006/12/05 PHP
PHP生成静态页面详解
2006/12/05 PHP
php google或baidu分页代码
2009/11/26 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
php socket通信简单实现
2016/11/18 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
JS控制表格隔行变色
2006/06/26 Javascript
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
简单实现js浮动框
2016/12/13 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
对python的文件内注释 help注释方法
2018/05/23 Python
Python的log日志功能及设置方法
2019/07/11 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
Python多线程的退出控制实现
2020/08/10 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
html5实现滑块功能之type="range"属性
2020/02/18 HTML / CSS
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
2013年保送生自荐信格式
2013/11/20 职场文书
省级四好少年事迹材料
2014/01/25 职场文书
征婚广告词
2014/03/17 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书