关于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 相关文章推荐
利用递归把多维数组转为一维数组的函数
Oct 09 PHP
php目录管理函数小结
Sep 10 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
Nov 07 PHP
Smarty局部缓存的几种方法简介
Jun 17 PHP
PHP中使用GD库创建圆形饼图的例子
Nov 19 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
详解 PHP加密解密字符串函数附源码下载
Dec 18 PHP
php文件上传后端处理小技巧
May 22 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP封装curl的调用接口及常用函数详解
May 31 PHP
实例解析php的数据类型
Oct 24 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/10/09 PHP
php内核解析:PHP中的哈希表
2014/01/30 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
自制PHP框架之模型与数据库
2017/05/07 PHP
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
2016/05/04 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
2016/09/02 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
python使用Berkeley DB数据库实例
2014/09/26 Python
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
Python遍历pandas数据方法总结
2018/02/09 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
数字漫画:comiXology
2020/06/13 全球购物
中学生打架检讨书
2014/02/10 职场文书
新品发布会策划方案
2014/06/08 职场文书
本科生自荐信
2014/06/18 职场文书