关于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中慎用双等于(==)的详解
Jun 06 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
ubuntu下配置nginx+php+mysql详解
Sep 10 PHP
是 WordPress 让 PHP 更流行了 而不是框架
Feb 03 PHP
Yii框架表单模型和验证用法
May 20 PHP
Laravel日志用法详解
Oct 09 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
PHP操作路由器实现方法示例
Apr 27 PHP
Laravel中正确地返回HTTP状态码方法示例
Sep 10 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
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
从0开始学Vue
2016/10/27 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
Python Queue模块详解
2014/11/30 Python
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python3学习之Splash的安装与实例教程
2018/07/09 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
python实现事件驱动
2018/11/21 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
大学活动邀请函
2014/01/28 职场文书
安全教育演讲稿
2014/05/09 职场文书
消防安全宣传标语
2014/06/07 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
同事去世追悼词
2015/06/23 职场文书
公司庆典主持词
2015/07/04 职场文书