关于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 相关文章推荐
我的论坛源代码(三)
Oct 09 PHP
php 购物车实例(申精)
May 11 PHP
php for 循环语句使用方法详细说明
May 09 PHP
php开发文档 会员收费1期
Aug 14 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
PHP中的session安全吗?
Jan 22 PHP
win7安装php框架Yii的方法
Jan 25 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
PHP生成随机数的方法总结
Mar 01 PHP
PHP 二维array转换json的实例讲解
Aug 21 PHP
PHP面向对象类型约束用法分析
Jun 12 PHP
PHP反射基础知识回顾
Sep 10 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
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
Joomla开启SEF的方法
2016/05/04 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
Position属性之relative用法
2015/12/14 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
python中关于for循环的碎碎念
2017/06/30 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
python制作简单五子棋游戏
2019/06/18 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
销售人员自我评价
2014/02/01 职场文书
护士岗位职责
2014/02/16 职场文书
行政助理的岗位职责
2014/02/18 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
离婚协议书的范本
2015/01/27 职场文书
春季运动会开幕词
2015/01/28 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
redis复制有可能碰到的问题汇总
2022/04/03 Redis
python数字图像处理之图像的批量处理
2022/06/28 Python