关于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维护文件系统
Oct 09 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
php设计模式 FlyWeight (享元模式)
Jun 26 PHP
PHP include_path设置技巧分享
Jul 03 PHP
TMDPHP 模板引擎使用教程
Mar 13 PHP
smarty简单分页的实现方法
Oct 27 PHP
php实现读取内存顺序号
Mar 29 PHP
php正则preg_replace_callback函数用法实例
Jun 01 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 PHP
PHP 使用位运算实现四则运算的代码
Mar 09 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
PHP4之真OO
2006/10/09 PHP
PHP 手机归属地查询 api
2010/02/08 PHP
PHP防止跨域提交表单
2013/11/01 PHP
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
Python实现的Excel文件读写类
2015/07/30 Python
Python切片知识解析
2016/03/06 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
python中的闭包函数
2018/02/09 Python
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
python 字符串常用函数详解
2019/09/11 Python
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
终止劳动合同协议书
2014/04/14 职场文书
高三学生评语大全
2014/04/25 职场文书
代办委托书怎么写
2014/08/01 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
入伍通知书
2015/04/23 职场文书
活动简报范文
2015/07/22 职场文书
幼师必备:幼儿园期末教师评语50条
2019/11/01 职场文书