关于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 相关文章推荐
打造计数器DIY三步曲(下)
Oct 09 PHP
PHP中的类-什么叫类
Nov 20 PHP
MySQL授权问题总结
May 06 PHP
PHP中使用gettext来支持多语言的方法
May 02 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
关于php支持分块与断点续传文件下载功能代码
May 09 PHP
Yii2单元测试用法示例
Nov 12 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
PHP addcslashes()函数讲解
Feb 03 PHP
PHP进阶学习之Geo的地图定位算法详解
Jun 19 PHP
laravel validate 设置为中文的例子(验证提示为中文)
Sep 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
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
js parseInt("08")未指定进位制问题
2010/06/19 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
常见python正则用法的简单实例
2016/06/21 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
python实现文法左递归的消除方法
2020/05/22 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
python中的列表和元组区别分析
2020/12/30 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
有个性的自我评价范文
2013/11/15 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
愚人节活动策划方案
2014/03/11 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
岗位说明书标准范本
2014/07/30 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
优秀教研组申报材料
2014/12/26 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
SQL SERVER中的流程控制语句
2022/05/25 SQL Server