PHP接口的思考

其中就有一个SPL(标准PHP库)的尝试,SPL中实现一些接口,其中最主要的就是Iterator迭代器接口,通过实现这个接口,就能使对象能够用于foreach结构,从而在使用形式上比较统一.比如SPL中有一个DirectoryIterator类,这个类在继承SplFileInfo类的同时,实现Iterator,Traversable,SeekableIterator这三个接口,那么这个类的实例可以获得父类SplFileInfo的全部功能外,还能够实现Iterator接口所展示的那么操作.

 
Directory类之所以拿来就能用,是因为系统已经实现了Iterator接口,所以可以像下面这样使用:
$dir = new DirectoryIterator(dirname(__FILE__));
foreach($dir as $fileinfo)
{
    if(!$fileinfo->isDir())
    {
        echo $fileinfo->getFilename(),"	",$fileinfo->getSize(),PHP_EOL;
    }
}
可以想像,如果不用DirectoryIterator类,而是自己实现,不但代码量增加了,而且循环的时候风格也不统一了.如果自己写的类也实现了Iterator接口,那么就可以像Iterator那样工作.
为什么一个类只要实现了Iterator迭代器,其对象就可以被用作foreach的对象呢?其实原因很简单,在对PHP实例对象使用foreach语法时,会检查这个实例有没有实现Iterator接口,如果实现了,就会通过内置方法或使用实现类中的方法模拟foreach语句.这和__toString方法实现很像, 事实上,__toString方法就是接口的一种变相实现
原文地址:https://www.cnblogs.com/chenqionghe/p/4735735.html