关于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 相关文章推荐
mysql 搜索之简单应用
Apr 27 PHP
用PHP查询搜索引擎排名位置的代码
Jan 05 PHP
php表单提交问题的解决方法
Apr 12 PHP
探讨php中防止SQL注入最好的方法是什么
Jun 10 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
php的dl函数用法实例
Nov 06 PHP
php计划任务之ignore_user_abort函数实现方法
Jan 08 PHP
php实现的一个简单json rpc框架实例
Mar 30 PHP
CodeIgniter删除和设置Cookie的方法
Apr 07 PHP
php判断表是否存在的方法
Jun 18 PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 PHP
PHP单元测试配置与使用方法详解
Dec 27 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获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python代码的打包与发布详解
2014/07/30 Python
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
Python自动连接ssh的方法
2015/03/07 Python
python实现12306火车票查询器
2017/04/20 Python
详解python算法之冒泡排序
2019/03/05 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
python 异步async库的使用说明
2020/05/04 Python
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
简述DNS进行域名解析的过程
2013/12/02 面试题
大学生毕业的自我评价分享
2014/01/02 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
英文升职感谢信
2015/01/23 职场文书
诚信教育主题班会
2015/08/13 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python