// 个人比较喜欢在代码格式下写东西,看起来清晰。 PHP SPL: Standard PHP Library。 SPL 大致包括 5 个方面: iterator, array overloading, XML, exception, file and data handling // 如果要看下 SPL 的具体情况可以通过: ReflectionExtension::export( 'SPL'); /** * iterator */ iterator: 可以使用 foreach 来遍历对象 // Interface interface Traversable{} 这个接口并不是真正的接口,应为只有内部的类可以继承他(那些用 C 写的) SimpleXMLElement 和 PDOStatement 都实现了 Traversable ----- interface Iterator{ function rewind(); function valid(); function key(); function current(); function next(); } ---- interface IteratorAggregate{ function getIterator() } 只需实现一个方法就可以用 looping structure 作用于对象,而不必要实现 Iterator 的 5 个方法 ---- interface OuterIterator{ function getInnerIterator() } ---- interface RecursiveIterator{ function hasChildren(); function getChildren(); } ---- // iterators: 一些是实例化后可以 foreach() 的类 ArrayIterator $arr_1 = array(1, 'myhere', 'ubuntu', FALSE, 'i like php'); $it_1 = new ArrayIterator( $arr_1); foreach( $it_1 as $v){ echo "$v/n"; } ---- LimitIterator $limit_it = new LimitIterator( $it_1, 2,3); ---- AppendIterator $arr_2 = array( 'how r u?', 'who am i?', 'spider-man', 'PHP'); $it_2 = new ArrayIterator( $arr_2); $append_it = new AppendIterator(); $append_it->append( $it_1); $append_it->append( $it_2); ---- FilterIterator 这个类是 abstract 的,有个 abstract function accept(); class MyFilterIterator extends FilterIterator{ function __construct( Iterator $it) { parent::__construct( $it); } function accept() { return( $this->current() > 3); } } ---- RegxpIterator 和 FilterIterator 一样,也是 abstract function accept() function __construct( $iterator, $regxp, $op_mode=0, $spl_flages=0, $preg_flages=0) ---- IteratorIterator 书上是这样说的: The IteratorIterator is a nonspecific iterator type of iterator, which means that anything that implements Traversable can be iterated. PDO 的 PDOStatement,只是实现了 Traversable,没有实现 Iterator 和 IteratorAggregate, 应为他是只读的;因此,一些其他的具有修改性的 iterators(AppendIterator, FilterIterator, LimitIterator) 不能作用于 PDOStatement。 我们可以用 IteratorIterator warp the PDOStatement。 $it = new IteratorIterator( $pdoStatement); $limit_it = new LimitIterator( $it, 2, 4) ---- RecursiveArrayIterator ---- RecursiveIteratorIterator 可以将树形结构变化为一维的结构 ---- 还有一些其他的 built-in 的 iterator 和 non-built-in 的类。 这些 non-built-in 的类可以在 php 源码中的 /ext/spl/examples 目录下找到 -------- // 几个 iterator 辅助函数 iterator_to_array(); iterator_count(); iterator_apply() /** * array overloading */ ArrayAccess: 可以像使用数组一样使用对象 // Intrerface interface ArrayAccess{ function offsetExists( $key); function offsetGet( $key); function offsetSet( $key, $value); function offsetUnset( $key); } ---- ArrayObject class ArrayObject implements IteratorAggregate, Traversable, ArrayAccess, Countable{} $o_collection = new ArrayObject(); $o[] = new School(); $o['people'] = new Myhere(); $o['name'] = 'i don't know'; /** * file and data handling */ 几个类 ---- 文件相关 class SplFileInfo{ // ... } class SplFileObject extends SplFileInfo implements RecursiveIterator, Traversable, Iterator, SeekableIterator{ // ... } ---- 目录相关 class DirectoryIterator extends SplFileInfo implements Iterator, Traversable{ // ... } class RecursiveDirectoryIterator extends DirectoryIterator implements Traversable, Iterator, RecursiveIterator{ // ... }