关于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下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
php随机输出名人名言的代码
Oct 07 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
Dec 16 PHP
基于PHP 面向对象之成员方法详解
May 04 PHP
PHP常用正则表达式集锦
Aug 17 PHP
PHP获取QQ达人QQ信息的方法
Mar 05 PHP
实例讲解PHP设计模式编程中的简单工厂模式
Feb 29 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
php实现的顺序线性表示例
May 04 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
php实现网页上一页下一页翻页过程详解
Jun 28 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 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 文章采集正则代码
2009/12/28 PHP
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
PHP制作万年历
2015/01/07 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
javascript省市级联功能实现方法实例详解
2015/10/20 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
微信小程序倒计时功能实例代码
2018/07/17 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
进一步理解Python中的函数编程
2015/04/13 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
Python异常处理操作实例详解
2018/08/28 Python
python数据归一化及三种方法详解
2019/08/06 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
网吧七夕活动策划方案
2014/08/31 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
优秀大学生自荐信
2015/03/26 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书