接口:

  • 接口这样描述自己:对于实现我的所有类,看起来都应该像我现在这个样子
  • 接口含义:采用一个特定接口的所有代码都知道对于那个接口会调用什么方法。
interface mobile{
public function run(); //驱动方法
}
class plain implements mobile{
public function run(){
echo "我是飞机";
} public function fly()
{
echo "飞行";
}
}
class car implements mobile{
public function run(){
echo "我是汽车\r\n";
}
}
class machine{
function demo(mobile $a){
$a->fly(); //mobile接口是没有这个方法的
}
}
$obj = new machine();
$obj -> demo(new plain()); //运行成功
$obj -> demo(new car()); //运行失败
  • 接口本身并不提供实现,只是提供一个规范。如果我们知道一个类实现了某个接口,那么就知道了可以调用该接口的哪些方法,我们只需要知道这些就够了。
  • PHP中,接口的语义是有限的,使用接口的地方并不多,PHP中接口可以淡化为设计文档,起到一个团队基本契约的作用
interface cache{
// @describe:缓存管理,项目经理定义接口,技术人员负责实现
const maxKey = 100000; //最大缓存量
public function getc($key); //获取缓存
public function setc($key,$value);//设置缓存
public function flush(); //清空缓存
}
  • PHP5对面向对象的特性做了许多增强,其中就有一个SPL(标准PHP库)的尝试。SPL中实现一些接口,其中最主要的就是Iterator迭代器接口,通过实现这个接口,就能使对象能够用于foreach结构,从而在使用形式上比较统一
  • DirectoryIterator类之所以拿来就能用,是因为系统已经实现了Iterator接口,所以可以像下面这样使用
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDir()) {
echo $fileinfo->getFilename(),"\t",$fileinfo->getSize(),PHP_EOL;
}
}
  • 在对PHP实例对象使用foreach语法时,会检查这个实例有没有实现Iterator接口,如果实现了,就会通过内置方法或使用实现类中的方法模拟foreach语句
  • 接口是对多重继承的一种变相实现,而在讲继承时,我们提到了用来实现混入(Mixin)式的Traits,实际上,Traits可以被视为一种加强型的接口。
trait Hello{
public function sayHello(){
echo 'Hello ';
}
}
trait World{
public function sayWord(){
echo 'World';
}
}
class MyHelloWorld{
use Hello,World;
public function sayExclamationMark(){
echo '!';
}
} $o = new MyHelloWorld();
$o -> sayHello();
$o -> sayWord();
$o -> sayExclamationMark();
  • 这里的MyHelloWorld同时实现了两个Traits,从而使其可以分别调用两个Traits里的代码段。从代码中就可以看出,Traits和接口很像,不同的是Traits是可以导入包含代码的接口。从某种意义上来说,Traits和接口都是对“多重继承”的一种变相实现

总结:

  • 接口作为一种规范和契约存在。作为规范,接口应该保证可用性;作为契约,接口应该保证可控性。
  • 接口只是一个声明,一旦使用interface关键字,就应该实现它。可以由程序员实现(外部接口),也可以由系统实现(内部接口)。接口本身什么都不做,但是它可以告诉我们它能做什么。
  • PHP中的接口存在两个不足,一是没有契约限制,二是缺少足够多的内部接口。
  • 接口其实很简单,但是接口的各种应用很灵活,设计模式中也有很大一部分是围绕接口展开的。

参考资料

  • [PHP核心技术与最佳实践]

最新文章

  1. 【大数据】Linux下安装Hadoop(2.7.1)详解及WordCount运行
  2. PHP的数据类型总结
  3. 语言基础:C#输入输出与数据类型及其转换
  4. 封装curl类,post get方法实现网站请求
  5. hdu1272并查集入门
  6. 高级特性(8)- JavaBean构件
  7. 无法打开物理文件mdf,操作系统错误 5:"5(拒绝訪问。)"
  8. CHM木马
  9. 判断网站URL是否正常访问脚本
  10. Deming管理系列(2)——怎样开发度量能力
  11. 理解Vue中的Render渲染函数
  12. 一个大四毕业生想对自学Android的大学生说一些话
  13. 查看oracle表空间
  14. Ganglia 调试技巧
  15. 文件属性和ls -lhi
  16. 第一册:lesson seventy one.
  17. vuejs2.0实现分页组件,使用$emit进行事件监听数据传递
  18. 2018年6月,最新php工程师面试总结
  19. 移动端根据不同DPR加载大小不同的图片
  20. 【repost】前端学习总结(二十三)——前端框架天下三分:Angular React 和 Vue的比较

热门文章

  1. [JSOI2008]火星人
  2. 《网络安全编程基础》之Socket编程
  3. 在centos7上搭建博客之小白教程~
  4. 机器学习中的特征缩放(feature scaling)
  5. scp 指定端口(转)
  6. 手把手教你写基于C++ Winsock的图片下载的网络爬虫
  7. package.json常用的字段
  8. 关闭生产订单时报错“订单&的未处理将来更改记录组织删除标记/完成”,消息号CO688
  9. Linux磁盘与文件系统管理(二)
  10. day 88 Vue学习之八geetest滑动验证