0

0

对php接口使用问题的一些总结

伊谢尔伦

伊谢尔伦

发布时间:2017-07-03 10:40:55

|

1977人浏览过

|

来源于php中文网

原创

php的接口自始至终一直在被争议,有人说接口很好,有人说接口像鸡肋。首先要明白,好喝不好的判断标准是什么。无疑,这是和java/c++相比。在上面的例子中,以及讨论了php的接口在“面向契约编程”中是不足的,并没有起到应有的作用。

其实,machine类的声明应该在plain类前面。接口提供了一套规范,这是系统提供的,然后machine类提供一组针对接口的API并实现,最后才是自定义的类。在Java里,接口之所以盛行(多线程的runable接口,容器的collection接口等)就是因为系统为我们做了前面两部分的工作,而程序员,只需要去写具体的实现类,就能保证接口可用可控。

为什么要用接口?接口到底有什么好处?接口本身并不提供实现,只是提供一个规范。如果我们知道一个类实现了某个接口,那么就知道了可以调用该接口的那些方法,我们只需要知道这些就够了。

PHP中,接口的语义是有限的,使用接口的地方并不多,PHP中接口可以淡化为设计文档,起到一个团队基本契约的作用,代码如下所示:


由于PHP是弱类型,且强调灵活,所并不推荐大规模使用接口,而是仅在部分“内核”代码中使用接口,因为PHP中的接口已经失去很多接口应该具有的语义。从语义上考虑,可以更多地使用抽象类。至于抽象类和接口的比较,不再赘述。

立即学习PHP免费学习笔记(深入)”;

另外,PHP5对面向对象的特种做了许多增强,其中就有一个SPL(标注PHP库)的尝试,SPL中实现一些接口,其中最主要的就是iterator迭代器接口,通过实现这个接口,就能使对象能用于foreach结构,从而在使用形式上比较统一。比如SPL中一个DirectoryIterator类,这个类在集成SplFileInfo类的同时,实现Iterator、Traversable、SeekableIterator这三个接口,那么这个类的实例可以获得父类SplFileInfo的全部功能外,还能够实现Iterator接口所展示的那些操作。

Iterator接口的原型如下:

* current()
    This methodreturns the current index's value. You are solely responsible for tracking what thecurrent index is as the interface does not do this for you.

*key()
    This method returns the value of the current index's key. For foreach loops this is extremely important so that the key value can be populated.
    
*next()
    This method moves the internal index forward one entry.
    
*rewind()
    This method should reset the internal index to the first element.

*valid()
    This method should return true or false if there is a current element. It is called after rewind() or next().

如果一个类声明了实现Iterator,就必须实现这五个方法,如果实现了这五个方法,那么就可以很容易对这个类的实例进行迭代。这里,DirectoryIterator类之所以拿来就能用,是因为系统已经实现了Iterator接口,所以可以像下面这样使用:

isDir())
    {
        echo $fileInfo->getFilename(),"\t",$fileInfo->getSize(),PHP_EOL;
    }
}

可以想象,如果不用DirectoryIterator类,而是自己实现,不但代码量增加了,而且循环时候的风格也不统一了。如果自己写的类也实现了Iterator接口,那么就可以像Iterator那样工作。

为什么一个类只要实现了Iterator迭代器,其对象就可以被用做foreach的对象呢?其实原因很简单,在对PHP实例对象使用foreach语法时,会检查这个实例有没有实现Iterator接口,如果实现了,就会通过内置方法或使用实现类中的方法模拟foreach语句,这是不是和前面提到的toString 方法的实现很像呢?事实上,toString方法就是接口的一种变相实现。接口就是这样,接口本身什么也不做,系统悄悄地在内部实现了接口的行为,所以只要实现这个接口,就可以使用接口提供的方法。这就是接口“即插即用”思想

魔法映像企业网站管理系统
魔法映像企业网站管理系统

技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作

下载

我们都知道,接口是多多重集成的一种变相实现,而在讲继承时,我们提到了用来实现混入(Minxin)式的Traits,实际上,traits可以被视为一种加强版的接口。

来看下面的代码:

sayHello();
$o->sayWorld();
$o->sayExclamationMark();

上面代码运行结果如下:

Hello Word!

这里的MyHelloWorld同时实现了两个traits,从而使其可以分别调用两个Traits里的代码段。从代码中就可以看出,Traits和接口很像,不同的是Traits是可以导入包含代码的接口。从某种意义上来说,Traits和接口都是对“多重集成”的一种变相实现。

总结关于接口的几个概念:

  • 接口作为一种规范和契约存在。作为规范,接口应该保证可用性;作为契约接口应该保证可控性、

  • 接口只是一个声明,一旦使用interface关键字,就应该实现它。可以由程序员实现(外部接口),也可以由系统实现(内部接口)。接口本身什么都不做,但是他可以高数我们它能做什么。

  • PHP中的接口存在两个不足,一时没有契约限制,二是缺少足够多的内部接口。

接口其实很简单,但是接口的各种应用很灵活,设计模式中也有很大一部分是围绕接口展开的。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

3

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

10

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

15

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

7

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

6

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号