1.SPL 是什么?
SPL:standard php library php标准库,此 从php5.0起开始内置的组件和接口,在5.3以后逐渐成熟。因为内置在php5开发环境中,无需任何配置。
根据官方定义,“a collection of interfaces and classes that are meant to solve standard problems.”
然而在目前的使用者,spl更多地被看做是一种使object模仿的array行为的interfaces和classes。
SPL对PHP引擎进行了扩展,例如ArrayAccess、Countable和SeekableIterator等接口,它们用于以数组形式操作对象。同时还可以使用RecursiveIterator,ArrayObjects等其他迭代器进行数组的迭代操作。
他还内置了几个对象,例如Exceptions,SplObserver,spltorage以及splautoloadregister,splclasses,iteratorapply等的帮助函数,用于重载对应的功能。
2.Iterator
spl的核心概念是Iterator,这指一种设计模式(Design Pattern),"provide an object which traverses some aggregate structure,abstracting away assumptions about the implementation of that structure."
通俗的说,Iterator能够使许多不同的数据结构,都能有统一的操作界面,比如一个数据库的结果集、同一目录的文件集或者一个文本中每一行构成的集合。
SPL规定,所有部署了Iterator界面的class,都可以用在foreach loop中。Iterator界面包含以下必须部署的五个方法:
current()
This method returns the current index's value. You are solely
responsible for tracking what the current 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().
offsetExists($offset)
This method is used to tell php if there is a value
for the key specified by offset. It should return
true or false.
offsetGet($offset)
This method is used to return the value specified
by the key offset.
offsetSet($offset, $value)
This method is used to set a value within the object,
you can throw an exception from this function for a
read-only collection.
offsetUnset($offset)
This method is used when a value is removed from
an array either through unset() or assigning the key
a value of null. In the case of numerical arrays, this
offset should not be deleted and the array should
not be reindexed unless that is specifically the
behavior you want.
IteratorAggregate界面
RecursiveIterator界面
这个界面用于遍历多层数据,继承了Iterator界面,因而也具有标准的current()/key()/next()和valid()方法。同时它自己还规定了getChildren()和hasChildren()方法。
SeekableIterator界面
SeekableIterator界面也是Iterator界面的延伸,除了Iterator的五个方法以外,还规定了seek()方法,参数是元素的位置,返回该元素。若该位置不存在,则抛出OutOfBoundsException。
Countable界面
这个界面规定了一个count()方法,返回结果集的数量
3.SPL Classes
spl内置类
查看所有内置类
foreach(spl_classes() as $key=>$val){
echo $key."=>".$val.'';
}
DirectoryIterator类
这个类用来查看一个目录中所有文件和子目录
foreach(new DirectoryIterator('./') as $Item)
{
echo $Item.'';
}
catch(Exception $e)
{
echo 'No files Found!';
}