关于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 相关文章推荐
header()函数使用说明
Nov 23 PHP
php数据库密码的找回的步骤
Jan 12 PHP
php中如何防止表单的重复提交
Aug 02 PHP
ThinkPHP控制器间实现相互调用的方法
Oct 31 PHP
封装ThinkPHP的一个文件上传方法实例
Oct 31 PHP
php获取指定日期之间的各个周和月的起止时间
Nov 24 PHP
php通过array_merge()函数合并两个数组的方法
Mar 18 PHP
Yii扩展组件编写方法实例分析
Jun 29 PHP
php中照片旋转 (orientation) 问题的正确处理
Feb 16 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
php中字符串和整数比较的操作方法
Jun 06 PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 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
yii框架源码分析之创建controller代码
2011/06/28 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
详解VueJS应用中管理用户权限
2018/02/02 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
Python魔术方法详解
2015/02/14 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
Python的迭代器和生成器
2015/07/29 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
mac下如何将python2.7改为python3
2018/07/13 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
农民工工资承诺书范文
2014/03/31 职场文书
车辆挂靠协议书
2016/03/23 职场文书
Python编程根据字典列表相同键的值进行合并
2021/10/05 Python
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技