关于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文件
Jan 04 PHP
mysql中存储过程、函数的一些问题
Feb 14 PHP
浅谈php扩展imagick
Jun 02 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 PHP
CI框架Session.php源码分析
Nov 03 PHP
10个超级有用的PHP代码片段果断收藏
Sep 23 PHP
PHP页面间传递值和保持值的方法
Aug 24 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
Sep 11 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
thinkPHP框架实现的简单计算器示例
Dec 07 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 PHP
PHP的new static和new self的区别与使用
Nov 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下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
php ci框架验证码实例分析
2013/06/26 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
PHP笛卡尔积实现算法示例
2018/07/30 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
javascript parseInt与Number函数的区别
2010/01/21 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
2016/11/22 Javascript
jquery插入兄弟节点的操作方法
2016/12/07 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
Python实现统计单词出现的个数
2015/05/28 Python
Python模拟用户登录验证
2017/09/11 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
2014年领导班子专项整治整改方案
2014/09/28 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python