通过上篇文章呢,我们对于这个面向接口编程有了一个基本的认知,完事这次,我们主要是来简单延伸下我们的思维模式。
我们知道,PHP是弱类型语言,而且调用比较灵活,所以本人并不推荐大规模使用接口,可以在部分‘核心’代码中使用接口。
并且呢,因为PHP中的接口已经失去了很多接口本应该具有的语义,所以,从这方面考虑的话,我们可以在使用接口的地方,更多地使用抽象类。
另外呢,PHP5对面向对象的特性做了许多增强,其中就有一个SPL(标准PHP库),它所实现的一些接口中,最主要的就是iterator迭代器接口,通过这个接口,我们就可以使对象用于foreach结构,从而在使用形式上,比较统一,网上有一句话是个例子,但是我没看太懂,如:SPL中有一个directoryiterator类,这个类在继承splfileinfo类的同时,会实现iterator,traversable,seekableitor这三个接口,那么这个类的实例可以获得父类splfileinfo的全部功能外,还能够实现iterator接口所展示的那些操作。大概就是这句话了,反正是一脸蒙逼,那几个类具体是什么我不太清楚,但是它们的关系,我就理解了,换成我们熟悉的就好了。
来看下iterator接口的原型:
如果一个类,声明了实现iterator接口,那么它主要就是实现上述的几个方法,这是必须的啊。
如果实现了上述的几个方法,我们就可以很容易的对这个类的实例进行迭代,那个directoryiterator类,之所以可以拿来就用,就是因为系统已经实现了iterator这个接口。
我们先来看下DirectoryIterator类的一个简单的使用小案例:
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $key => $value) {
if(!$value->isDir()){
echo $value->getFilename().PHP_EOL;
echo $value->getSize().PHP_EOL;
}
}
die;
通过上述代码,我们可以看到,不使用DirectoryIterator类的话,我们也可以做到相同的事情,但是代码量肯定要增加,完事循环时候的风格也不统一了。
然而,我们如果写自己的类实现了iterator接口,那么我们就可以像使用DirectoryIterator类那样,来进行操作了。
到这里我们就会疑问了,为什么一个类只要实现了iterator接口,其对象就可以像上述代码似的,可以使用统一风格的foreach循环???
原因其实很简单,在对PHP实例对象使用foreach语法时,系统会检测这个实例有没有实现iterator接口,如果实现了,就会通过内置方法或者使用实现类中的方法模拟foreach语句。实际上,魔术方法tostrin就是接口的一种变相实现。
接口呢,它就是这样,它本身什么也不做,系统在内部悄悄地实现了接口的行为,所以,只要实现了这个接口,就可以使用接口提供的方法,这就是‘即插即用’的思想。
我们都知道,接口是对多重继承的一种变相实现,而在了解继承这个东西的时候,我们了解过一个用来实现混入式的traits,实际上这个traits也可以看做是一种加强型的接口。
来看段代码感受下traits的用法:
trait Lu{
public function name_lu()
{
echo 'lu ';
}
}
trait Ya{
public function name_ya()
{
echo 'ya ';
}
}
trait Ran{
public function name_ran()
{
echo 'ran ';
}
}
class MyLove{
use Lu,Ya,Ran;
public function say_my_love()
{
echo 'is my lover.';
}
}
$obj = new MyLove();
$obj->name_lu();
$obj->name_ya();
$obj->name_ran();
$obj->say_my_love();
die;
上述代码中的MyLove同时实现了三个traits,从而使其可以分别从多个traits中调用不同的代码段,我们可以看出,和接口很相像,不过不相同的就是traits可以导入包含代码的接口,我们从某种意义上可以把traits和接口都看做是对多重继承的一种便想实现。
本文最末呢,咱们来总结下有关于接口的几个概念:
- 接口它作为一种规范和契约来存在,它作为规范,接口应该保证可用性,作为契约呢,接口也同样应该保证可控性
- 接口,它只是一个声明,一旦使用interface关键字,就应该实现它,可以由程序人员实现(外部),也可以由系统内部实现,而它本身,什么都不需要做,但是它会告诉我们,它能做什么
- PHP中的接口有两个不足,一是没有契约限制,二是缺少足够多的内部接口
总的来说呢,接口很简单 ,但是接口的各种应用又很灵活,在我们比较熟悉的设计模式中,也有很大一部分是围绕接口来展开的,咱这里就不废话了。
好啦,本次记录就到这里了。
如果感觉不错的话,请多多点赞支持哦。。。