关于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+MYSQL开发工具及资源收藏
Jan 02 PHP
php下通过POST还是GET来传值
Jun 05 PHP
php 计算两个时间戳相隔的时间的函数(小时)
Dec 18 PHP
10个实用的PHP代码片段
Sep 02 PHP
php类常量的使用详解
Jun 08 PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
Mar 08 PHP
php中的观察者模式简单实例
Jan 20 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
微信公众平台开发教程②微信端分享功能图文详解
Apr 10 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
Apr 22 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
多人战的战术与战略
2020/03/04 星际争霸
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
很实用的一个完整email发送程序
2006/10/09 PHP
19个超实用的PHP代码片段
2014/03/14 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
Vue2.0权限树组件实现代码
2017/08/29 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
js实现轮播图的完整代码
2020/10/26 Javascript
vue数据响应式原理知识点总结
2020/02/16 Javascript
python在控制台输出进度条的方法
2015/06/20 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
Python生成器以及应用实例解析
2018/02/08 Python
Python解析Excle文件中的数据方法
2018/10/23 Python
Python实现京东秒杀功能代码
2019/05/16 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
新媒传信软件测试面试题
2013/02/24 面试题
运动会通讯稿100字
2014/01/31 职场文书
给学校的建议书
2014/03/12 职场文书
先进人物事迹材料
2014/12/29 职场文书
小学班级口号大全
2015/12/25 职场文书
用Python实现Newton插值法
2021/04/17 Python
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python