PHP 標準函式庫（Standard PHP Library，縮寫：SPL），是 PHP5.0 之後新添加的重要函式庫。它提供了一系列的介面（interface）和類別（classes）解決網站開發中普遍碰到的問題。原始碼在 ext/spl 目錄下。



介紹

SPL 主要提供了以下幾個方面的內容：


* iterator：迭代器，這是 SPL 中最重要的內容。它提供了一系列的介面和內建迭代器類別。

* exception：異常類別，它聲明一了組和 C++ 標準的異常類別。

* Observer：觀察者模式，觀察者模式在 MVC 中經常用到。

* 以及一些單體函式。



SPL 主要的類別



主要介面


* ArrayAccess：其功能是使類別可以像 PHP 中的陣列一樣操作。有點類似於.NET 平台的 index 操作。

* Traversable：是 Zend 引擎的內建介面，它是能讓類別用於 foreach 語句的介面，但是在 PHP 中並不能直接實現 Traversable。只能間接地通過 Iterator 或 IteratorAggregate 介面實現。

* IteratorAggregate（繼承 Traversable，是他的兒子）是除 Iterator 之外另一個從 Traversable 介面中繼承而來的。其介面也很簡單，只有一個函式。就是返回一個迭代器實例。

* Iterator（也是繼承 Traversable，是他的兒子），SPL 中大部分介面和類別都是從這個介面繼承而來的。

* RecursiveIterator（繼承 Iterator，為 Traversable 的孫子），遞迴迭代器，通過 hasChildre () 和 getChildren () 兩個函式實現遞迴遍歷子元素。

* Countable：這介面就一個 count () 函式，返回結果集的數量。實現這個介面的類別可以用 count () 函式查詢其結果集。

* Serializable：該介面實現序列化和反序列化的介面。在沒有 SPL 之前，可以通過 \_\_sleep () 和 \_\_wakeup () 實現相同的功能，若同時實現了 Serializable 介面和 \_sleep () 和 \_\_wakeup ()，則只有 Serializable 介面的函式啟作用。

* OuterIterator：它的實現者可以包含一個或多個迭代器成員，即可以通過 getInnerIterator () 介面函式取得內部的迭代器，也可以直接通過類別本身實現的 Iterator 介面遍歷內部的迭代器資料。這在 SPL 是一個非常重要的介面，SPL 中很多內建的迭代器實現了這個介面。

* SplObserver：觀察者模式的中的觀察者介面。

* SplSubject：觀察者模式的中的發布者介面。



主要類別


* DirectoryIterator：這個類別用來檢視一個目錄中的所有檔案和子目錄。

* FilterIterator：這是一個抽象類別，它實現了 OuterIterator 介面。它包裝一個已有的迭代器類別，通過抽象方法 accept () 過濾掉不需要的內容，形成一個新的迭代器。

* LimitIterator：這也是一個實現 OuterIterator 的類別。它有點類似於 SQL 中的 LIMIT 語句。它通過包裝一個已有迭代器，然後截取其中某一段資料形成一個新的迭代器。

* RecursiveDirectoryIterator：遞迴檢視一個目錄中的所有檔案的子目錄。

* SimpleXMLIterator：一個遍歷 XML 內容的類別

* IteratorIterator：實現對迭代器的包裝，這也是 SPL 中對 OuterIterator 預設實現。

* InfiniteIterator：從字面意思就知道，這是個無限迴圈的迭代器，當 next () 到達最後時，會自動呼叫 rewind () 函式，又從頭開始。

* AppendIterator：它實現了對一系統迭代器的包裝，並且可以在執行過程中添加新的迭代器。

* SplFileInfo：取得檔案資訊類別。SplFileObject 從該類別繼承。

* SplFileObject：檔案操作類別，可以按行的方式遍歷檔案內容。同時還能取得檔案的大小及其它詳細資訊。



異常類別


* Exception：異常基礎類別
  
* LogicException：邏輯錯誤異常類別。
    
* BadFunctionCallException：不合法的函式被呼叫產生的異常類別。
    
* BadMethodCallException：不合法的方法被呼叫產生的異常類別。
    
* DomainException：表示一個值不在有效範圍內的異常。
    
* InvalidArgumentException：表示傳遞了無效的參數產生的異常。
    
* LengthException：表示一個參數超過了許可的長度的異常。
    
* OutOfRangeException：表示請求檢索超越了陣列等容器最大長度的異常。
  
* RuntimeException：執行時錯誤異常類別。
    
* OutOfBoundsException：表示請求檢索超越了陣列等容器最大長度的異常。
    
* OverflowException：表示演算法 / 緩衝區溢位異常。
    
* RangeException：執行期間的範圍異常。
    
* UnderflowException：執行期間的演算法 / 快取的向下溢位異常。



一此其它函式


* iterator\_apply：為迭代器中每個元素呼叫一個使用者自訂函式

* iterator\_count：計算迭代器中元素的個數

* iterator\_to\_array：將迭代器中的元素拷貝到陣列

* spl\_autoload\_call：嘗試呼叫所有已註冊的 \_\_autoload () 函式來裝載請求類別

* spl\_autoload\_extensions：註冊並返回 spl\_autoload 函式使用的預設副檔名。

* spl\_autoload\_functions：返回所有已註冊的 \_\_autoload () 函式。

* spl\_autoload\_register：註冊 \_\_autoload () 函式

* spl\_autoload\_unregister：註銷已註冊的 \_\_autoload () 函式

* spl\_autoload \_\_autoload ()：函式的預設實現

* spl\_classes：返回所有可用的 SPL 類別



6.0 中新增的資料結構


* SplDoublyLinkedList

* SplStack

* SplQueue

* SplHeap

* SplMaxHeap

* SplMinHeap

* SplPriorityQueue

* SplFixedArray 這是個固定大小的陣列，效能比系統內建的 array () 要快些。

* SplObjectStorage



參考



外部連結


* http://www.php.net/~helly/php/ext/spl/（頁面存檔備份，存於網際網路檔案館）

* http://www.caixw.com/archives/intro-to-spl-iterator.html（頁面存檔備份，存於網際網路檔案館）