关于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 相关文章推荐
VML绘图板②脚本--VMLgraph.js、XMLtool.js
Oct 09 PHP
PHP 中dirname(_file_)讲解
Mar 18 PHP
shopex中集成的站长统计功能的代码简单分析
Aug 11 PHP
PHP中4个加速、缓存扩展的区别和选用建议
Mar 12 PHP
php中eval函数的危害与正确禁用方法
Jun 30 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
PHP实现CSV文件的导入和导出类
Mar 24 PHP
php实现读取和写入tab分割的文件
Jun 01 PHP
PHP整合PayPal支付
Jun 11 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
实例介绍PHP中zip_open()函数用法
Feb 15 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 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
thinkphp如何获取客户端IP
2015/11/03 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
jquery api参考 visualjquery 中国线路 速度快
2007/11/30 Javascript
div层的移动及性能优化
2010/11/16 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
详解Python中的Lock和Rlock
2021/01/26 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
总经理秘书的岗位职责
2013/12/27 职场文书
优秀民警事迹材料
2014/01/29 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
大学生党员个人总结
2015/02/13 职场文书
python中24小时制转换为12小时制的方法
2021/06/18 Python